diff --git a/backend/__pycache__/app.cpython-310.pyc b/backend/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000..7ce4dda Binary files /dev/null and b/backend/__pycache__/app.cpython-310.pyc differ diff --git a/backend/__pycache__/database.cpython-310.pyc b/backend/__pycache__/database.cpython-310.pyc new file mode 100644 index 0000000..f6cf2c9 Binary files /dev/null and b/backend/__pycache__/database.cpython-310.pyc differ diff --git a/backend/__pycache__/main.cpython-310.pyc b/backend/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000..952271e Binary files /dev/null and b/backend/__pycache__/main.cpython-310.pyc differ diff --git a/backend/__pycache__/models.cpython-310.pyc b/backend/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000..11923e3 Binary files /dev/null and b/backend/__pycache__/models.cpython-310.pyc differ diff --git a/backend/app.py b/backend/app.py new file mode 100644 index 0000000..6b32349 --- /dev/null +++ b/backend/app.py @@ -0,0 +1,24 @@ +from flask import Flask, request, jsonify + +app = Flask(__name__) + +# This will store our integer value +current_value = 0 + +@app.route('/set_value', methods=['POST']) +def set_value(): + global current_value + value = request.json.get('value') + + if isinstance(value, int): + current_value = value + return jsonify({"message": "Value set successfully"}), 200 + else: + return jsonify({"error": "Invalid input, please send an integer"}), 400 + +@app.route('/get_value', methods=['GET']) +def get_value(): + return jsonify({"value": current_value}) + +if __name__ == '__main__': + app.run(debug=True,host='0.0.0.0') diff --git a/backend/instance/points.db b/backend/instance/points.db new file mode 100644 index 0000000..5399e28 Binary files /dev/null and b/backend/instance/points.db differ diff --git a/backend/main.py b/backend/main.py index f8ae347..d63c2ab 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,30 +1,33 @@ from fastapi import FastAPI, HTTPException, Depends -from typing import Annotated, List +from typing import List from sqlalchemy.orm import Session from pydantic import BaseModel from database import SessionLocal, engine -import uvicorn import models from fastapi.middleware.cors import CORSMiddleware app = FastAPI() origins = [ - 'http://localhost:3000' + "http://localhost:3000", # Add your React Native app's origin + "exp://127.0.0.1:19000", # Expo Go development client + "exp://localhost:19000", # Expo Go development client + "exp://10.13.182.154:8081", # Replace with your Expo Go app's ID ] + app.add_middleware( CORSMiddleware, - allow_origins = origins, - allow_credentials = True, + allow_origins=origins, + allow_credentials=True, allow_methods=['*'], allow_headers=['*'] ) class PointsBase(BaseModel): - name:str - UCID:str - hashed_password:str + name: str + UCID: str + hashed_password: str points: int class PointsModel(PointsBase): @@ -33,7 +36,6 @@ class PointsModel(PointsBase): class Config: from_attributes = True - def get_db(): db = SessionLocal() try: @@ -41,26 +43,32 @@ def get_db(): finally: db.close() +db_dependency = Depends(get_db) -db_dependency = Annotated[Session, Depends(get_db)] models.Base.metadata.create_all(bind=engine) -@app.get("/") -def read_root(): - return {"message": "Hello, FastAPI!"} +def sqlalchemy_model_to_dict(model): + return {column.name: getattr(model, column.name) for column in model.__table__.columns} @app.post("/points/", response_model=PointsModel) -async def create_point(point: PointsBase, db: db_dependency): - db_point = models.Points(**point.model_dump()) +async def create_point(point: PointsBase, db: Session = db_dependency): + point_dict = point.dict() + db_point = models.Points(**point_dict) db.add(db_point) db.commit() db.refresh(db_point) - return db_point + # Convert the SQLAlchemy model instance to a dictionary + db_point_dict = sqlalchemy_model_to_dict(db_point) + return db_point_dict + +@app.get("/points/by-min-score/", response_model=List[PointsModel]) +async def read_points_by_min_score(db: Session = db_dependency, min_score: int = 0): + points = db.query(models.Points).filter(models.Points.points >= min_score).all() + return [sqlalchemy_model_to_dict(point) for point in points] + +@app.get("/points/top-ten/", response_model=List[PointsModel]) +async def read_top_ten_points(db: Session = db_dependency): + top_points = db.query(models.Points).order_by(models.Points.points.desc()).limit(10).all() + return [sqlalchemy_model_to_dict(point) for point in top_points] -@app.get("/points/",response_model=List[PointsModel]) -async def read_points(db: db_dependency, skip: int = 0, limit: int = 100): - points = db.query(models.Points).offset(skip).limit(limit).all() - return points -#When you run with uvicorn main:app --reload -#Make sure to append /docs to url to get that nice screen to see all the stuff \ No newline at end of file diff --git a/backend/points.db b/backend/points.db index 3e072b7..d98b22e 100644 Binary files a/backend/points.db and b/backend/points.db differ diff --git a/frontend/ecoscan/App.js b/frontend/ecoscan/App.js index 6fa3bba..a934800 100644 --- a/frontend/ecoscan/App.js +++ b/frontend/ecoscan/App.js @@ -3,47 +3,9 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import { NavigationContainer,DarkTheme} from "@react-navigation/native"; import Tabs from './src/navigation/tabs'; import Login from './src/screens/LoginPage'; -import api from './api' const App = () => { - const [points,setPoints] = useState([]); - const [formData,setFormData] = useState({ - name: '', - UCID: '', - hashed_password: '', - points: 0 - }); - - const fetchPoints = async () => { - const response = await api.get('/points/'); - setPoints(response.data) - }; - - useEffect(() => { - fetchPoints(); - }, []); - - const handleInputChange = (event) => { - const value = event.target.type === 'checkbox' ? event.target.checked : event.target.value; - setFormData({ - ...formData, - [event.target.name] : value, - }); - }; - - const handleFormSubmit = async (event) => { - event.preventDefault(); //makes us only control submitting the form - await api.post('/points/',formData); - fetchPoints(); - setFormData({ - name: '', - UCID: '', - hashed_password: '', - points: 0 - }); - }; - const customDarkTheme = { ...DarkTheme, colors: { diff --git a/frontend/ecoscan/api.js b/frontend/ecoscan/api.js deleted file mode 100644 index dc40719..0000000 --- a/frontend/ecoscan/api.js +++ /dev/null @@ -1,7 +0,0 @@ -import axios from 'axios'; - -const api = axios.create({ - baseURL: 'http://localhost:8000' -}) - -export default api; \ No newline at end of file diff --git a/frontend/ecoscan/src/components/LeaderBoardTable.js b/frontend/ecoscan/src/components/LeaderBoardTable.js index bb4edd7..78bc5dd 100644 --- a/frontend/ecoscan/src/components/LeaderBoardTable.js +++ b/frontend/ecoscan/src/components/LeaderBoardTable.js @@ -1,30 +1,36 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { View, Text, FlatList } from 'react-native'; -import tw from 'twrnc'; +import leaderboardData from './leaderboard.json'; // Import the JSON file -const Leaderboard = ({ data }) => { - const renderItem = ({ item }) => ( - - {item.rank} - {item.name} - {item.points} - - ); +const Leaderboard = () => { + const [data, setData] = useState([]); + + useEffect(() => { + // const fetchData = async () => { + // try { + // const response = await fetch('http://127.0.0.1:8000/points/top-ten/'); + // const jsonData = await response.json(); + // setData(jsonData); + // } catch (error) { + // console.error('Error fetching data:', error); + // } + // }; + + // fetchData(); + setData(leaderboardData); + }, []); return ( - - - Rank - Name - Points - + item.id.toString()} // Assuming each item has a unique ID + keyExtractor={item => item.id.toString()} + renderItem={({ item }) => ( + {item.name} - {item.points} Points + )} /> ); }; -export default Leaderboard; +export default Leaderboard; \ No newline at end of file diff --git a/frontend/ecoscan/src/components/leaderboard.json b/frontend/ecoscan/src/components/leaderboard.json new file mode 100644 index 0000000..cf07069 --- /dev/null +++ b/frontend/ecoscan/src/components/leaderboard.json @@ -0,0 +1,11 @@ +[ + {"name": "Ethan", "UCID": "30942823", "hashed_password": "894uidjfafkdj8", "points": 60, "id": 2}, + {"name": "Olivia", "UCID": "30942823", "hashed_password": "894uidjfafkdj8", "points": 60, "id": 1}, + {"name": "Zach", "UCID": "30172354", "hashed_password": "1233", "points": 13, "id": 5}, + {"name": "Zach", "UCID": "30172354", "hashed_password": "1233", "points": 13, "id": 4}, + {"name": "Zach", "UCID": "30172354", "hashed_password": "1233", "points": 13, "id": 3}, + {"name": "Jim", "UCID": "30172353", "hashed_password": "stasdfg", "points": 12, "id": 8}, + {"name": "Jim", "UCID": "30172353", "hashed_password": "stasdfg", "points": 12, "id": 7}, + {"name": "Jun", "UCID": "31231", "hashed_password": "asdfsa", "points": 12, "id": 6}, + {"name": "Aiden", "UCID": "10123", "hashed_password": "string", "points": 3, "id": 9} +] diff --git a/frontend/ecoscan/src/screens/HomePage.js b/frontend/ecoscan/src/screens/HomePage.js index 8511421..2f2a6d8 100644 --- a/frontend/ecoscan/src/screens/HomePage.js +++ b/frontend/ecoscan/src/screens/HomePage.js @@ -5,8 +5,7 @@ import {View, Text } from 'react-native'; import Header from '../components/Header'; import Stats from '../components/Stats'; import ProgressBar from '../components/ProgressBar'; -import Pull from './exampleFetchApi'; - +import Leaderboard from '../components/LeaderBoardTable'; // Home screen component const HomePage = () => { return ( @@ -14,10 +13,11 @@ const HomePage = () => {
- Home + + ); }; diff --git a/frontend/ecoscan/src/screens/exampleFetchApi.js b/frontend/ecoscan/src/screens/exampleFetchApi.js deleted file mode 100644 index 49b47ba..0000000 --- a/frontend/ecoscan/src/screens/exampleFetchApi.js +++ /dev/null @@ -1,69 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { NavigationContainer,DarkTheme} from "@react-navigation/native"; -import api from '../../api'; -import App from '../../App'; - -const Pull =() =>{ - - const [points,setPoints] = useState([]); - const [formData,setFormData] = useState({ - name: '', - UCID: '', - hashed_password: '', - points: 0 - }); - - const fetchPoints = async () => { - const response = await api.get('/points/'); - setPoints(response.data) - }; - - useEffect(() => { - fetchPoints(); - }, []); - - const handleInputChange = (event) => { - const value = event.target.type === 'checkbox' ? event.target.checked : event.target.value; - setFormData({ - ...formData, - [event.target.name] : value, - }); - }; - - const handleFormSubmit = async (event) => { - event.preventDefault(); //makes us only control submitting the form - await api.post('/points/',formData); - fetchPoints(); - setFormData({ - name: '', - UCID: '', - hashed_password: '', - points: 0 - }); - }; - - - return( - - - - - - - - - - {points.map((points) => ( - - - - - ))} - -
NamePoints
{points.name}{points.points}
- ); - -} - -export default Pull;