diff --git a/backend/utils/FirebaseAPI.py b/backend/utils/FirebaseAPI.py index 0f9ff85..f1a4ce5 100644 --- a/backend/utils/FirebaseAPI.py +++ b/backend/utils/FirebaseAPI.py @@ -13,6 +13,7 @@ class FirebaseAPI: @staticmethod def verify_google_token(id_token: str) -> Optional[dict]: + # print(id_token) return auth.verify_id_token( id_token=id_token, check_revoked=True ) diff --git a/frontend/src/screens/dashboard.tsx b/frontend/src/screens/dashboard.tsx index c5e2745..8eaf73a 100644 --- a/frontend/src/screens/dashboard.tsx +++ b/frontend/src/screens/dashboard.tsx @@ -9,10 +9,13 @@ import type { StackNavigationProp } from '@react-navigation/stack'; import { useNavigation } from '@react-navigation/native'; import { type User } from '../models/User'; import { UsersAPI } from '../APIs/UsersAPI'; +import { type TransportationEntry } from '../models/Transportation'; +import { TransportationAPI } from '../APIs/TransportationAPI'; export type StackNavigation = StackNavigationProp; export default function DashBoardScreen(): JSX.Element { const [user, setUser] = useState(undefined); + const [transportationEntry, setTransportationEntry] = useState(); const [photoURL] = useState("https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Default_pfp.svg/2048px-Default_pfp.svg.png"); const navigation = useNavigation(); @@ -28,9 +31,14 @@ export default function DashBoardScreen(): JSX.Element { setUser(res); } }); + void TransportationAPI.getTransportationMetricForToday().then((res) => { + if (res != null) { + setTransportationEntry(res) + } + }); }, [loaded]); - if (!loaded || user === undefined) { + if (!loaded || user === undefined || transportationEntry === undefined) { return <>; } @@ -69,7 +77,7 @@ export default function DashBoardScreen(): JSX.Element { navigation.navigate('TransportationHistory'); }} > - + diff --git a/frontend/src/screens/transportationForum.tsx b/frontend/src/screens/transportationForum.tsx index ad6b1c1..e51b32a 100644 --- a/frontend/src/screens/transportationForum.tsx +++ b/frontend/src/screens/transportationForum.tsx @@ -4,22 +4,21 @@ import { View, TouchableOpacity, ScrollView, - TextInput, Modal, Linking, } from 'react-native'; -import { CheckBox } from 'react-native-elements'; import * as React from 'react'; import Icon from 'react-native-vector-icons/FontAwesome'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { type StackNavigationProp } from '@react-navigation/stack'; import { type RootStackParamList } from '../components/types'; import { useNavigation } from '@react-navigation/native'; import { useFonts } from 'expo-font'; import Colors from '../../assets/colorConstants'; -import transportationQuestions from '../../assets/questions'; import { SafeAreaView } from 'react-native-safe-area-context'; import Slider from '@react-native-community/slider'; +import { TransportationAPI } from '../APIs/TransportationAPI'; +import { type TransportationEntry } from '../models/Transportation'; export type StackNavigation = StackNavigationProp; @@ -32,33 +31,32 @@ export default function TransportationForum(): JSX.Element { initialValue: number; } - const slidersData: SliderData[] = [ - { id: 1, label: 'Car', minValue: 0, maxValue: 800, initialValue: 0 }, - { id: 2, label: 'Bus', minValue: 0, maxValue: 800, initialValue: 0 }, - { id: 3, label: 'Train', minValue: 0, maxValue: 800, initialValue: 0 }, - { id: 4, label: 'Motobike', minValue: 0, maxValue: 800, initialValue: 0 }, - // Add more slider data as needed - ]; + const [transportationEntry, setTransportationEntry] = useState(); - const [sliderValues, setSliderValues] = useState( - slidersData.map((data) => data.initialValue) - ); + const [slidersData, setSliderData] = useState([]); + + const [electricCarTravel, setElectricCarTravel] = useState(0); + const [gasolineCarTravel, setGasolineCarTravel] = useState(0); + const [busTravel, setBusTravel] = useState(0); + const [trainTravel, setTrainTravel] = useState(0); + const [bikeTravel, setBikeTravel] = useState(0); const onSliderValueChange = (value: number, index: number): void => { - const updatedValues = [...sliderValues]; - updatedValues[index] = value; - setSliderValues(updatedValues); + slidersData[index].initialValue = value switch (index) { case 0: - setCarTravel(value); + setElectricCarTravel(value); break; case 1: - setBusTravel(value); + setGasolineCarTravel(value); break; case 2: setTrainTravel(value); break; case 3: + setBusTravel(value); + break; + case 4: setBikeTravel(value); break; default: @@ -90,40 +88,53 @@ export default function TransportationForum(): JSX.Element { const navigation = useNavigation(); - const data = transportationQuestions; - - const [responses, setResponses] = useState(new Array(data.length).fill('')); - - const [fuelType, setFuelType] = useState(''); - const [fuelEfficiency, setFuelEfficiency] = useState(0); - const [carTravel, setCarTravel] = useState(0); - const [busTravel, setBusTravel] = useState(0); - const [trainTravel, setTrainTravel] = useState(0); - const [bikeTravel, setBikeTravel] = useState(0); - const [modalVisible, setModalVisible] = useState(false); const handleSurveySubmit = (): void => { // Process survey responses, e.g., send them to a server - console.log('Survey Responses:', { - fuelType, - fuelEfficiency, - carTravel, - busTravel, - trainTravel, - bikeTravel, - }); - - navigation.navigate('FoodForum'); + if (transportationEntry != null) { + const newEntry: TransportationEntry = { + _id: transportationEntry._id, + user_id: transportationEntry.user_id, + bus: busTravel, + train: trainTravel, + motorbike: bikeTravel, + electric_car: electricCarTravel, + gasoline_car: gasolineCarTravel, + carbon_emissions: transportationEntry.carbon_emissions, + date: transportationEntry.date + } + void TransportationAPI.updateTransportation(newEntry).then() + } + navigation.navigate('TransportationHistory'); }; - const handleOptionSelect = (questionId: number, optionIndex: number): void => { - const updatedResponses = [...responses]; - updatedResponses[questionId] = data[questionId].options[optionIndex]; - setResponses(updatedResponses); - }; + useEffect(() => { + if (transportationEntry != null) { + setSliderData([ + { id: 1, label: 'Electric Car', minValue: 0, maxValue: 800, initialValue: transportationEntry.electric_car }, + { id: 2, label: 'Gasoline Car', minValue: 0, maxValue: 800, initialValue: transportationEntry.gasoline_car }, + { id: 3, label: 'Train', minValue: 0, maxValue: 800, initialValue: transportationEntry.train }, + { id: 4, label: 'Bus', minValue: 0, maxValue: 800, initialValue: transportationEntry.bus }, + { id: 5, label: 'Motobike', minValue: 0, maxValue: 800, initialValue: transportationEntry.motorbike }, + ]) + setElectricCarTravel(transportationEntry.electric_car); + setGasolineCarTravel(transportationEntry.gasoline_car); + setBusTravel(transportationEntry.bus); + setTrainTravel(transportationEntry.train); + setBikeTravel(transportationEntry.motorbike); + } + }, [transportationEntry]) - if (!loaded) { + useEffect(() => { + void TransportationAPI.getTransportationMetricForToday().then((res) => { + if (res != null) { + setTransportationEntry(res) + } + }) + }, [loaded]) + + if (!loaded || slidersData.length === 0) { return <>; } @@ -132,49 +143,6 @@ export default function TransportationForum(): JSX.Element { Calculate your emissions from transportation: - - {data[0].question} - {data[0].options.map((option, index) => ( - { - handleOptionSelect(data[0].id, index); - setFuelType(data[0].options[index]); - }} - /> - ))} - - - - - - Please enter your vehicle's fuel efficiency. If you don't have a vehicle, - enter 0. - - setModalVisible(!modalVisible)} - > - - - - { - setFuelEfficiency(Number(text)); - }} - /> - - @@ -205,7 +173,7 @@ export default function TransportationForum(): JSX.Element { {slidersData.map((slider, index) => ( - {slider.label}: {sliderValues[index]} km + {slider.label}: {slidersData[index].initialValue} km onSliderValueChange(value, index)} /> @@ -227,7 +195,7 @@ export default function TransportationForum(): JSX.Element { ))} - Next + Save @@ -282,20 +250,6 @@ const styles = StyleSheet.create({ color: Colors.DARKGREEN, marginBottom: 20, }, - answer: { - fontFamily: 'Montserrat', - fontSize: 17, - fontWeight: '700', - color: Colors.DARKGREEN, - }, - input: { - borderWidth: 1, - borderColor: Colors.GREY, - padding: 8, - margin: 10, - width: 200, - backgroundColor: Colors.WHITE, - }, buttoning: { backgroundColor: Colors.DARKGREEN, borderRadius: 10, @@ -308,18 +262,9 @@ const styles = StyleSheet.create({ fontWeight: '700', textAlign: 'center', }, - selectedOption: { - backgroundColor: Colors.FILLGREEN, - }, - unSelectedOption: { - backgroundColor: Colors.LIGHTFGREEN, - }, questionContainer: { paddingBottom: 30, }, - questionWithIcon: { - flexDirection: 'row', - }, infoText: { fontSize: 20, color: Colors.DARKGREEN, @@ -330,10 +275,6 @@ const styles = StyleSheet.create({ closeIcon: { marginLeft: 'auto', }, - questionIcon: { - marginLeft: 15, - paddingTop: 5, - }, silder: { height: 50, width: '100%', diff --git a/frontend/src/screens/transportationHistory.tsx b/frontend/src/screens/transportationHistory.tsx index 625f67b..419624a 100644 --- a/frontend/src/screens/transportationHistory.tsx +++ b/frontend/src/screens/transportationHistory.tsx @@ -4,13 +4,22 @@ import Colors from '../../assets/colorConstants'; import { useFonts } from 'expo-font'; import { BarChart } from 'react-native-chart-kit'; import { TransportationAPI } from '../APIs/TransportationAPI'; -import { type MonthlyEntry } from '../models/Transportation'; +import { type TransportationEntry, type MonthlyEntry } from '../models/Transportation'; +import { useNavigation } from '@react-navigation/native'; +import { type StackNavigationProp } from '@react-navigation/stack'; +import { type RootStackParamList } from '../components/types'; +import WidgetBox from '../widgets/widgetBox'; +export type StackNavigation = StackNavigationProp; export default function TransportationHistory(): JSX.Element { const [expandedStates, setExpandedStates] = useState(Array(100).fill(false)); const [monthlyData, setMonthlyData] = useState(); + const [startDate] = useState(new Date(2023, 8, 1)); + const [endDate] = useState(new Date(2023, 11, 1)); + const navigation = useNavigation(); + const [transportationEntry, setTransportationEntry] = useState(); const toggleExpanded = (index: number): void => { const updatedStates = [...expandedStates]; @@ -28,18 +37,22 @@ export default function TransportationHistory(): JSX.Element { }); useEffect(() => { - void TransportationAPI.getTransportationsEntriesForUserUsingDataRange(new Date(2023, 1, 1), new Date(2023, 12, 1)).then((res) => { + void TransportationAPI.getTransportationsEntriesForUserUsingDataRange( + startDate, endDate).then((res) => { if (res != null) { if (res.monthlyData != null) { setMonthlyData(res.monthlyData) - console.log(res) } } - console.log(res) }); - }, [loaded]) + void TransportationAPI.getTransportationMetricForToday().then((res) => { + if (res != null) { + setTransportationEntry(res) + } + }); + }, [endDate, loaded, startDate]) - if (!loaded || monthlyData === undefined) { + if (!loaded || monthlyData === undefined || transportationEntry === undefined) { return <>; } @@ -92,12 +105,22 @@ export default function TransportationHistory(): JSX.Element { withHorizontalLabels={false} /> - {/* Add more content here */} )} ))} + + + { + navigation.navigate('TransportationForum'); + }} + > + + + + ); } @@ -148,4 +171,11 @@ const styles = StyleSheet.create({ alignSelf: 'center', marginLeft: -50, }, + widgetContainer: { + padding: 10, + flexDirection: 'row', + }, + widgetBoarder: { + padding: 10, + } });