Skip to content

Commit

Permalink
Added New Features
Browse files Browse the repository at this point in the history
  • Loading branch information
Yazan10x committed Nov 24, 2023
1 parent 28581a4 commit 3c78301
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 128 deletions.
1 change: 1 addition & 0 deletions backend/utils/FirebaseAPI.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
12 changes: 10 additions & 2 deletions frontend/src/screens/dashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<RootStackParamList>;

export default function DashBoardScreen(): JSX.Element {
const [user, setUser] = useState<User | undefined>(undefined);
const [transportationEntry, setTransportationEntry] = useState<TransportationEntry>();
const [photoURL] = useState<string>("https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Default_pfp.svg/2048px-Default_pfp.svg.png");

const navigation = useNavigation<StackNavigation>();
Expand All @@ -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 <></>;
}

Expand Down Expand Up @@ -69,7 +77,7 @@ export default function DashBoardScreen(): JSX.Element {
navigation.navigate('TransportationHistory');
}}
>
<WidgetBox title="Transportatin" content="12.4" />
<WidgetBox title="Transportatin" content={transportationEntry.carbon_emissions.toString()} />
</TouchableOpacity>
</View>
</View>
Expand Down
179 changes: 60 additions & 119 deletions frontend/src/screens/transportationForum.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<RootStackParamList>;

Expand All @@ -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<TransportationEntry>();

const [sliderValues, setSliderValues] = useState<number[]>(
slidersData.map((data) => data.initialValue)
);
const [slidersData, setSliderData] = useState<SliderData[]>([]);

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:
Expand Down Expand Up @@ -90,40 +88,53 @@ export default function TransportationForum(): JSX.Element {

const navigation = useNavigation<StackNavigation>();

const data = transportationQuestions;

const [responses, setResponses] = useState<string[]>(new Array(data.length).fill(''));

const [fuelType, setFuelType] = useState<string>('');
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 <></>;
}

Expand All @@ -132,49 +143,6 @@ export default function TransportationForum(): JSX.Element {
<ScrollView style={styles.scrollContainer}>
<Text style={styles.header}>Calculate your emissions from transportation:</Text>

<View style={styles.questionContainer}>
<Text style={styles.question}>{data[0].question}</Text>
{data[0].options.map((option, index) => (
<CheckBox
checkedColor={Colors.DARKGREEN}
textStyle={styles.answer}
containerStyle={
responses[data[0].id] === option ? styles.selectedOption : styles.unSelectedOption
}
key={index}
title={option}
checked={responses[data[0].id] === option}
onPress={() => {
handleOptionSelect(data[0].id, index);
setFuelType(data[0].options[index]);
}}
/>
))}
</View>

<View style={styles.questionContainer}>
<View style={styles.questionWithIcon}>
<Text style={styles.question}>
Please enter your vehicle&apos;s fuel efficiency. If you don&apos;t have a vehicle,
enter 0.
</Text>
<TouchableOpacity
style={styles.questionIcon}
onPress={() => setModalVisible(!modalVisible)}
>
<Icon name="question-circle" size={30} color={Colors.DARKGREEN} />
</TouchableOpacity>
</View>
<TextInput
style={styles.input}
keyboardType="numeric"
placeholder="Input"
onChangeText={(text) => {
setFuelEfficiency(Number(text));
}}
/>
</View>

<Modal transparent={true} visible={modalVisible}>
<View style={styles.modalBackground}>
<View style={styles.modalContainer}>
Expand Down Expand Up @@ -205,7 +173,7 @@ export default function TransportationForum(): JSX.Element {
{slidersData.map((slider, index) => (
<View style={styles.questionContainer} key={slider.id}>
<Text style={styles.question}>
{slider.label}: {sliderValues[index]} km
{slider.label}: {slidersData[index].initialValue} km
</Text>
<Slider
style={styles.silder}
Expand All @@ -215,7 +183,7 @@ export default function TransportationForum(): JSX.Element {
minimumTrackTintColor={Colors.DARKGREEN}
maximumTrackTintColor={Colors.FILLGREEN}
thumbTintColor={Colors.WHITE}
value={sliderValues[index]}
value={slidersData[index].initialValue}
onValueChange={(value) => onSliderValueChange(value, index)}
/>
<View style={styles.labelContainer}>
Expand All @@ -227,7 +195,7 @@ export default function TransportationForum(): JSX.Element {
))}

<TouchableOpacity style={styles.buttoning} onPress={handleSurveySubmit}>
<Text style={styles.buttoningText}>Next</Text>
<Text style={styles.buttoningText}>Save</Text>
</TouchableOpacity>
</ScrollView>
</SafeAreaView>
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -330,10 +275,6 @@ const styles = StyleSheet.create({
closeIcon: {
marginLeft: 'auto',
},
questionIcon: {
marginLeft: 15,
paddingTop: 5,
},
silder: {
height: 50,
width: '100%',
Expand Down
Loading

0 comments on commit 3c78301

Please sign in to comment.