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(() => {