ProfileService (addProfile)
continuous-integration/drone/push Build is passing Details

pull/24/head^2
Louison PARANT 1 year ago
parent b7e51a2fa0
commit d1bfdce68d

@ -2,6 +2,6 @@ import Profile from "../../Models/Profile";
export default interface IProfileService { export default interface IProfileService {
getProfiles(): Promise<Profile[]>, getProfiles(): Promise<Profile[]>,
addProfile(new_profile: Profile): Promise<boolean>, addProfile(newProfile: Profile): Promise<boolean>,
delProfile(profile_name_to_del: string): Promise<boolean> delProfile(profile_name_to_del: string): Promise<boolean>
} }

@ -1,10 +1,11 @@
import Profile from "../../Models/Profile"; import Profile from "../../Models/Profile";
import IProfileService from "./IProfileService"; import IProfileService from "./IProfileService";
import AsyncStorage from "@react-native-async-storage/async-storage"; import AsyncStorage from "@react-native-async-storage/async-storage";
import eventEmitter from "../../screens/EventEmitter";
export default class ProfileService implements IProfileService { export default class ProfileService implements IProfileService {
async getProfiles(): Promise<Profile[]> { async getProfiles(): Promise<Profile[]> {
const results = await AsyncStorage.getItem('profiles'); const results = await AsyncStorage.getItem('profiles')
const existingProfiles = JSON.parse(results) const existingProfiles = JSON.parse(results)
if(existingProfiles.length == 0){ if(existingProfiles.length == 0){
existingProfiles.push(new Profile("None", "logo.png", [], [], "none", "none")) existingProfiles.push(new Profile("None", "logo.png", [], [], "none", "none"))
@ -12,15 +13,12 @@ export default class ProfileService implements IProfileService {
return existingProfiles; return existingProfiles;
} }
async addProfile(new_profile : Profile): Promise<boolean> { async addProfile(newProfile : Profile): Promise<boolean> {
const existingProfiles = await this.getProfiles() let existingProfiles = await AsyncStorage.getItem('profiles');
for (let current_profile of existingProfiles) { existingProfiles = existingProfiles ? JSON.parse(existingProfiles) : [];
if (current_profile.name == new_profile.name) { const updatedProfiles = [...existingProfiles, newProfile];
console.log("Tried to create a profil already existing !") await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles));
return false eventEmitter.emit("profileAdded")
}
}
await AsyncStorage.setItem('profiles', JSON.stringify([...existingProfiles, new_profile]))
return true return true
} }

@ -37,7 +37,7 @@ export default function ProfilesStackScreen({ navigation }) {
const _handleSearch = () => { const _handleSearch = () => {
console.log('Searching'); console.log('Searching');
} }
const _handleHeaderAdd = () => navigation.navigate('ProfileCreation', { name: String }); const _handleHeaderAdd = () => navigation.navigate('ProfileCreation');
return ( return (
<ProfilesStack.Navigator> <ProfilesStack.Navigator>

@ -8,7 +8,7 @@ import ListWithoutSelect from '../components/ListWithoutSelect';
import ListSelect from '../components/ListSelect'; import ListSelect from '../components/ListSelect';
import EventEmitter from './EventEmitter'; import EventEmitter from './EventEmitter';
import * as ImagePicker from 'expo-image-picker'; 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) { export default function CreateProfile(props) {
@ -19,6 +19,7 @@ export default function CreateProfile(props) {
const [avatar, setAvatar] = useState<string>(''); const [avatar, setAvatar] = useState<string>('');
const [selectedDiets, setSelectedDiets] = useState([]); const [selectedDiets, setSelectedDiets] = useState([]);
const [selectedAllergies] = useState([]) const [selectedAllergies] = useState([])
const profileService = new ProfileService()
const handleSelectedDiets = (selectedValues) => { const handleSelectedDiets = (selectedValues) => {
setSelectedDiets(selectedValues); setSelectedDiets(selectedValues);
@ -48,7 +49,6 @@ export default function CreateProfile(props) {
const handleCreateProfile = async () => { const handleCreateProfile = async () => {
try { try {
// Ton code pour récupérer les profils existants et ajouter un nouveau profil
const newProfile = { const newProfile = {
name: name, name: name,
avatar: avatar, avatar: avatar,
@ -57,14 +57,7 @@ export default function CreateProfile(props) {
isActive: "flex", isActive: "flex",
isWaiting: "none", isWaiting: "none",
}; };
profileService.addProfile(newProfile)
// 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);
props.navigation.goBack(); props.navigation.goBack();
} catch (error) { } catch (error) {
console.error('Erreur lors de la création du profil :', error); console.error('Erreur lors de la création du profil :', error);

@ -2,14 +2,14 @@ import React, {useContext, useState, useEffect} from 'react';
import {StyleSheet, View, Text, ScrollView, useWindowDimensions} from 'react-native'; import {StyleSheet, View, Text, ScrollView, useWindowDimensions} from 'react-native';
import {LinearGradient} from 'expo-linear-gradient'; import {LinearGradient} from 'expo-linear-gradient';
import {SafeAreaProvider} from 'react-native-safe-area-context'; import {SafeAreaProvider} from 'react-native-safe-area-context';
import ValidateButton from '../components/ValidateButton'; import ValidateButton from '../components/ValidateButton';
import ListSelect from '../components/ListSelect'; import ListSelect from '../components/ListSelect';
import ListWithoutSelect from '../components/ListWithoutSelect'; import ListWithoutSelect from '../components/ListWithoutSelect';
import ProfileSelection from '../components/ProfileSelection'; import ProfileSelection from '../components/ProfileSelection';
import ColorContext from '../theme/ColorContext'; import ColorContext from '../theme/ColorContext';
import EventEmitter from './EventEmitter'; import eventEmitter from './EventEmitter';
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import ProfileService from '../Services/Profiles/ProfileService';
export default function FiltersSelection(props) { export default function FiltersSelection(props) {
const {colors} = useContext(ColorContext); const {colors} = useContext(ColorContext);
@ -17,52 +17,33 @@ export default function FiltersSelection(props) {
{name: "None", avatar: "logo.png", diets: [], allergies: [], isActive: "none", isWaiting: "none"}, {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 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 [profiles, setProfiles] = useState(profilesHand);
const [dieProfiles, setDieProfiles] = useState([]) const [dieProfiles, setDieProfiles] = useState([])
const [allProfiles, setAllProfiles] = useState([]) const [allProfiles, setAllProfiles] = useState([])
const [dieAdd, setDieAdd] = useState([]) const [dieAdd, setDieAdd] = useState([])
const [allAdd, setAllAdd] = useState([]) const [allAdd, setAllAdd] = useState([])
const [selectedDiets, setSelectedDiets] = 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 fetchProfiles = async () => {
const existingProfiles = await handleGetProfiles() setProfiles(await profileService.getProfiles())
if(existingProfiles.length != 0){
setProfiles(existingProfiles)
} }
else{
setProfiles(profilesHand)
}
};
const subscriptionAddProfile = EventEmitter.addListener('profileAdded', async () => { const subscriptionAddProfile = eventEmitter.addListener('profileAdded', async () => {
fetchProfiles() fetchProfiles()
console.log("Technique de Shinobi Anti-CodeSmell", selectedDiets) console.log("Technique de Shinobi Anti-CodeSmell", selectedDiets)
isProfileAdded = true
subscriptionAddProfile.remove() subscriptionAddProfile.remove()
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
EventEmitter.removeAllListeners('updateDietsAllergies') eventEmitter.removeAllListeners('updateDietsAllergies')
EventEmitter.removeAllListeners('selectedProfilesUpdated') eventEmitter.removeAllListeners('selectedProfilesUpdated')
}); });
const subscriptionUpdateDietsAllergies = EventEmitter.addListener('updateDietsAllergies', async() => { const subscriptionUpdateDietsAllergies = eventEmitter.addListener('updateDietsAllergies', async() => {
setDieAdd(die.filter(isInProfileDiets)) setDieAdd(die.filter(isInProfileDiets))
setAllAdd([]) setAllAdd([])
isUpdateDietsAllergies = true
subscriptionUpdateDietsAllergies.remove() subscriptionUpdateDietsAllergies.remove()
subscriptionUpdateProfiles.remove(); subscriptionUpdateProfiles.remove();
EventEmitter.removeAllListeners('updateDietsAllergies') eventEmitter.removeAllListeners('updateDietsAllergies')
}) })
useEffect(() => { useEffect(() => {
@ -84,22 +65,21 @@ export default function FiltersSelection(props) {
}) })
await AsyncStorage.setItem('profiles', JSON.stringify(profiles)); await AsyncStorage.setItem('profiles', JSON.stringify(profiles));
fetchProfiles() fetchProfiles()
EventEmitter.emit("selectedProfilesUpdated") eventEmitter.emit("selectedProfilesUpdated")
} catch (error) { } catch (error) {
console.error('Error occured when updating active profiles:', error); console.error('Error occured when updating active profiles:', error);
} }
}; };
const subscriptionUpdateProfiles = EventEmitter.addListener('selectedProfilesUpdated', async () => { const subscriptionUpdateProfiles = eventEmitter.addListener('selectedProfilesUpdated', async () => {
updateDiets() updateDiets()
updateAllergies() updateAllergies()
EventEmitter.emit("updateDietsAllergies") eventEmitter.emit("updateDietsAllergies")
isSelectedProfilesUpdated = true
console.log("Filters Selection: ---------------------------------------------------") console.log("Filters Selection: ---------------------------------------------------")
subscriptionUpdateProfiles.remove(); subscriptionUpdateProfiles.remove();
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
EventEmitter.removeAllListeners('updateDietsAllergies') eventEmitter.removeAllListeners('updateDietsAllergies')
EventEmitter.removeAllListeners('selectedProfilesUpdated') eventEmitter.removeAllListeners('selectedProfilesUpdated')
}); });
const updateDiets = () => { const updateDiets = () => {
@ -258,22 +238,6 @@ export default function FiltersSelection(props) {
const goBack = () => props.navigation.goBack(); 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 ( return (
<SafeAreaProvider style={{flex: 1}}> <SafeAreaProvider style={{flex: 1}}>
<ScrollView> <ScrollView>

@ -9,7 +9,7 @@ import ColorContext from '../theme/ColorContext';
import bracketLeft from '../assets/images/angle_bracket_left.png'; import bracketLeft from '../assets/images/angle_bracket_left.png';
import bracketRight from '../assets/images/angle_bracket_right.png'; import bracketRight from '../assets/images/angle_bracket_right.png';
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import EventEmitter from './EventEmitter'; import eventEmitter from './EventEmitter';
import ProfileService from '../Services/Profiles/ProfileService'; import ProfileService from '../Services/Profiles/ProfileService';
export default function HomePage({ navigation, props }) { 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 () => { const fetchProfiles = async () => {
setProfiles(await profileService.getProfiles()) 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(); fetchProfiles();
subscriptionAddProfile.remove(); subscriptionAddProfile.remove();
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
EventEmitter.removeAllListeners('profileDeleted') eventEmitter.removeAllListeners('profileDeleted')
EventEmitter.removeAllListeners('ingredientAdded') eventEmitter.removeAllListeners('ingredientAdded')
EventEmitter.removeAllListeners('ingredientDeleted') eventEmitter.removeAllListeners('ingredientDeleted')
EventEmitter.removeAllListeners('selectedProfilesUpdated') eventEmitter.removeAllListeners('selectedProfilesUpdated')
}); });
const subscriptionDeleteProfile = EventEmitter.addListener('profileDeleted', async () => { const subscriptionDeleteProfile = eventEmitter.addListener('profileDeleted', async () => {
if (profiles.length == 1){ if (profiles.length == 1){
setProfiles(profilesHand) setProfiles(profilesHand)
} }
@ -87,24 +77,24 @@ export default function HomePage({ navigation, props }) {
fetchProfiles(); fetchProfiles();
} }
subscriptionDeleteProfile.remove(); subscriptionDeleteProfile.remove();
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
EventEmitter.removeAllListeners('profileDeleted') eventEmitter.removeAllListeners('profileDeleted')
EventEmitter.removeAllListeners('ingredientAdded') eventEmitter.removeAllListeners('ingredientAdded')
EventEmitter.removeAllListeners('ingredientDeleted') eventEmitter.removeAllListeners('ingredientDeleted')
EventEmitter.removeAllListeners('selectedProfilesUpdated') eventEmitter.removeAllListeners('selectedProfilesUpdated')
}); });
const subscriptionAddIngredient = EventEmitter.addListener('ingredientAdded', async () => { const subscriptionAddIngredient = eventEmitter.addListener('ingredientAdded', async () => {
fetchAvailableIngredient(); fetchAvailableIngredient();
subscriptionAddIngredient.remove(); subscriptionAddIngredient.remove();
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
EventEmitter.removeAllListeners('profileDeleted') eventEmitter.removeAllListeners('profileDeleted')
EventEmitter.removeAllListeners('ingredientAdded') eventEmitter.removeAllListeners('ingredientAdded')
EventEmitter.removeAllListeners('ingredientDeleted') eventEmitter.removeAllListeners('ingredientDeleted')
EventEmitter.removeAllListeners('selectedProfilesUpdated') eventEmitter.removeAllListeners('selectedProfilesUpdated')
}); });
const subscriptionDeleteIngredient = EventEmitter.addListener('ingredientDeleted', async () => { const subscriptionDeleteIngredient = eventEmitter.addListener('ingredientDeleted', async () => {
if (ingredientList.length == 1){ if (ingredientList.length == 1){
setIngredientList(ingredientListHand) setIngredientList(ingredientListHand)
} }
@ -112,21 +102,21 @@ export default function HomePage({ navigation, props }) {
fetchAvailableIngredient(); fetchAvailableIngredient();
} }
subscriptionDeleteIngredient.remove(); subscriptionDeleteIngredient.remove();
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
EventEmitter.removeAllListeners('profileDeleted') eventEmitter.removeAllListeners('profileDeleted')
EventEmitter.removeAllListeners('ingredientAdded') eventEmitter.removeAllListeners('ingredientAdded')
EventEmitter.removeAllListeners('ingredientDeleted') eventEmitter.removeAllListeners('ingredientDeleted')
EventEmitter.removeAllListeners('selectedProfilesUpdated') eventEmitter.removeAllListeners('selectedProfilesUpdated')
}); });
const subscriptionUpdateSelectedProfile = EventEmitter.addListener('selectedProfilesUpdated', async () => { const subscriptionUpdateSelectedProfile = eventEmitter.addListener('selectedProfilesUpdated', async () => {
fetchProfiles(); fetchProfiles();
subscriptionUpdateSelectedProfile.remove(); subscriptionUpdateSelectedProfile.remove();
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
EventEmitter.removeAllListeners('profileDeleted') eventEmitter.removeAllListeners('profileDeleted')
EventEmitter.removeAllListeners('ingredientAdded') eventEmitter.removeAllListeners('ingredientAdded')
EventEmitter.removeAllListeners('ingredientDeleted') eventEmitter.removeAllListeners('ingredientDeleted')
EventEmitter.removeAllListeners('selectedProfilesUpdated') eventEmitter.removeAllListeners('selectedProfilesUpdated')
}); });
useEffect(() => { useEffect(() => {

@ -15,9 +15,6 @@ export default function ModifyProfile(props) {
const [profile, setProfile] = useState(null); const [profile, setProfile] = useState(null);
const route = useRoute(); const route = useRoute();
const handleGetProfileByName = async (profileName) => { const handleGetProfileByName = async (profileName) => {
try { try {
const existingProfiles = await AsyncStorage.getItem('profiles'); const existingProfiles = await AsyncStorage.getItem('profiles');
@ -35,7 +32,7 @@ export default function ModifyProfile(props) {
const fetchProfiles = async () => { const fetchProfiles = async () => {
const selectedProfil = await handleGetProfileByName(route.params); const selectedProfil = await handleGetProfileByName(route.params);
setProfile(selectedProfil); setProfile(selectedProfil);
}; };
useEffect(() => { useEffect(() => {
fetchProfiles(); fetchProfiles();

@ -3,23 +3,22 @@ import { StyleSheet, View, Modal, Pressable, Text, Image, ScrollView, useWindowD
import { LinearGradient } from 'expo-linear-gradient'; import { LinearGradient } from 'expo-linear-gradient';
import { SafeAreaProvider } from 'react-native-safe-area-context'; import { SafeAreaProvider } from 'react-native-safe-area-context';
import ProfileService from '../Services/Profiles/ProfileService';
import ProfileDetails from '../components/ProfileDetails'; import ProfileDetails from '../components/ProfileDetails';
import ColorContext from '../theme/ColorContext'; import ColorContext from '../theme/ColorContext';
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import EventEmitter from './EventEmitter'; import eventEmitter from './EventEmitter';
import { PaperProvider, Portal } from 'react-native-paper'; import { PaperProvider, Portal } from 'react-native-paper';
export default function Profiles({navigation, props}) { export default function Profiles({navigation, props}) {
const colors = useContext(ColorContext).colors const colors = useContext(ColorContext).colors
const profileService = new ProfileService()
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [profiles, setProfiles] = useState([]); const [profiles, setProfiles] = useState([]);
const [selectedProfileIndex, setSelectedProfileIndex] = useState(null); const [selectedProfileIndex, setSelectedProfileIndex] = useState(null);
const goDetails = (name: string) => navigation.navigate('ProfileCreation', name); const goDetails = (name: string) => navigation.navigate('ProfileCreation', name);
const raisePopUp = (index) => { const raisePopUp = (index) => {
setSelectedProfileIndex(index) setSelectedProfileIndex(index)
setVisible(true) setVisible(true)
@ -32,7 +31,7 @@ export default function Profiles({navigation, props}) {
try { try {
const updatedProfiles = profiles.filter((profile, i) => i !== index); const updatedProfiles = profiles.filter((profile, i) => i !== index);
await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles)); await AsyncStorage.setItem('profiles', JSON.stringify(updatedProfiles));
EventEmitter.emit('profileDeleted'); eventEmitter.emit('profileDeleted');
fetchProfiles(); fetchProfiles();
setSelectedProfileIndex(index); setSelectedProfileIndex(index);
erasePopUp(); 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 fetchProfiles = async () => {
const existingProfiles = await handleGetProfiles(); setProfiles(await profileService.getProfiles())
setProfiles(existingProfiles); }
};
const subscription = EventEmitter.addListener('profileAdded', async () => { const subscription = eventEmitter.addListener('profileAdded', async () => {
fetchProfiles(); fetchProfiles();
console.log("Profiles sub Added: ------------------------------------")
subscription.remove(); subscription.remove();
EventEmitter.removeAllListeners('profileAdded') eventEmitter.removeAllListeners('profileAdded')
}); });
useEffect(() => { useEffect(() => {

Loading…
Cancel
Save