From 704f8d9682e20dd6da8823d624fa2f5b6cdc5004 Mon Sep 17 00:00:00 2001 From: Louison PARANT Date: Fri, 8 Dec 2023 11:06:49 +0100 Subject: [PATCH] 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(() => {