diff --git a/LeftOvers/assets/images/Carrot_Cake.png b/LeftOvers/assets/images/Carrot_Cake.png new file mode 100644 index 0000000..1b05ae8 Binary files /dev/null and b/LeftOvers/assets/images/Carrot_Cake.png differ diff --git a/LeftOvers/assets/images/Meat_and_Rice.png b/LeftOvers/assets/images/Meat_and_Rice.png new file mode 100644 index 0000000..4027f20 Binary files /dev/null and b/LeftOvers/assets/images/Meat_and_Rice.png differ diff --git a/LeftOvers/assets/images/Seafood_Rice.png b/LeftOvers/assets/images/Seafood_Rice.png new file mode 100644 index 0000000..a636688 Binary files /dev/null and b/LeftOvers/assets/images/Seafood_Rice.png differ diff --git a/LeftOvers/assets/images/cake.png b/LeftOvers/assets/images/cake.png new file mode 100644 index 0000000..652fc8c Binary files /dev/null and b/LeftOvers/assets/images/cake.png differ diff --git a/LeftOvers/assets/images/egg.png b/LeftOvers/assets/images/egg.png new file mode 100644 index 0000000..741e566 Binary files /dev/null and b/LeftOvers/assets/images/egg.png differ diff --git a/LeftOvers/assets/images/fish.png b/LeftOvers/assets/images/fish.png new file mode 100644 index 0000000..7fd29ae Binary files /dev/null and b/LeftOvers/assets/images/fish.png differ diff --git a/LeftOvers/assets/images/fish_meat.png b/LeftOvers/assets/images/fish_meat.png new file mode 100644 index 0000000..089ddd5 Binary files /dev/null and b/LeftOvers/assets/images/fish_meat.png differ diff --git a/LeftOvers/assets/images/inconnu.png b/LeftOvers/assets/images/inconnu.png new file mode 100644 index 0000000..ae701f4 Binary files /dev/null and b/LeftOvers/assets/images/inconnu.png differ diff --git a/LeftOvers/assets/images/meat_with_vegetables.png b/LeftOvers/assets/images/meat_with_vegetables.png new file mode 100644 index 0000000..c83cca6 Binary files /dev/null and b/LeftOvers/assets/images/meat_with_vegetables.png differ diff --git a/LeftOvers/assets/images/mushroom.png b/LeftOvers/assets/images/mushroom.png new file mode 100644 index 0000000..8f43efe Binary files /dev/null and b/LeftOvers/assets/images/mushroom.png differ diff --git a/LeftOvers/assets/images/noRecipes.jpg b/LeftOvers/assets/images/noRecipes.jpg new file mode 100644 index 0000000..d27b8a1 Binary files /dev/null and b/LeftOvers/assets/images/noRecipes.jpg differ diff --git a/LeftOvers/assets/images/pasta.png b/LeftOvers/assets/images/pasta.png new file mode 100644 index 0000000..785bdd9 Binary files /dev/null and b/LeftOvers/assets/images/pasta.png differ diff --git a/LeftOvers/assets/images/pie.png b/LeftOvers/assets/images/pie.png new file mode 100644 index 0000000..7d45f3e Binary files /dev/null and b/LeftOvers/assets/images/pie.png differ diff --git a/LeftOvers/assets/images/pizza.png b/LeftOvers/assets/images/pizza.png new file mode 100644 index 0000000..45092ea Binary files /dev/null and b/LeftOvers/assets/images/pizza.png differ diff --git a/LeftOvers/assets/images/riceEgg.png b/LeftOvers/assets/images/riceEgg.png new file mode 100644 index 0000000..a8067f4 Binary files /dev/null and b/LeftOvers/assets/images/riceEgg.png differ diff --git a/LeftOvers/assets/images/rice_fish.png b/LeftOvers/assets/images/rice_fish.png new file mode 100644 index 0000000..4efa881 Binary files /dev/null and b/LeftOvers/assets/images/rice_fish.png differ diff --git a/LeftOvers/assets/images/rice_meat.png b/LeftOvers/assets/images/rice_meat.png new file mode 100644 index 0000000..4027f20 Binary files /dev/null and b/LeftOvers/assets/images/rice_meat.png differ diff --git a/LeftOvers/assets/images/rice_vegetables.png b/LeftOvers/assets/images/rice_vegetables.png new file mode 100644 index 0000000..a37a2fa Binary files /dev/null and b/LeftOvers/assets/images/rice_vegetables.png differ diff --git a/LeftOvers/assets/images/soupMeat.png b/LeftOvers/assets/images/soupMeat.png new file mode 100644 index 0000000..bba50ca Binary files /dev/null and b/LeftOvers/assets/images/soupMeat.png differ diff --git a/LeftOvers/assets/images/soupVeggie.png b/LeftOvers/assets/images/soupVeggie.png new file mode 100644 index 0000000..5d7e706 Binary files /dev/null and b/LeftOvers/assets/images/soupVeggie.png differ diff --git a/LeftOvers/assets/images/soupfish.png b/LeftOvers/assets/images/soupfish.png new file mode 100644 index 0000000..dd9c7fd Binary files /dev/null and b/LeftOvers/assets/images/soupfish.png differ diff --git a/LeftOvers/assets/images/vegan.png b/LeftOvers/assets/images/vegan.png new file mode 100644 index 0000000..8045ffd Binary files /dev/null and b/LeftOvers/assets/images/vegan.png differ diff --git a/LeftOvers/components/FoodElementText.tsx b/LeftOvers/components/FoodElementText.tsx index abd64a1..f499023 100644 --- a/LeftOvers/components/FoodElementText.tsx +++ b/LeftOvers/components/FoodElementText.tsx @@ -14,7 +14,8 @@ const componentHeight = 60; const componentWidth = 280; -export default function FoodElementText(props : FoodElementTextProps) { +export default function FoodElementText(props : any) { + const colors = useContext(ColorContext).colors const styles = StyleSheet.create({ diff --git a/LeftOvers/components/RecipeElement.tsx b/LeftOvers/components/RecipeElement.tsx index 4152ea1..6c67046 100644 --- a/LeftOvers/components/RecipeElement.tsx +++ b/LeftOvers/components/RecipeElement.tsx @@ -1,12 +1,32 @@ -import React, {useContext} from 'react'; -import {StyleSheet, Pressable, Text, View, Image, ScrollView} from 'react-native'; +import React, {useContext, useState} from 'react'; +import {StyleSheet, Pressable, Text, View, Image, ScrollView, ImageSourcePropType} from 'react-native'; import brochette from '../assets/images/brochette.png'; import Union_left from '../assets/images/Union_left.png'; import Union_right from '../assets/images/Union_right.png'; import background from '../assets/images/Background.png'; +import cake from '../assets/images/cake.png'; +import Carrot_Cake from '../assets/images/Carrot_Cake.png'; +import inconnu from '../assets/images/inconnu.png'; +import fish from '../assets/images/fish.png'; +import fish_meat from '../assets/images/fish_meat.png'; +import vegan from '../assets/images/vegan.png'; +import egg from '../assets/images/egg.png'; +import pizza from '../assets/images/pizza.png'; +import soupVeggie from '../assets/images/soupVeggie.png'; +import soupFish from '../assets/images/soupfish.png' +import soupMeat from '../assets/images/soupMeat.png' +import meat_with_vegetable from '../assets/images/meat_with_vegetables.png'; +import riceVegetable from '../assets/images/rice_vegetables.png'; +import riceMeat from '../assets/images/Meat_and_Rice.png'; +import riceFish from '../assets/images/rice_fish.png'; +import riceEgg from '../assets/images/riceEgg.png'; +import pasta from '../assets/images/pasta.png'; import ColorContext from '../theme/ColorContext'; import Recipes from '../Models/Recipes'; + + + interface RecipeElementProps { recipe: Recipes navigateDetails: any @@ -24,6 +44,143 @@ function convertToHoursMinutes(totalMinutes: number): string { export default function RecipeElement(props: RecipeElementProps) { const {colors} = useContext(ColorContext) + const meatDictionary: string[] = ["beef", "chicken", "turkey", "steak", "rabbit", "duck"] + const porkDictionary: string[] = ["pork", "lardon", "bacon", "ham"] + const fishDictionary: string[] = ["tuna", "whiting", "mullet", "sardine", "mackerel", "salmon", "monkfish", "conger", "bass", "cod", "hake"] + const vegetablesDictionary: string[] = ["vegan", "vegetarian", "lentil", "artichoke", "aubergine", "beet", "chard", "broccoli", "carrot", "celery", "cabbage", "cauliflower", "zucchini", "spinach", "fennel", "curly", "bean", "lettuce", "apple", "corn", "onion", "parsnips", "leek", "pepper", "potato", "pumpkin", "radish", "scarole", "tomato"] + const riceDictionary: string[] = ["ric", "quinoa"] + const eggDictionary: string[] = ["egg", "omelette"]; + const soupDictionary: string[] = ["soup"]; + const pizzaDictionary: string[] = ["pizza"]; + const dessertDictionary: string[] = ['cake', 'cupcake', 'muffin', 'cookie', 'brownie', 'pie', 'tart', 'macaron', 'doughnut', 'eclair', 'pancake', 'waffle', 'crepe', 'pudding', 'gelato', 'sorbet', 'ice cream', 'cheesecake', 'sugar']; + const pastaDictionary: string[] = [ + 'pasta', + 'spaghetti', + 'penne', + 'fettuccine', + 'macaroni', + 'rigatoni', + 'farfalle', + 'linguine', + 'lasagne', + 'ravioli', + 'tortellini', + 'gnocchi', + 'spaetzle', + 'noodles', + 'spatzle', + 'spatzen', + ]; + + const imagesDictionary = { + meat: meatDictionary, + pork: porkDictionary, + fish: fishDictionary, + egg: eggDictionary, + vegetables: vegetablesDictionary, + rice: riceDictionary, + pizza : pizzaDictionary, + soup : soupDictionary, + dessert : dessertDictionary, + pasta : pastaDictionary, + unknown: [], + }; + + function getCategoryFromList(categories: string[]) { + const categoryMappings = { + MeatAndVegetables: ['meat', 'vegetables'], + FishAndMeat: ['fish', 'meat'], + dessertDictionary: ['dessert'], + fruitCake: ['vegetables', 'dessert'], + riceEgg: ['rice', 'egg'], + riceMeat: ['rice', 'meat'], + riceFish: ['rice', 'fish'], + riceVegetable: ['rice', 'vegetables'], + soupMeat: ['soup', 'meat'], + soupVeggie: ['soup', 'vegetables'], + soupFish: ['soup', 'fish'], + }; + + if(categories.length == 1){ + return categories[0]; + } + + console.log("LA LISTE DES CATEGORY : " + categories) + let bestMatch = { category: '', similarity: 0 }; + + for (const [name, categoriesList] of Object.entries(categoryMappings)) { + const matchingCategories = categories.filter(category => categoriesList.includes(category)); + const similarity = matchingCategories.length; + + if (similarity > bestMatch.similarity) { + bestMatch = { category: name, similarity }; + } + } + + return bestMatch.category; + } + + 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': + return brochette; + case 'pork': + return brochette; + case 'fish': + return fish; + case 'vegetables': + return vegan; + case 'pasta': + return pasta; + case 'MeatAndVegetables': + return meat_with_vegetable; + case 'FishAndMeat': + return fish_meat; + case 'egg': + return egg; + case 'dessert': + return cake; + case 'fruitCake': + return Carrot_Cake; + case 'riceEgg': + return riceEgg; + case 'riceMeat': + return riceMeat; + case 'riceFish': + return riceFish; + case 'riceVegetable': + return riceVegetable; + case 'pizza': + return pizza; + case 'soupVeggie': + return soupVeggie; + case 'soupMeat': + return soupMeat; + case 'soupFish': + return soupFish; + default: + return inconnu; + } + } + + + const styles = StyleSheet.create({ button: { @@ -87,7 +244,7 @@ export default function RecipeElement(props: RecipeElementProps) { {props.recipe.id} {props.recipe.name} - + Ingredients diff --git a/LeftOvers/components/RecipeElementReduce.tsx b/LeftOvers/components/RecipeElementReduce.tsx index bea510c..9a51467 100644 --- a/LeftOvers/components/RecipeElementReduce.tsx +++ b/LeftOvers/components/RecipeElementReduce.tsx @@ -10,6 +10,7 @@ interface RecipeElementReduceProps { title : string image : string | null duration : string + imageRecipe: any } export default function RecipeElementReduce(props: RecipeElementReduceProps) { @@ -65,7 +66,7 @@ export default function RecipeElementReduce(props: RecipeElementReduceProps) { {props.number} {props.title} - + {props.duration} diff --git a/LeftOvers/screens/IngredientSelection.tsx b/LeftOvers/screens/IngredientSelection.tsx index e3ca9b9..1bd07a7 100644 --- a/LeftOvers/screens/IngredientSelection.tsx +++ b/LeftOvers/screens/IngredientSelection.tsx @@ -3,7 +3,6 @@ import { View, StyleSheet, Text, Image, Pressable, ActivityIndicator, FlatList, import { SafeAreaProvider } from 'react-native-safe-area-context'; import { Searchbar } from 'react-native-paper'; import { LinearGradient } from 'expo-linear-gradient'; - import FoodElementText from '../components/FoodElementText'; import Ingredient from '../Models/Ingredient'; import IngredientService from '../Services/Ingredients/IngredientsServices'; @@ -66,33 +65,29 @@ const loadIngredients = async () => { ChangeAvailableSize(true) }, []); - const AvailableItem = ({ value }: { value: Ingredient }) => ( + const AvailableItem = React.memo(({ value }: { value: Ingredient }) => ( <> - SelectIngredient(value)}> - - + SelectIngredient(value)}> - ); + )); - const ChooseItem = ({ value }: { value: Ingredient }) => ( + const ChooseItem = React.memo(({ value }: { value: Ingredient }) => ( <> - RemoveIngredient(value.id)}> - - + RemoveIngredient(value.id)}> - ); + )); const handleGetAvailableIngredient = async () => { try { diff --git a/LeftOvers/screens/RecipeDetails.tsx b/LeftOvers/screens/RecipeDetails.tsx index 39282e5..33a0a72 100644 --- a/LeftOvers/screens/RecipeDetails.tsx +++ b/LeftOvers/screens/RecipeDetails.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState, useContext } from 'react'; import { View, StyleSheet, Text, ScrollView, useWindowDimensions} from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; - import RecipeElementReduce from '../components/RecipeElementReduce'; import RecipesService from '../Services/Recipes/RecipesServices'; import Recipes from '../Models/Recipes'; @@ -9,6 +8,25 @@ import { LinearGradient } from 'expo-linear-gradient'; import ListWithoutSelect from '../components/ListWithoutSelect'; import ColorContext from '../theme/ColorContext'; import Ingredient from '../Models/Ingredient'; +import cake from '../assets/images/cake.png'; +import Carrot_Cake from '../assets/images/Carrot_Cake.png'; +import inconnu from '../assets/images/inconnu.png'; +import fish from '../assets/images/fish.png'; +import fish_meat from '../assets/images/fish_meat.png'; +import vegan from '../assets/images/vegan.png'; +import egg from '../assets/images/egg.png'; +import pizza from '../assets/images/pizza.png'; +import soupVeggie from '../assets/images/soupVeggie.png'; +import soupFish from '../assets/images/soupfish.png' +import soupMeat from '../assets/images/soupMeat.png' +import meat_with_vegetable from '../assets/images/meat_with_vegetables.png'; +import riceVegetable from '../assets/images/rice_vegetables.png'; +import riceMeat from '../assets/images/Meat_and_Rice.png'; +import riceFish from '../assets/images/rice_fish.png'; +import riceEgg from '../assets/images/riceEgg.png'; +import brochette from '../assets/images/brochette.png'; +import pasta from '../assets/images/pasta.png'; + export default function RecipeDetails({ route }) { @@ -23,6 +41,141 @@ export default function RecipeDetails({ route }) { const { recipeId } = route.params; + const meatDictionary: string[] = ["beef", "chicken", "turkey", "steak", "rabbit", "duck"] + const porkDictionary: string[] = ["pork", "lardon", "bacon", "ham"] + const fishDictionary: string[] = ["tuna", "whiting", "mullet", "sardine", "mackerel", "salmon", "monkfish", "conger", "bass", "cod", "hake"] + const vegetablesDictionary: string[] = ["vegan", "vegetarian", "lentil", "artichoke", "aubergine", "beet", "chard", "broccoli", "carrot", "celery", "cabbage", "cauliflower", "zucchini", "spinach", "fennel", "curly", "bean", "lettuce", "apple", "corn", "onion", "parsnips", "leek", "pepper", "potato", "pumpkin", "radish", "scarole", "tomato"] + const riceDictionary: string[] = ["ric", "quinoa"] + const eggDictionary: string[] = ["egg", "omelette"]; + const soupDictionary: string[] = ["soup"]; + const pizzaDictionary: string[] = ["pizza"]; + const dessertDictionary: string[] = ['cake', 'cupcake', 'muffin', 'cookie', 'brownie', 'pie', 'tart', 'macaron', 'doughnut', 'eclair', 'pancake', 'waffle', 'crepe', 'pudding', 'gelato', 'sorbet', 'ice cream', 'cheesecake', 'sugar']; + const pastaDictionary: string[] = [ + 'pasta', + 'spaghetti', + 'penne', + 'fettuccine', + 'macaroni', + 'rigatoni', + 'farfalle', + 'linguine', + 'lasagne', + 'ravioli', + 'tortellini', + 'gnocchi', + 'spaetzle', + 'noodles', + 'spatzle', + 'spatzen', + ]; + + const imagesDictionary = { + meat: meatDictionary, + pork: porkDictionary, + fish: fishDictionary, + egg: eggDictionary, + vegetables: vegetablesDictionary, + rice: riceDictionary, + pizza : pizzaDictionary, + soup : soupDictionary, + dessert : dessertDictionary, + pasta : pastaDictionary, + unknown: [], + }; + + function getCategoryFromList(categories: string[]) { + const categoryMappings = { + MeatAndVegetables: ['meat', 'vegetables'], + FishAndMeat: ['fish', 'meat'], + dessertDictionary: ['dessert'], + fruitCake: ['vegetables', 'dessert'], + riceEgg: ['rice', 'egg'], + riceMeat: ['rice', 'meat'], + riceFish: ['rice', 'fish'], + riceVegetable: ['rice', 'vegetables'], + soupMeat: ['soup', 'meat'], + soupVeggie: ['soup', 'vegetables'], + soupFish: ['soup', 'fish'], + }; + + if(categories.length == 1){ + return categories[0]; + } + + console.log("LA LISTE DES CATEGORY : " + categories) + let bestMatch = { category: '', similarity: 0 }; + + for (const [name, categoriesList] of Object.entries(categoryMappings)) { + const matchingCategories = categories.filter(category => categoriesList.includes(category)); + const similarity = matchingCategories.length; + + if (similarity > bestMatch.similarity) { + bestMatch = { category: name, similarity }; + } + } + + return bestMatch.category; + } + + 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': + return brochette; + case 'pork': + return brochette; + case 'fish': + return fish; + case 'vegetables': + return vegan; + case 'pasta': + return pasta; + case 'MeatAndVegetables': + return meat_with_vegetable; + case 'FishAndMeat': + return fish_meat; + case 'egg': + return egg; + case 'dessert': + return cake; + case 'fruitCake': + return Carrot_Cake; + case 'riceEgg': + return riceEgg; + case 'riceMeat': + return riceMeat; + case 'riceFish': + return riceFish; + case 'riceVegetable': + return riceVegetable; + case 'pizza': + return pizza; + case 'soupVeggie': + return soupVeggie; + case 'soupMeat': + return soupMeat; + case 'soupFish': + return soupFish; + default: + return inconnu; + } + } + const loadRecipe = async () => { try { const recipe = await recipesService.getRecipeById(recipeId); @@ -98,6 +251,7 @@ export default function RecipeDetails({ route }) {