From e267709483dff76320bf532166a59f9a829cb5e4 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Thu, 7 Dec 2023 14:18:00 +0100 Subject: [PATCH 01/10] Small Modification --- LeftOvers/screens/HomePage.tsx | 2 +- LeftOvers/screens/IngredientSelection.tsx | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/LeftOvers/screens/HomePage.tsx b/LeftOvers/screens/HomePage.tsx index 0dacb69..6a7cbf8 100644 --- a/LeftOvers/screens/HomePage.tsx +++ b/LeftOvers/screens/HomePage.tsx @@ -96,7 +96,7 @@ export default function HomePage({ navigation, props }) { }); useEffect(() => { - //AsyncStorage.clear() + AsyncStorage.clear() fetchProfiles(); if(profiles.length == 0){ setProfiles(profilesHand) diff --git a/LeftOvers/screens/IngredientSelection.tsx b/LeftOvers/screens/IngredientSelection.tsx index 15e180e..ce0e7da 100644 --- a/LeftOvers/screens/IngredientSelection.tsx +++ b/LeftOvers/screens/IngredientSelection.tsx @@ -120,6 +120,7 @@ const fetchAvailableIngredient = async () => { const updatedAvailableIngredient = [...existingAvailableIngredient, newIngredient]; await AsyncStorage.setItem('ingredient', JSON.stringify(updatedAvailableIngredient)); EventEmitter.emit('ingredientAdded'); + fetchAvailableIngredient(); console.log('Ingredient Added:', newIngredient); ChangeAvailableSize(false) } @@ -133,7 +134,6 @@ const fetchAvailableIngredient = async () => { try{ const updatedIngredients = selectedIngredients.filter((ingredient) => ingredient.id !== idIngredient); await AsyncStorage.setItem('ingredient', JSON.stringify(updatedIngredients)); - EventEmitter.emit('ingredientDeleted'); fetchAvailableIngredient(); setSelectedIngredients(updatedIngredients); ChangeAvailableSize(true) @@ -143,18 +143,6 @@ const fetchAvailableIngredient = async () => { } }; - const subscriptionAddIngredient = EventEmitter.addListener('ingredientAdded', async () => { - fetchAvailableIngredient(); - }); - const subscriptionDeleteIngredient = EventEmitter.addListener('ingredientDeleted', async () => { - if (selectedIngredients.length == 1){ - setSelectedIngredients([{title: "None"}]) - } - else{ - fetchAvailableIngredient(); - } - }); - const ChangeAvailableSize = (remove: boolean) => { if(remove){ if (selectedIngredients.length == 1){ From 3194aef519261aef023f1df10759552265c345ce Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Thu, 7 Dec 2023 14:21:38 +0100 Subject: [PATCH 02/10] merge master --- LeftOvers/screens/FiltersSelection.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/LeftOvers/screens/FiltersSelection.tsx b/LeftOvers/screens/FiltersSelection.tsx index 494b82b..1b274f9 100644 --- a/LeftOvers/screens/FiltersSelection.tsx +++ b/LeftOvers/screens/FiltersSelection.tsx @@ -37,7 +37,12 @@ export default function FiltersSelection(props) { const fetchProfiles = async () => { const existingProfiles = await handleGetProfiles() - setProfiles(existingProfiles) + if(existingProfiles.length != 0){ + setProfiles(existingProfiles) + } + else{ + setProfiles(profilesHand) + } }; const subscription = EventEmitter.addListener('profileAdded', async () => { @@ -101,7 +106,6 @@ export default function FiltersSelection(props) { profile.diets.forEach((diet) => { retType = true dieTemp.forEach((val) => { - console.log("Value DieTemp:",val) if(val.value == diet){ retType = false } From 704f8d9682e20dd6da8823d624fa2f5b6cdc5004 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Fri, 8 Dec 2023 11:06:49 +0100 Subject: [PATCH 03/10] Fix EventEmitter Issue --- LeftOvers/Models/Profile.tsx | 53 +++++++++------ .../Services/Profiles/IProfileService.ts | 6 +- LeftOvers/Services/Profiles/ProfileService.ts | 13 ++-- LeftOvers/components/ListWithoutSelect.tsx | 10 ++- LeftOvers/navigation/BottomBar.tsx | 2 +- LeftOvers/screens/FiltersSelection.tsx | 68 ++++++++++++------- LeftOvers/screens/HomePage.tsx | 45 ++++++++++-- LeftOvers/screens/Profiles.tsx | 2 + 8 files changed, 135 insertions(+), 64 deletions(-) diff --git a/LeftOvers/Models/Profile.tsx b/LeftOvers/Models/Profile.tsx index 1dc1775..20bd71f 100644 --- a/LeftOvers/Models/Profile.tsx +++ b/LeftOvers/Models/Profile.tsx @@ -1,30 +1,41 @@ export default class Profile { - private _name: string; - private _avatar: string; - private _allergy: string[]; - private _diets: string[]; + public name: string; + public avatar: string; + public allergies: string[]; + public diets: string[]; + public isActive: string; + public isWaiting: string - constructor( name: string, avatar: string, allergy: string[], diets: string[]) { - this._name = name; - this._avatar = avatar; - this._allergy = allergy; - this._diets = diets; + constructor( name: string, avatar: string, allergies: string[], diets: string[], isActive: string, isWaiting: string) { + this.name = name; + this.avatar = avatar; + this.diets = diets; + this.allergies = allergies; + this.isActive = isActive; + this.isWaiting = isWaiting } - get name(): string { - return this._name; - } + // get name(): string { + // return this._name; + // } + // get avatar(): string{ + // return this._avatar; + // } - get avatar(): string{ - return this._avatar; - } + // get allergies(): string[]{ + // return this._allergies; + // } - get allergy(): string[]{ - return this._allergy; - } + // get diets(): string[]{ + // return this._diets; + // } - get diets(): string[]{ - return this._diets; - } + // get isActive(): string{ + // return this._isActive; + // } + + // get isWaiting(): string{ + // return this._isWaiting; + // } } \ No newline at end of file diff --git a/LeftOvers/Services/Profiles/IProfileService.ts b/LeftOvers/Services/Profiles/IProfileService.ts index 425a961..da27672 100644 --- a/LeftOvers/Services/Profiles/IProfileService.ts +++ b/LeftOvers/Services/Profiles/IProfileService.ts @@ -1,7 +1,7 @@ -import Profil from "../../Models/Profil"; +import Profile from "../../Models/Profile"; export default interface IProfileService { - getProfiles(): Promise, - addProfile(new_profile: Profil): Promise, + getProfiles(): Promise, + addProfile(new_profile: Profile): Promise, delProfile(profile_name_to_del: string): Promise } \ No newline at end of file diff --git a/LeftOvers/Services/Profiles/ProfileService.ts b/LeftOvers/Services/Profiles/ProfileService.ts index 30646bf..910619f 100644 --- a/LeftOvers/Services/Profiles/ProfileService.ts +++ b/LeftOvers/Services/Profiles/ProfileService.ts @@ -1,19 +1,18 @@ -import Profil from "../../Models/Profil"; +import Profile from "../../Models/Profile"; import IProfileService from "./IProfileService"; import AsyncStorage from "@react-native-async-storage/async-storage"; export default class ProfileService implements IProfileService { - async getProfiles(): Promise { + async getProfiles(): Promise { const results = await AsyncStorage.getItem('profiles'); - const tmp = JSON.parse(results) - let existingProfiles: Profil[] = [] - for (let item of tmp) { - existingProfiles.push(new Profil(item._name, item._avatar, item._allergy, item._diets)) + const existingProfiles = JSON.parse(results) + if(existingProfiles.length == 0){ + existingProfiles.push(new Profile("None", "logo.png", [], [], "none", "none")) } return existingProfiles; } - async addProfile(new_profile : Profil): Promise { + async addProfile(new_profile : Profile): Promise { const existingProfiles = await this.getProfiles() for (let current_profile of existingProfiles) { if (current_profile.name == new_profile.name) { diff --git a/LeftOvers/components/ListWithoutSelect.tsx b/LeftOvers/components/ListWithoutSelect.tsx index a095f3c..1fa93e8 100644 --- a/LeftOvers/components/ListWithoutSelect.tsx +++ b/LeftOvers/components/ListWithoutSelect.tsx @@ -12,6 +12,11 @@ export default function ListWithoutSelect(props: ListProps) { const [selected, setSelected] = React.useState([]); const colors = useContext(ColorContext).colors; + let listContent = [] + props.content.forEach((val) => { + listContent.push({value: val, disabled: true}) + }) + const styles = StyleSheet.create({ titleBar: { flexDirection: "row", @@ -80,7 +85,7 @@ export default function ListWithoutSelect(props: ListProps) { return ( setSelected(val)} - data={props.content} + data={listContent} save="value" search={false} arrowicon={} @@ -97,5 +102,4 @@ export default function ListWithoutSelect(props: ListProps) { placeholder={props.title} label={props.title}/> ); -} - +} \ No newline at end of file diff --git a/LeftOvers/navigation/BottomBar.tsx b/LeftOvers/navigation/BottomBar.tsx index a65c78d..ee552e3 100644 --- a/LeftOvers/navigation/BottomBar.tsx +++ b/LeftOvers/navigation/BottomBar.tsx @@ -40,7 +40,7 @@ export default function BottomBar({ state, descriptors, navigation }) { bottom: 0, right: 0, left: 0, - height: "8%", + height: 60, backgroundColor: theme === 'dark' ? "#3F3C42" : "transparent" }, BottomBarBlurContainer: { diff --git a/LeftOvers/screens/FiltersSelection.tsx b/LeftOvers/screens/FiltersSelection.tsx index 1b274f9..932fede 100644 --- a/LeftOvers/screens/FiltersSelection.tsx +++ b/LeftOvers/screens/FiltersSelection.tsx @@ -24,6 +24,7 @@ export default function FiltersSelection(props) { const [dieAdd, setDieAdd] = useState([]) const [allAdd, setAllAdd] = useState([]) const [selectedDiets, setSelectedDiets] = useState([]) + let isProfileAdded = false, isUpdateDietsAllergies = false, isSelectedProfilesUpdated = false const handleGetProfiles = async () => { try { @@ -45,30 +46,30 @@ export default function FiltersSelection(props) { } }; - const subscription = EventEmitter.addListener('profileAdded', async () => { + const subscriptionAddProfile = EventEmitter.addListener('profileAdded', async () => { fetchProfiles() + console.log("Technique de Shinobi Anti-CodeSmell", selectedDiets) + isProfileAdded = true + subscriptionAddProfile.remove() + EventEmitter.removeAllListeners('profileAdded') + EventEmitter.removeAllListeners('updateDietsAllergies') + EventEmitter.removeAllListeners('selectedProfilesUpdated') }); - let cptSubscription = 1 - - const subscriptionUpdateDietsAllergies = EventEmitter.addListener('updateDietsAllergies', async () => { - updateDiets() - setDieAdd(die.filter(isInProfileDiets)) - console.log("Passage Subsciption:", cptSubscription) - }); - - let cptSubscriptionDiets = 1 - - const subscriptionUpdateDiets = EventEmitter.addListener('updateDiets', async () => { - setDieAdd(die.filter(isInProfileDiets)) - console.log("Passage SubsciptionDiets:", cptSubscriptionDiets) - }); + const subscriptionUpdateDietsAllergies = EventEmitter.addListener('updateDietsAllergies', async() => { + setDieAdd(die.filter(isInProfileDiets)) + setAllAdd([]) + isUpdateDietsAllergies = true + subscriptionUpdateDietsAllergies.remove() + subscriptionUpdateProfiles.remove(); + EventEmitter.removeAllListeners('updateDietsAllergies') + }) useEffect(() => { fetchProfiles() }, []); - const handleSaveSelectedProfiles = async () => { + async function handleSaveSelectedProfiles(){ try { profiles.forEach((val) => { if(val.isWaiting == "flex"){ @@ -83,19 +84,23 @@ export default function FiltersSelection(props) { }) await AsyncStorage.setItem('profiles', JSON.stringify(profiles)); fetchProfiles() - updateDiets() - setDieAdd(die.filter(isInProfileDiets)) - updateAllergies() - setAllAdd([]) + console.log("handleSaveSelectedProfiles: __________________________________________________") + EventEmitter.emit("selectedProfilesUpdated") } catch (error) { console.error('Error occured when updating active profiles:', error); } }; - const subscriptionUpdateSelectedProfiles = EventEmitter.addListener('selectedProfilesUpdated', async () => { - fetchProfiles() + const subscriptionUpdateProfiles = EventEmitter.addListener('selectedProfilesUpdated', async () => { updateDiets() - setDieAdd(die.filter(isInProfileDiets)) + updateAllergies() + EventEmitter.emit("updateDietsAllergies") + console.log("Filters Selection: -------------------------------------------------") + isSelectedProfilesUpdated = true + subscriptionUpdateProfiles.remove(); + EventEmitter.removeAllListeners('profileAdded') + EventEmitter.removeAllListeners('updateDietsAllergies') + EventEmitter.removeAllListeners('selectedProfilesUpdated') }); const updateDiets = () => { @@ -138,7 +143,6 @@ export default function FiltersSelection(props) { } }) setAllProfiles(allTemp) - console.log("Technique de Shinobi Anti-CodeSmell", selectedDiets) } const changeStatusWaiting = (cpt) => { @@ -255,6 +259,22 @@ export default function FiltersSelection(props) { const goBack = () => props.navigation.goBack(); + if(isProfileAdded){ + //EventEmitter.removeAllListeners('profileAdded') + //EventEmitter.removeAllListeners('updateDietsAllergies') + //EventEmitter.removeAllListeners('selectedProfilesUpdated') + } + if(isUpdateDietsAllergies){ + //EventEmitter.removeAllListeners('profileAdded') + //EventEmitter.removeAllListeners('updateDietsAllergies') + //EventEmitter.removeAllListeners('selectedProfilesUpdated') + } + if(isSelectedProfilesUpdated){ + //EventEmitter.removeAllListeners('profileAdded') + //EventEmitter.removeAllListeners('updateDietsAllergies') + //EventEmitter.removeAllListeners('selectedProfilesUpdated') + } + return ( diff --git a/LeftOvers/screens/HomePage.tsx b/LeftOvers/screens/HomePage.tsx index 5b3c592..7956179 100644 --- a/LeftOvers/screens/HomePage.tsx +++ b/LeftOvers/screens/HomePage.tsx @@ -2,17 +2,15 @@ import React, { useContext, useState, useEffect } from 'react'; import { StyleSheet, View, Text, Pressable, Image, ScrollView } from 'react-native'; import {LinearGradient} from 'expo-linear-gradient'; import {SafeAreaProvider} from 'react-native-safe-area-context'; - import ValidateButton from '../components/ValidateButton'; import ProfileSelection from '../components/ProfileSelection'; import FoodElementText from '../components/FoodElementText'; import ColorContext from '../theme/ColorContext'; - import bracketLeft from '../assets/images/angle_bracket_left.png'; import bracketRight from '../assets/images/angle_bracket_right.png'; - import AsyncStorage from '@react-native-async-storage/async-storage'; import EventEmitter from './EventEmitter'; +import ProfileService from '../Services/Profiles/ProfileService'; export default function HomePage({ navigation, props }) { const colors = useContext(ColorContext).colors @@ -25,6 +23,8 @@ export default function HomePage({ navigation, props }) { const [profiles, setProfiles] = useState(profilesHand); const [ingredientList, setIngredientList] = useState(ingredientListHand) + const profileService = new ProfileService() + const handleGetProfiles = async () => { try { const existingProfiles = await AsyncStorage.getItem('profiles'); @@ -45,7 +45,7 @@ export default function HomePage({ navigation, props }) { } } - const fetchProfiles = async () => { + const fetchProfiles2 = async () => { const existingProfiles = await handleGetProfiles(); if (existingProfiles.length != 0){ setProfiles(existingProfiles); @@ -55,6 +55,10 @@ export default function HomePage({ navigation, props }) { } }; + const fetchProfiles = async () => { + setProfiles(await profileService.getProfiles()) + } + const fetchAvailableIngredient = async () => { const existingAvailableIngredient = await handleGetAvailableIngredient(); if (existingAvailableIngredient.length != 0){ @@ -67,6 +71,12 @@ export default function HomePage({ navigation, props }) { const subscriptionAddProfile = EventEmitter.addListener('profileAdded', async () => { fetchProfiles(); + subscriptionAddProfile.remove(); + EventEmitter.removeAllListeners('profileAdded') + EventEmitter.removeAllListeners('profileDeleted') + EventEmitter.removeAllListeners('ingredientAdded') + EventEmitter.removeAllListeners('ingredientDeleted') + EventEmitter.removeAllListeners('selectedProfilesUpdated') }); const subscriptionDeleteProfile = EventEmitter.addListener('profileDeleted', async () => { @@ -76,10 +86,22 @@ export default function HomePage({ navigation, props }) { else{ fetchProfiles(); } + subscriptionDeleteProfile.remove(); + EventEmitter.removeAllListeners('profileAdded') + EventEmitter.removeAllListeners('profileDeleted') + EventEmitter.removeAllListeners('ingredientAdded') + EventEmitter.removeAllListeners('ingredientDeleted') + EventEmitter.removeAllListeners('selectedProfilesUpdated') }); const subscriptionAddIngredient = EventEmitter.addListener('ingredientAdded', async () => { fetchAvailableIngredient(); + subscriptionAddIngredient.remove(); + EventEmitter.removeAllListeners('profileAdded') + EventEmitter.removeAllListeners('profileDeleted') + EventEmitter.removeAllListeners('ingredientAdded') + EventEmitter.removeAllListeners('ingredientDeleted') + EventEmitter.removeAllListeners('selectedProfilesUpdated') }); const subscriptionDeleteIngredient = EventEmitter.addListener('ingredientDeleted', async () => { @@ -89,14 +111,27 @@ export default function HomePage({ navigation, props }) { else{ fetchAvailableIngredient(); } + subscriptionDeleteIngredient.remove(); + EventEmitter.removeAllListeners('profileAdded') + EventEmitter.removeAllListeners('profileDeleted') + EventEmitter.removeAllListeners('ingredientAdded') + EventEmitter.removeAllListeners('ingredientDeleted') + EventEmitter.removeAllListeners('selectedProfilesUpdated') }); const subscriptionUpdateSelectedProfile = EventEmitter.addListener('selectedProfilesUpdated', async () => { fetchProfiles(); + console.log("Home Page: ===================================================================") + subscriptionUpdateSelectedProfile.remove(); + EventEmitter.removeAllListeners('profileAdded') + EventEmitter.removeAllListeners('profileDeleted') + EventEmitter.removeAllListeners('ingredientAdded') + EventEmitter.removeAllListeners('ingredientDeleted') + EventEmitter.removeAllListeners('selectedProfilesUpdated') }); useEffect(() => { - AsyncStorage.clear() + //AsyncStorage.clear() fetchProfiles(); if(profiles.length == 0){ setProfiles(profilesHand) diff --git a/LeftOvers/screens/Profiles.tsx b/LeftOvers/screens/Profiles.tsx index e763b8f..b0b7a0b 100644 --- a/LeftOvers/screens/Profiles.tsx +++ b/LeftOvers/screens/Profiles.tsx @@ -58,6 +58,8 @@ export default function Profiles({navigation, props}) { const subscription = EventEmitter.addListener('profileAdded', async () => { fetchProfiles(); + subscription.remove(); + EventEmitter.removeAllListeners('profileAdded') }); useEffect(() => { From b7e51a2fa009d7503da9bc38de2e318382afd6a2 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Fri, 8 Dec 2023 11:51:11 +0100 Subject: [PATCH 04/10] Fix ListWithoutSelect --- LeftOvers/screens/FiltersSelection.tsx | 19 +++++++++---------- LeftOvers/screens/HomePage.tsx | 1 - 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/LeftOvers/screens/FiltersSelection.tsx b/LeftOvers/screens/FiltersSelection.tsx index 932fede..7e2ac33 100644 --- a/LeftOvers/screens/FiltersSelection.tsx +++ b/LeftOvers/screens/FiltersSelection.tsx @@ -84,7 +84,6 @@ export default function FiltersSelection(props) { }) await AsyncStorage.setItem('profiles', JSON.stringify(profiles)); fetchProfiles() - console.log("handleSaveSelectedProfiles: __________________________________________________") EventEmitter.emit("selectedProfilesUpdated") } catch (error) { console.error('Error occured when updating active profiles:', error); @@ -95,8 +94,8 @@ export default function FiltersSelection(props) { updateDiets() updateAllergies() EventEmitter.emit("updateDietsAllergies") - console.log("Filters Selection: -------------------------------------------------") isSelectedProfilesUpdated = true + console.log("Filters Selection: ---------------------------------------------------") subscriptionUpdateProfiles.remove(); EventEmitter.removeAllListeners('profileAdded') EventEmitter.removeAllListeners('updateDietsAllergies') @@ -111,12 +110,12 @@ export default function FiltersSelection(props) { profile.diets.forEach((diet) => { retType = true dieTemp.forEach((val) => { - if(val.value == diet){ + if(val == diet){ retType = false } }) if(retType){ - dieTemp.push({value: diet}) + dieTemp.push(diet) } }) } @@ -132,12 +131,12 @@ export default function FiltersSelection(props) { profile.allergies.forEach((allergy) => { retType = true allTemp.forEach((val) => { - if(val.value == allergy){ + if(val == allergy){ retType = false } }) if(retType){ - allTemp.push({value: allergy}) + allTemp.push(allergy) } }) } @@ -185,8 +184,8 @@ export default function FiltersSelection(props) { function isInProfileDiets(element) { let retType = true - dieProfiles.forEach(function (diet) { - if(diet.value==element.value){ + dieProfiles.forEach((diet) => { + if(diet==element.value){ retType = false } }) @@ -305,9 +304,9 @@ export default function FiltersSelection(props) { Additional Filters {dieAdd.length} available - + - + props.navigation.navigate("IngredientSelection")}> diff --git a/LeftOvers/screens/HomePage.tsx b/LeftOvers/screens/HomePage.tsx index 7956179..1ce344a 100644 --- a/LeftOvers/screens/HomePage.tsx +++ b/LeftOvers/screens/HomePage.tsx @@ -121,7 +121,6 @@ export default function HomePage({ navigation, props }) { const subscriptionUpdateSelectedProfile = EventEmitter.addListener('selectedProfilesUpdated', async () => { fetchProfiles(); - console.log("Home Page: ===================================================================") subscriptionUpdateSelectedProfile.remove(); EventEmitter.removeAllListeners('profileAdded') EventEmitter.removeAllListeners('profileDeleted') From d1bfdce68d6723d75bd5dcb70e57a4d5a1885885 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Fri, 8 Dec 2023 14:02:50 +0100 Subject: [PATCH 05/10] ProfileService (addProfile) --- .../Services/Profiles/IProfileService.ts | 2 +- LeftOvers/Services/Profiles/ProfileService.ts | 18 +++-- LeftOvers/navigation/ProfileStackScreen.tsx | 2 +- LeftOvers/screens/CreateProfile.tsx | 13 +--- LeftOvers/screens/FiltersSelection.tsx | 70 +++++------------- LeftOvers/screens/HomePage.tsx | 72 ++++++++----------- LeftOvers/screens/ModifyProfile.tsx | 9 +-- LeftOvers/screens/Profiles.tsx | 29 +++----- 8 files changed, 73 insertions(+), 142 deletions(-) diff --git a/LeftOvers/Services/Profiles/IProfileService.ts b/LeftOvers/Services/Profiles/IProfileService.ts index da27672..2c648f6 100644 --- a/LeftOvers/Services/Profiles/IProfileService.ts +++ b/LeftOvers/Services/Profiles/IProfileService.ts @@ -2,6 +2,6 @@ import Profile from "../../Models/Profile"; export default interface IProfileService { getProfiles(): Promise, - addProfile(new_profile: Profile): Promise, + addProfile(newProfile: Profile): Promise, delProfile(profile_name_to_del: string): Promise } \ No newline at end of file diff --git a/LeftOvers/Services/Profiles/ProfileService.ts b/LeftOvers/Services/Profiles/ProfileService.ts index 910619f..e38b5e8 100644 --- a/LeftOvers/Services/Profiles/ProfileService.ts +++ b/LeftOvers/Services/Profiles/ProfileService.ts @@ -1,10 +1,11 @@ import Profile from "../../Models/Profile"; import IProfileService from "./IProfileService"; import AsyncStorage from "@react-native-async-storage/async-storage"; +import eventEmitter from "../../screens/EventEmitter"; export default class ProfileService implements IProfileService { async getProfiles(): Promise { - const results = await AsyncStorage.getItem('profiles'); + const results = await AsyncStorage.getItem('profiles') const existingProfiles = JSON.parse(results) if(existingProfiles.length == 0){ existingProfiles.push(new Profile("None", "logo.png", [], [], "none", "none")) @@ -12,15 +13,12 @@ export default class ProfileService implements IProfileService { return existingProfiles; } - async addProfile(new_profile : Profile): Promise { - const existingProfiles = await this.getProfiles() - for (let current_profile of existingProfiles) { - if (current_profile.name == new_profile.name) { - console.log("Tried to create a profil already existing !") - return false - } - } - await AsyncStorage.setItem('profiles', JSON.stringify([...existingProfiles, new_profile])) + async addProfile(newProfile : Profile): Promise { + let existingProfiles = await AsyncStorage.getItem('profiles'); + existingProfiles = existingProfiles ? JSON.parse(existingProfiles) : []; + const updatedProfiles = [...existingProfiles, newProfile]; + await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); + eventEmitter.emit("profileAdded") return true } diff --git a/LeftOvers/navigation/ProfileStackScreen.tsx b/LeftOvers/navigation/ProfileStackScreen.tsx index d1ccaff..5f55471 100644 --- a/LeftOvers/navigation/ProfileStackScreen.tsx +++ b/LeftOvers/navigation/ProfileStackScreen.tsx @@ -37,7 +37,7 @@ export default function ProfilesStackScreen({ navigation }) { const _handleSearch = () => { console.log('Searching'); } - const _handleHeaderAdd = () => navigation.navigate('ProfileCreation', { name: String }); + const _handleHeaderAdd = () => navigation.navigate('ProfileCreation'); return ( diff --git a/LeftOvers/screens/CreateProfile.tsx b/LeftOvers/screens/CreateProfile.tsx index e69a2a2..8cadaad 100644 --- a/LeftOvers/screens/CreateProfile.tsx +++ b/LeftOvers/screens/CreateProfile.tsx @@ -8,7 +8,7 @@ import ListWithoutSelect from '../components/ListWithoutSelect'; import ListSelect from '../components/ListSelect'; import EventEmitter from './EventEmitter'; import * as ImagePicker from 'expo-image-picker'; -import AsyncStorage from '@react-native-async-storage/async-storage'; +import ProfileService from '../Services/Profiles/ProfileService'; export default function CreateProfile(props) { @@ -19,6 +19,7 @@ export default function CreateProfile(props) { const [avatar, setAvatar] = useState(''); const [selectedDiets, setSelectedDiets] = useState([]); const [selectedAllergies] = useState([]) + const profileService = new ProfileService() const handleSelectedDiets = (selectedValues) => { setSelectedDiets(selectedValues); @@ -48,7 +49,6 @@ export default function CreateProfile(props) { const handleCreateProfile = async () => { try { - // Ton code pour récupérer les profils existants et ajouter un nouveau profil const newProfile = { name: name, avatar: avatar, @@ -57,14 +57,7 @@ export default function CreateProfile(props) { isActive: "flex", isWaiting: "none", }; - - // Mettre à jour AsyncStorage avec le nouveau profil - let existingProfiles = await AsyncStorage.getItem('profiles'); - existingProfiles = existingProfiles ? JSON.parse(existingProfiles) : []; - const updatedProfiles = [...existingProfiles, newProfile]; - await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); - EventEmitter.emit('profileAdded'); - console.log('Profil créé :', newProfile); + profileService.addProfile(newProfile) props.navigation.goBack(); } catch (error) { console.error('Erreur lors de la création du profil :', error); diff --git a/LeftOvers/screens/FiltersSelection.tsx b/LeftOvers/screens/FiltersSelection.tsx index 7e2ac33..b6ef962 100644 --- a/LeftOvers/screens/FiltersSelection.tsx +++ b/LeftOvers/screens/FiltersSelection.tsx @@ -2,14 +2,14 @@ import React, {useContext, useState, useEffect} from 'react'; import {StyleSheet, View, Text, ScrollView, useWindowDimensions} from 'react-native'; import {LinearGradient} from 'expo-linear-gradient'; import {SafeAreaProvider} from 'react-native-safe-area-context'; - import ValidateButton from '../components/ValidateButton'; import ListSelect from '../components/ListSelect'; import ListWithoutSelect from '../components/ListWithoutSelect'; import ProfileSelection from '../components/ProfileSelection'; import ColorContext from '../theme/ColorContext'; -import EventEmitter from './EventEmitter'; +import eventEmitter from './EventEmitter'; import AsyncStorage from '@react-native-async-storage/async-storage'; +import ProfileService from '../Services/Profiles/ProfileService'; export default function FiltersSelection(props) { const {colors} = useContext(ColorContext); @@ -17,52 +17,33 @@ export default function FiltersSelection(props) { {name: "None", avatar: "logo.png", diets: [], allergies: [], isActive: "none", isWaiting: "none"}, ] const die = [{value: "Dairy free"}, {value: "Gluten free"}, {value: "Porkless"}, {value: "Vegan"}, {value: "Vegetarian"}, {value: "Pescatarian"}] - + const profileService = new ProfileService() const [profiles, setProfiles] = useState(profilesHand); const [dieProfiles, setDieProfiles] = useState([]) const [allProfiles, setAllProfiles] = useState([]) const [dieAdd, setDieAdd] = useState([]) const [allAdd, setAllAdd] = useState([]) const [selectedDiets, setSelectedDiets] = useState([]) - let isProfileAdded = false, isUpdateDietsAllergies = false, isSelectedProfilesUpdated = false - - const handleGetProfiles = async () => { - try { - const existingProfiles = await AsyncStorage.getItem('profiles'); - return JSON.parse(existingProfiles) || []; - } catch (error) { - console.log("Error occured during GetProfiles", error); - return []; - } - } const fetchProfiles = async () => { - const existingProfiles = await handleGetProfiles() - if(existingProfiles.length != 0){ - setProfiles(existingProfiles) - } - else{ - setProfiles(profilesHand) - } - }; + setProfiles(await profileService.getProfiles()) + } - const subscriptionAddProfile = EventEmitter.addListener('profileAdded', async () => { + const subscriptionAddProfile = eventEmitter.addListener('profileAdded', async () => { fetchProfiles() console.log("Technique de Shinobi Anti-CodeSmell", selectedDiets) - isProfileAdded = true subscriptionAddProfile.remove() - EventEmitter.removeAllListeners('profileAdded') - EventEmitter.removeAllListeners('updateDietsAllergies') - EventEmitter.removeAllListeners('selectedProfilesUpdated') + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('updateDietsAllergies') + eventEmitter.removeAllListeners('selectedProfilesUpdated') }); - const subscriptionUpdateDietsAllergies = EventEmitter.addListener('updateDietsAllergies', async() => { + const subscriptionUpdateDietsAllergies = eventEmitter.addListener('updateDietsAllergies', async() => { setDieAdd(die.filter(isInProfileDiets)) setAllAdd([]) - isUpdateDietsAllergies = true subscriptionUpdateDietsAllergies.remove() subscriptionUpdateProfiles.remove(); - EventEmitter.removeAllListeners('updateDietsAllergies') + eventEmitter.removeAllListeners('updateDietsAllergies') }) useEffect(() => { @@ -84,22 +65,21 @@ export default function FiltersSelection(props) { }) await AsyncStorage.setItem('profiles', JSON.stringify(profiles)); fetchProfiles() - EventEmitter.emit("selectedProfilesUpdated") + eventEmitter.emit("selectedProfilesUpdated") } catch (error) { console.error('Error occured when updating active profiles:', error); } }; - const subscriptionUpdateProfiles = EventEmitter.addListener('selectedProfilesUpdated', async () => { + const subscriptionUpdateProfiles = eventEmitter.addListener('selectedProfilesUpdated', async () => { updateDiets() updateAllergies() - EventEmitter.emit("updateDietsAllergies") - isSelectedProfilesUpdated = true + eventEmitter.emit("updateDietsAllergies") console.log("Filters Selection: ---------------------------------------------------") subscriptionUpdateProfiles.remove(); - EventEmitter.removeAllListeners('profileAdded') - EventEmitter.removeAllListeners('updateDietsAllergies') - EventEmitter.removeAllListeners('selectedProfilesUpdated') + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('updateDietsAllergies') + eventEmitter.removeAllListeners('selectedProfilesUpdated') }); const updateDiets = () => { @@ -258,22 +238,6 @@ export default function FiltersSelection(props) { const goBack = () => props.navigation.goBack(); - if(isProfileAdded){ - //EventEmitter.removeAllListeners('profileAdded') - //EventEmitter.removeAllListeners('updateDietsAllergies') - //EventEmitter.removeAllListeners('selectedProfilesUpdated') - } - if(isUpdateDietsAllergies){ - //EventEmitter.removeAllListeners('profileAdded') - //EventEmitter.removeAllListeners('updateDietsAllergies') - //EventEmitter.removeAllListeners('selectedProfilesUpdated') - } - if(isSelectedProfilesUpdated){ - //EventEmitter.removeAllListeners('profileAdded') - //EventEmitter.removeAllListeners('updateDietsAllergies') - //EventEmitter.removeAllListeners('selectedProfilesUpdated') - } - return ( diff --git a/LeftOvers/screens/HomePage.tsx b/LeftOvers/screens/HomePage.tsx index 1ce344a..d12d350 100644 --- a/LeftOvers/screens/HomePage.tsx +++ b/LeftOvers/screens/HomePage.tsx @@ -9,7 +9,7 @@ import ColorContext from '../theme/ColorContext'; import bracketLeft from '../assets/images/angle_bracket_left.png'; import bracketRight from '../assets/images/angle_bracket_right.png'; import AsyncStorage from '@react-native-async-storage/async-storage'; -import EventEmitter from './EventEmitter'; +import eventEmitter from './EventEmitter'; import ProfileService from '../Services/Profiles/ProfileService'; export default function HomePage({ navigation, props }) { @@ -45,16 +45,6 @@ export default function HomePage({ navigation, props }) { } } - const fetchProfiles2 = async () => { - const existingProfiles = await handleGetProfiles(); - if (existingProfiles.length != 0){ - setProfiles(existingProfiles); - } - else{ - setProfiles(profilesHand) - } - }; - const fetchProfiles = async () => { setProfiles(await profileService.getProfiles()) } @@ -69,17 +59,17 @@ export default function HomePage({ navigation, props }) { } }; - const subscriptionAddProfile = EventEmitter.addListener('profileAdded', async () => { + const subscriptionAddProfile = eventEmitter.addListener('profileAdded', async () => { fetchProfiles(); subscriptionAddProfile.remove(); - EventEmitter.removeAllListeners('profileAdded') - EventEmitter.removeAllListeners('profileDeleted') - EventEmitter.removeAllListeners('ingredientAdded') - EventEmitter.removeAllListeners('ingredientDeleted') - EventEmitter.removeAllListeners('selectedProfilesUpdated') + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileDeleted') + eventEmitter.removeAllListeners('ingredientAdded') + eventEmitter.removeAllListeners('ingredientDeleted') + eventEmitter.removeAllListeners('selectedProfilesUpdated') }); - const subscriptionDeleteProfile = EventEmitter.addListener('profileDeleted', async () => { + const subscriptionDeleteProfile = eventEmitter.addListener('profileDeleted', async () => { if (profiles.length == 1){ setProfiles(profilesHand) } @@ -87,24 +77,24 @@ export default function HomePage({ navigation, props }) { fetchProfiles(); } subscriptionDeleteProfile.remove(); - EventEmitter.removeAllListeners('profileAdded') - EventEmitter.removeAllListeners('profileDeleted') - EventEmitter.removeAllListeners('ingredientAdded') - EventEmitter.removeAllListeners('ingredientDeleted') - EventEmitter.removeAllListeners('selectedProfilesUpdated') + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileDeleted') + eventEmitter.removeAllListeners('ingredientAdded') + eventEmitter.removeAllListeners('ingredientDeleted') + eventEmitter.removeAllListeners('selectedProfilesUpdated') }); - const subscriptionAddIngredient = EventEmitter.addListener('ingredientAdded', async () => { + const subscriptionAddIngredient = eventEmitter.addListener('ingredientAdded', async () => { fetchAvailableIngredient(); subscriptionAddIngredient.remove(); - EventEmitter.removeAllListeners('profileAdded') - EventEmitter.removeAllListeners('profileDeleted') - EventEmitter.removeAllListeners('ingredientAdded') - EventEmitter.removeAllListeners('ingredientDeleted') - EventEmitter.removeAllListeners('selectedProfilesUpdated') + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileDeleted') + eventEmitter.removeAllListeners('ingredientAdded') + eventEmitter.removeAllListeners('ingredientDeleted') + eventEmitter.removeAllListeners('selectedProfilesUpdated') }); - const subscriptionDeleteIngredient = EventEmitter.addListener('ingredientDeleted', async () => { + const subscriptionDeleteIngredient = eventEmitter.addListener('ingredientDeleted', async () => { if (ingredientList.length == 1){ setIngredientList(ingredientListHand) } @@ -112,21 +102,21 @@ export default function HomePage({ navigation, props }) { fetchAvailableIngredient(); } subscriptionDeleteIngredient.remove(); - EventEmitter.removeAllListeners('profileAdded') - EventEmitter.removeAllListeners('profileDeleted') - EventEmitter.removeAllListeners('ingredientAdded') - EventEmitter.removeAllListeners('ingredientDeleted') - EventEmitter.removeAllListeners('selectedProfilesUpdated') + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileDeleted') + eventEmitter.removeAllListeners('ingredientAdded') + eventEmitter.removeAllListeners('ingredientDeleted') + eventEmitter.removeAllListeners('selectedProfilesUpdated') }); - const subscriptionUpdateSelectedProfile = EventEmitter.addListener('selectedProfilesUpdated', async () => { + const subscriptionUpdateSelectedProfile = eventEmitter.addListener('selectedProfilesUpdated', async () => { fetchProfiles(); subscriptionUpdateSelectedProfile.remove(); - EventEmitter.removeAllListeners('profileAdded') - EventEmitter.removeAllListeners('profileDeleted') - EventEmitter.removeAllListeners('ingredientAdded') - EventEmitter.removeAllListeners('ingredientDeleted') - EventEmitter.removeAllListeners('selectedProfilesUpdated') + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileDeleted') + eventEmitter.removeAllListeners('ingredientAdded') + eventEmitter.removeAllListeners('ingredientDeleted') + eventEmitter.removeAllListeners('selectedProfilesUpdated') }); useEffect(() => { diff --git a/LeftOvers/screens/ModifyProfile.tsx b/LeftOvers/screens/ModifyProfile.tsx index f243f3f..60a37b3 100644 --- a/LeftOvers/screens/ModifyProfile.tsx +++ b/LeftOvers/screens/ModifyProfile.tsx @@ -15,9 +15,6 @@ export default function ModifyProfile(props) { const [profile, setProfile] = useState(null); const route = useRoute(); - - - const handleGetProfileByName = async (profileName) => { try { const existingProfiles = await AsyncStorage.getItem('profiles'); @@ -33,9 +30,9 @@ export default function ModifyProfile(props) { }; const fetchProfiles = async () => { - const selectedProfil = await handleGetProfileByName(route.params); - setProfile(selectedProfil); -}; + const selectedProfil = await handleGetProfileByName(route.params); + setProfile(selectedProfil); + }; useEffect(() => { fetchProfiles(); diff --git a/LeftOvers/screens/Profiles.tsx b/LeftOvers/screens/Profiles.tsx index b0b7a0b..0acc28a 100644 --- a/LeftOvers/screens/Profiles.tsx +++ b/LeftOvers/screens/Profiles.tsx @@ -3,23 +3,22 @@ import { StyleSheet, View, Modal, Pressable, Text, Image, ScrollView, useWindowD import { LinearGradient } from 'expo-linear-gradient'; import { SafeAreaProvider } from 'react-native-safe-area-context'; - +import ProfileService from '../Services/Profiles/ProfileService'; import ProfileDetails from '../components/ProfileDetails'; import ColorContext from '../theme/ColorContext'; import AsyncStorage from '@react-native-async-storage/async-storage'; -import EventEmitter from './EventEmitter'; +import eventEmitter from './EventEmitter'; import { PaperProvider, Portal } from 'react-native-paper'; export default function Profiles({navigation, props}) { const colors = useContext(ColorContext).colors - + const profileService = new ProfileService() const [visible, setVisible] = useState(false); const [profiles, setProfiles] = useState([]); const [selectedProfileIndex, setSelectedProfileIndex] = useState(null); const goDetails = (name: string) => navigation.navigate('ProfileCreation', name); - const raisePopUp = (index) => { setSelectedProfileIndex(index) setVisible(true) @@ -32,7 +31,7 @@ export default function Profiles({navigation, props}) { try { const updatedProfiles = profiles.filter((profile, i) => i !== index); await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); - EventEmitter.emit('profileDeleted'); + eventEmitter.emit('profileDeleted'); fetchProfiles(); setSelectedProfileIndex(index); erasePopUp(); @@ -41,25 +40,15 @@ export default function Profiles({navigation, props}) { } }; - const handleGetProfiles = async () => { - try { - const existingProfiles = await AsyncStorage.getItem('profiles'); - return JSON.parse(existingProfiles) || []; - } catch (error) { - console.log("Error occured during GetProfiles", error); - return []; - } - } - const fetchProfiles = async () => { - const existingProfiles = await handleGetProfiles(); - setProfiles(existingProfiles); - }; + setProfiles(await profileService.getProfiles()) + } - const subscription = EventEmitter.addListener('profileAdded', async () => { + const subscription = eventEmitter.addListener('profileAdded', async () => { fetchProfiles(); + console.log("Profiles sub Added: ------------------------------------") subscription.remove(); - EventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileAdded') }); useEffect(() => { From 653b3cf301dab115a5171b430189771a475b3552 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Fri, 8 Dec 2023 14:25:36 +0100 Subject: [PATCH 06/10] ProfileService (delProfile) --- .../Services/Profiles/IProfileService.ts | 2 +- LeftOvers/Services/Profiles/ProfileService.ts | 20 +++++++------------ LeftOvers/screens/Profiles.tsx | 18 ++++++++++++----- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/LeftOvers/Services/Profiles/IProfileService.ts b/LeftOvers/Services/Profiles/IProfileService.ts index 2c648f6..3e628d4 100644 --- a/LeftOvers/Services/Profiles/IProfileService.ts +++ b/LeftOvers/Services/Profiles/IProfileService.ts @@ -3,5 +3,5 @@ import Profile from "../../Models/Profile"; export default interface IProfileService { getProfiles(): Promise, addProfile(newProfile: Profile): Promise, - delProfile(profile_name_to_del: string): Promise + delProfile(index: number): Promise } \ No newline at end of file diff --git a/LeftOvers/Services/Profiles/ProfileService.ts b/LeftOvers/Services/Profiles/ProfileService.ts index e38b5e8..8704434 100644 --- a/LeftOvers/Services/Profiles/ProfileService.ts +++ b/LeftOvers/Services/Profiles/ProfileService.ts @@ -14,7 +14,7 @@ export default class ProfileService implements IProfileService { } async addProfile(newProfile : Profile): Promise { - let existingProfiles = await AsyncStorage.getItem('profiles'); + let existingProfiles = await AsyncStorage.getItem('profiles') existingProfiles = existingProfiles ? JSON.parse(existingProfiles) : []; const updatedProfiles = [...existingProfiles, newProfile]; await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); @@ -22,17 +22,11 @@ export default class ProfileService implements IProfileService { return true } - async delProfile(profile_name_to_del: string): Promise { - const existing_profiles = await this.getProfiles() - let key: number = -1 - for (let current_profile of existing_profiles) { - if (current_profile.name == profile_name_to_del) { - let updated_profile = existing_profiles.splice(key, 1) - await AsyncStorage.setItem('profiles', JSON.stringify(updated_profile)) - return true - } - key ++ - } - return false + async delProfile(index: number): Promise { + const existingProfiles = await this.getProfiles() + const updatedProfiles = existingProfiles.filter((profile, i) => i !== index); + await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); + eventEmitter.emit('profileDeleted'); + return true } } \ No newline at end of file diff --git a/LeftOvers/screens/Profiles.tsx b/LeftOvers/screens/Profiles.tsx index 0acc28a..c313ff7 100644 --- a/LeftOvers/screens/Profiles.tsx +++ b/LeftOvers/screens/Profiles.tsx @@ -29,10 +29,11 @@ export default function Profiles({navigation, props}) { const handleDeleteProfile = async (index) => { try { - const updatedProfiles = profiles.filter((profile, i) => i !== index); - await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); - eventEmitter.emit('profileDeleted'); - fetchProfiles(); + // const updatedProfiles = profiles.filter((profile, i) => i !== index); + // await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); + // eventEmitter.emit('profileDeleted'); + + profileService.delProfile(index) setSelectedProfileIndex(index); erasePopUp(); } catch (error) { @@ -46,9 +47,16 @@ export default function Profiles({navigation, props}) { const subscription = eventEmitter.addListener('profileAdded', async () => { fetchProfiles(); - console.log("Profiles sub Added: ------------------------------------") subscription.remove(); eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileDeleted') + }); + + const subscriptionDeletedProfile = eventEmitter.addListener('profileDeleted', async () => { + fetchProfiles(); + subscriptionDeletedProfile.remove(); + eventEmitter.removeAllListeners('profileAdded') + eventEmitter.removeAllListeners('profileDeleted') }); useEffect(() => { From 363283584052680e5721550eac39f9b05a34bc1e Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Fri, 8 Dec 2023 15:07:38 +0100 Subject: [PATCH 07/10] IngredientService (Failed) --- .../Ingredients/IIngredientService.tsx | 3 ++ .../Ingredients/IngredientsServices.tsx | 34 +++++++++++++++++++ LeftOvers/screens/IngredientSelection.tsx | 12 +++---- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/LeftOvers/Services/Ingredients/IIngredientService.tsx b/LeftOvers/Services/Ingredients/IIngredientService.tsx index 926f9be..687386c 100644 --- a/LeftOvers/Services/Ingredients/IIngredientService.tsx +++ b/LeftOvers/Services/Ingredients/IIngredientService.tsx @@ -5,4 +5,7 @@ export default interface IIngredientService { getIngredientById(id: number): Promise; getIngredientByLetter(id: string): Promise; getfilteredIngredient(prompt: string): Promise; + getAvailableIngredient(): Promise, + addIngredient(newIngredient: Ingredient): Promise, + delIngredient(idIngredient: number): Promise } \ No newline at end of file diff --git a/LeftOvers/Services/Ingredients/IngredientsServices.tsx b/LeftOvers/Services/Ingredients/IngredientsServices.tsx index d50cc89..eb2f5e4 100644 --- a/LeftOvers/Services/Ingredients/IngredientsServices.tsx +++ b/LeftOvers/Services/Ingredients/IngredientsServices.tsx @@ -1,6 +1,8 @@ +import AsyncStorage from "@react-native-async-storage/async-storage"; import Ingredient from "../../Models/Ingredient"; import IIngredientService from "./IIngredientService"; import axios from 'axios'; +import eventEmitter from "../../screens/EventEmitter"; export default class IngredientService implements IIngredientService { private readonly API_URL = "http://leftovers.alwaysdata.net/ingredients"; @@ -41,4 +43,36 @@ export default class IngredientService implements IIngredientService { throw new Error('Erreur lors de la récupération des ingrédients : ' + error.message); } } + + async getAvailableIngredient(): Promise { + const results = await AsyncStorage.getItem('ingredient') + const availableIngredient = JSON.parse(results) + if(availableIngredient.length == 0){ + availableIngredient.push(new Ingredient(-1, "None")) + } + console.log("AvailableIngredient:", availableIngredient) + return availableIngredient; + } + + async addIngredient(newIngredient: Ingredient): Promise { + let selectedIngredients = await this.getAvailableIngredient() + const exists = selectedIngredients.find((ingredient) => ingredient.id === newIngredient.id); + if (!exists) { + let existingAvailableIngredient = await AsyncStorage.getItem('ingredient'); + existingAvailableIngredient = existingAvailableIngredient ? JSON.parse(existingAvailableIngredient) : []; + const updatedAvailableIngredient = [...existingAvailableIngredient, newIngredient]; + await AsyncStorage.setItem('ingredient', JSON.stringify(updatedAvailableIngredient)); + eventEmitter.emit('ingredientAdded'); + return true + } + return false + } + + async delIngredient(idIngredient: number): Promise { + let selectedIngredients = await this.getAvailableIngredient() + const updatedIngredients = selectedIngredients.filter((ingredient) => ingredient.id !== idIngredient); + await AsyncStorage.setItem('ingredient', JSON.stringify(updatedIngredients)); + eventEmitter.emit('ingredientDeleted'); + return true + } } diff --git a/LeftOvers/screens/IngredientSelection.tsx b/LeftOvers/screens/IngredientSelection.tsx index ce0e7da..6fb8d4c 100644 --- a/LeftOvers/screens/IngredientSelection.tsx +++ b/LeftOvers/screens/IngredientSelection.tsx @@ -9,7 +9,7 @@ import IngredientService from '../Services/Ingredients/IngredientsServices'; import ColorContext from '../theme/ColorContext'; import ValidateButton from '../components/ValidateButton'; import AsyncStorage from '@react-native-async-storage/async-storage'; -import EventEmitter from './EventEmitter'; +import eventEmitter from './EventEmitter'; import plus from '../assets/images/plus.png'; import moins from '../assets/images/minus.png'; @@ -50,8 +50,7 @@ export default function IngredientSelection(props) { const loadIngredients = async () => { try { - const ingredients = await ingredientService.getAllIngredient(); - setResponse(ingredients); + setResponse(await ingredientService.getAllIngredient()); } catch (error) { console.log(error); } finally { @@ -107,7 +106,7 @@ const fetchAvailableIngredient = async () => { setSelectedIngredients(existingAvailableIngredient); } else{ - setSelectedIngredients([{value: "None"}]) + setSelectedIngredients([new Ingredient(-1, "None")]) } }; @@ -119,7 +118,7 @@ const fetchAvailableIngredient = async () => { existingAvailableIngredient = existingAvailableIngredient ? JSON.parse(existingAvailableIngredient) : []; const updatedAvailableIngredient = [...existingAvailableIngredient, newIngredient]; await AsyncStorage.setItem('ingredient', JSON.stringify(updatedAvailableIngredient)); - EventEmitter.emit('ingredientAdded'); + eventEmitter.emit('ingredientAdded'); fetchAvailableIngredient(); console.log('Ingredient Added:', newIngredient); ChangeAvailableSize(false) @@ -134,6 +133,7 @@ const fetchAvailableIngredient = async () => { try{ const updatedIngredients = selectedIngredients.filter((ingredient) => ingredient.id !== idIngredient); await AsyncStorage.setItem('ingredient', JSON.stringify(updatedIngredients)); + eventEmitter.emit('ingredientDeleted'); fetchAvailableIngredient(); setSelectedIngredients(updatedIngredients); ChangeAvailableSize(true) @@ -166,7 +166,7 @@ const fetchAvailableIngredient = async () => { setAvailableSize(90) } else if (selectedIngredients.length == 1){ - if(selectedIngredients[0].value == "None"){ + if(selectedIngredients[0].name == "None"){ setAvailableSize(90) } else{ From fed0694944b281188f457718f96c58149068b538 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Mon, 11 Dec 2023 08:03:10 +0100 Subject: [PATCH 08/10] Code Smell Fix --- LeftOvers/screens/CreateProfile.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/LeftOvers/screens/CreateProfile.tsx b/LeftOvers/screens/CreateProfile.tsx index 8cadaad..2303a20 100644 --- a/LeftOvers/screens/CreateProfile.tsx +++ b/LeftOvers/screens/CreateProfile.tsx @@ -6,7 +6,6 @@ import ValidateButton from '../components/ValidateButton'; import ColorContext from '../theme/ColorContext'; import ListWithoutSelect from '../components/ListWithoutSelect'; import ListSelect from '../components/ListSelect'; -import EventEmitter from './EventEmitter'; import * as ImagePicker from 'expo-image-picker'; import ProfileService from '../Services/Profiles/ProfileService'; From 4cbc138fb85069c7470056071cbe1d359ba1e6df Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Mon, 11 Dec 2023 08:08:22 +0100 Subject: [PATCH 09/10] Code Smell Fix --- LeftOvers/screens/HomePage.tsx | 10 ---------- LeftOvers/screens/Profiles.tsx | 5 ----- 2 files changed, 15 deletions(-) diff --git a/LeftOvers/screens/HomePage.tsx b/LeftOvers/screens/HomePage.tsx index d12d350..e415269 100644 --- a/LeftOvers/screens/HomePage.tsx +++ b/LeftOvers/screens/HomePage.tsx @@ -25,16 +25,6 @@ export default function HomePage({ navigation, props }) { const profileService = new ProfileService() - const handleGetProfiles = async () => { - try { - const existingProfiles = await AsyncStorage.getItem('profiles'); - return JSON.parse(existingProfiles) || []; - } catch (error) { - console.log(error); - return []; - } - } - const handleGetAvailableIngredient = async () => { try { const existingAvailableIngredient = await AsyncStorage.getItem('ingredient'); diff --git a/LeftOvers/screens/Profiles.tsx b/LeftOvers/screens/Profiles.tsx index c313ff7..b572319 100644 --- a/LeftOvers/screens/Profiles.tsx +++ b/LeftOvers/screens/Profiles.tsx @@ -6,7 +6,6 @@ import { SafeAreaProvider } from 'react-native-safe-area-context'; import ProfileService from '../Services/Profiles/ProfileService'; import ProfileDetails from '../components/ProfileDetails'; import ColorContext from '../theme/ColorContext'; -import AsyncStorage from '@react-native-async-storage/async-storage'; import eventEmitter from './EventEmitter'; import { PaperProvider, Portal } from 'react-native-paper'; @@ -29,10 +28,6 @@ export default function Profiles({navigation, props}) { const handleDeleteProfile = async (index) => { try { - // const updatedProfiles = profiles.filter((profile, i) => i !== index); - // await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); - // eventEmitter.emit('profileDeleted'); - profileService.delProfile(index) setSelectedProfileIndex(index); erasePopUp(); From 3dee4a4dd44d8652923711d8f64faa673b8ab527 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Mon, 11 Dec 2023 08:26:50 +0100 Subject: [PATCH 10/10] Remove Console.Log --- LeftOvers/screens/FiltersSelection.tsx | 4 +--- LeftOvers/screens/HomePage.tsx | 4 ++-- LeftOvers/screens/IngredientSelection.tsx | 12 ++++++------ LeftOvers/screens/ModifyProfile.tsx | 5 ++--- LeftOvers/screens/RecipeDetails.tsx | 9 +-------- LeftOvers/screens/RecipeSuggestion.tsx | 2 +- 6 files changed, 13 insertions(+), 23 deletions(-) diff --git a/LeftOvers/screens/FiltersSelection.tsx b/LeftOvers/screens/FiltersSelection.tsx index b6ef962..34a5092 100644 --- a/LeftOvers/screens/FiltersSelection.tsx +++ b/LeftOvers/screens/FiltersSelection.tsx @@ -31,7 +31,6 @@ export default function FiltersSelection(props) { const subscriptionAddProfile = eventEmitter.addListener('profileAdded', async () => { fetchProfiles() - console.log("Technique de Shinobi Anti-CodeSmell", selectedDiets) subscriptionAddProfile.remove() eventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('updateDietsAllergies') @@ -67,7 +66,7 @@ export default function FiltersSelection(props) { fetchProfiles() eventEmitter.emit("selectedProfilesUpdated") } catch (error) { - console.error('Error occured when updating active profiles:', error); + console.error('Error occured when updating active profiles:', error, selectedDiets); } }; @@ -75,7 +74,6 @@ export default function FiltersSelection(props) { updateDiets() updateAllergies() eventEmitter.emit("updateDietsAllergies") - console.log("Filters Selection: ---------------------------------------------------") subscriptionUpdateProfiles.remove(); eventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('updateDietsAllergies') diff --git a/LeftOvers/screens/HomePage.tsx b/LeftOvers/screens/HomePage.tsx index e415269..7fed9f9 100644 --- a/LeftOvers/screens/HomePage.tsx +++ b/LeftOvers/screens/HomePage.tsx @@ -30,7 +30,7 @@ export default function HomePage({ navigation, props }) { const existingAvailableIngredient = await AsyncStorage.getItem('ingredient'); return JSON.parse(existingAvailableIngredient) || []; } catch (error) { - console.log(error); + console.error(error); return []; } } @@ -247,7 +247,7 @@ export default function HomePage({ navigation, props }) { {nbActiveProfiles()} selected - console.log("Ignorer", val)}/> + val += 1}/> navigation.navigate('FiltersSelection')}/> diff --git a/LeftOvers/screens/IngredientSelection.tsx b/LeftOvers/screens/IngredientSelection.tsx index 6fb8d4c..ec589a2 100644 --- a/LeftOvers/screens/IngredientSelection.tsx +++ b/LeftOvers/screens/IngredientSelection.tsx @@ -37,7 +37,7 @@ export default function IngredientSelection(props) { setResponse(filtered); } } catch (error) { - console.log(error); + console.error(error); } finally { setIsLoading(false); } @@ -52,7 +52,7 @@ const loadIngredients = async () => { try { setResponse(await ingredientService.getAllIngredient()); } catch (error) { - console.log(error); + console.error(error); } finally { setIsLoading(false); } @@ -95,7 +95,7 @@ const loadIngredients = async () => { const existingAvailableIngredient = await AsyncStorage.getItem('ingredient'); return JSON.parse(existingAvailableIngredient) || []; } catch (error) { - console.log(error); + console.error(error); return []; } } @@ -125,7 +125,7 @@ const fetchAvailableIngredient = async () => { } } catch(error){ - console.log("Error occured during the addition of Ingredient:", error) + console.error("Error occured during the addition of Ingredient:", error) } }; @@ -139,7 +139,7 @@ const fetchAvailableIngredient = async () => { ChangeAvailableSize(true) } catch (error){ - console.log("Error occured during the suppression of Ingredient:", error) + console.error("Error occured during the suppression of Ingredient:", error) } }; @@ -187,7 +187,7 @@ const fetchAvailableIngredient = async () => { const ingredientsByLetter = await ingredientService.getIngredientByLetter(letter); setResponse(ingredientsByLetter); } catch (error) { - console.log(error); + console.error(error); } finally { setIsLoading(false); } diff --git a/LeftOvers/screens/ModifyProfile.tsx b/LeftOvers/screens/ModifyProfile.tsx index 60a37b3..771c502 100644 --- a/LeftOvers/screens/ModifyProfile.tsx +++ b/LeftOvers/screens/ModifyProfile.tsx @@ -21,10 +21,9 @@ export default function ModifyProfile(props) { const profiles = JSON.parse(existingProfiles) || []; const matchedProfile = profiles.find(profile => profile.name === profileName); - console.log("Le profil choisit : " + matchedProfile); return matchedProfile || null; } catch (error) { - console.log("Erreur lors de la récupération du profil :", error); + console.error("Erreur lors de la récupération du profil :", error); return null; } }; @@ -45,7 +44,7 @@ useEffect(() => { - (console.log("Profile Modified"))}> + console.log("")}> diff --git a/LeftOvers/screens/RecipeDetails.tsx b/LeftOvers/screens/RecipeDetails.tsx index 33a0a72..553584c 100644 --- a/LeftOvers/screens/RecipeDetails.tsx +++ b/LeftOvers/screens/RecipeDetails.tsx @@ -102,7 +102,6 @@ export default function RecipeDetails({ route }) { return categories[0]; } - console.log("LA LISTE DES CATEGORY : " + categories) let bestMatch = { category: '', similarity: 0 }; for (const [name, categoriesList] of Object.entries(categoryMappings)) { @@ -119,20 +118,15 @@ export default function RecipeDetails({ route }) { function getImageForRecipe(recipeName: string) { const categories = []; - console.log("NAAAAAME : " + recipeName) for (const [category, words] of Object.entries(imagesDictionary)) { const matchedWords = words.filter((word) => recipeName.toLowerCase().includes(word)); - console.log("Matched Word : " + matchedWords) if (matchedWords.length > 0) { categories.push(category); - console.log(category) } } - console.log("ON ENTRE DANS LA 2EME FONCTION"); const categoryName = getCategoryFromList(categories); - console.log("CategoryName à la fin : " + categoryName); switch (categoryName) { case 'meat': @@ -179,10 +173,9 @@ export default function RecipeDetails({ route }) { const loadRecipe = async () => { try { const recipe = await recipesService.getRecipeById(recipeId); - console.log("Recipe.name: "+recipe.name) setResponse(recipe); } catch (error) { - console.log(error); + console.error(error); } finally{ setIsLoading(false) } diff --git a/LeftOvers/screens/RecipeSuggestion.tsx b/LeftOvers/screens/RecipeSuggestion.tsx index 2e6cb14..02a0149 100644 --- a/LeftOvers/screens/RecipeSuggestion.tsx +++ b/LeftOvers/screens/RecipeSuggestion.tsx @@ -99,7 +99,7 @@ export default function RecipeSuggestion({ route, navigation }) { } } catch (error) { - console.log(error) + console.error(error) } };