|
|
@ -19,7 +19,9 @@ export default function IngredientSelection(props) {
|
|
|
|
const [selectedIngredients, setSelectedIngredients] = useState([]);
|
|
|
|
const [selectedIngredients, setSelectedIngredients] = useState([]);
|
|
|
|
const ingredientService = new IngredientService();
|
|
|
|
const ingredientService = new IngredientService();
|
|
|
|
const {colors} = useContext(ColorContext);
|
|
|
|
const {colors} = useContext(ColorContext);
|
|
|
|
|
|
|
|
const [availableSize, setAvailableSize] = useState(0);
|
|
|
|
|
|
|
|
const [listVisibility, setListVisibility] = useState("none");
|
|
|
|
|
|
|
|
const [availableVisibility, setAvailableVisibility] = useState("none");
|
|
|
|
const [searchQuery, setSearchQuery] = useState('');
|
|
|
|
const [searchQuery, setSearchQuery] = useState('');
|
|
|
|
|
|
|
|
|
|
|
|
const filterIngredients = async (query) => {
|
|
|
|
const filterIngredients = async (query) => {
|
|
|
@ -63,10 +65,10 @@ const loadIngredients = async () => {
|
|
|
|
<View style={styles.horizontalAlignment}>
|
|
|
|
<View style={styles.horizontalAlignment}>
|
|
|
|
<FoodElementText title={value.name} />
|
|
|
|
<FoodElementText title={value.name} />
|
|
|
|
<Pressable onPress={() => SelectIngredient(value)}>
|
|
|
|
<Pressable onPress={() => SelectIngredient(value)}>
|
|
|
|
<Image source={plus} style={{ width: 20, height: 20 }} />
|
|
|
|
<Image source={plus} style={{ width: 20, height: 20, tintColor: colors.cardDetail }} />
|
|
|
|
</Pressable>
|
|
|
|
</Pressable>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
<View style={{ height: 30 }}></View>
|
|
|
|
<View style={{ height: 20 }}></View>
|
|
|
|
</>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
@ -75,26 +77,65 @@ const loadIngredients = async () => {
|
|
|
|
<View style={styles.horizontalAlignment}>
|
|
|
|
<View style={styles.horizontalAlignment}>
|
|
|
|
<FoodElementText title={value.name} />
|
|
|
|
<FoodElementText title={value.name} />
|
|
|
|
<Pressable onPress={() => RemoveIngredient(value.id)}>
|
|
|
|
<Pressable onPress={() => RemoveIngredient(value.id)}>
|
|
|
|
<Image source={moins} style={{ width: 20, height: 20 }} />
|
|
|
|
<Image source={moins} style={{ width: 20, height: 20, tintColor: colors.cardDetail }} />
|
|
|
|
</Pressable>
|
|
|
|
</Pressable>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
<View style={{ height: 30 }}></View>
|
|
|
|
<View style={{ height: 20 }}></View>
|
|
|
|
</>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const SelectIngredient = (newIngredient: Ingredient) => {
|
|
|
|
const SelectIngredient = (newIngredient: Ingredient) => {
|
|
|
|
const exists = selectedIngredients.find((ingredient) => ingredient.id === newIngredient.id);
|
|
|
|
const exists = selectedIngredients.find((ingredient) => ingredient.id === newIngredient.id);
|
|
|
|
|
|
|
|
console.log("Test 1: ", selectedIngredients.length)
|
|
|
|
if (!exists) {
|
|
|
|
if (!exists) {
|
|
|
|
setSelectedIngredients([...selectedIngredients, newIngredient]);
|
|
|
|
setSelectedIngredients([...selectedIngredients, newIngredient]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log("Test 2: ", selectedIngredients.length)
|
|
|
|
|
|
|
|
ChangeAvailableSize(false)
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const RemoveIngredient = (idIngredient: number) => {
|
|
|
|
const RemoveIngredient = (idIngredient: number) => {
|
|
|
|
|
|
|
|
console.log("Test 1 Remove: ", selectedIngredients.length)
|
|
|
|
const updatedIngredients = selectedIngredients.filter((ingredient) => ingredient.id !== idIngredient);
|
|
|
|
const updatedIngredients = selectedIngredients.filter((ingredient) => ingredient.id !== idIngredient);
|
|
|
|
setSelectedIngredients(updatedIngredients);
|
|
|
|
setSelectedIngredients(updatedIngredients);
|
|
|
|
|
|
|
|
console.log("Test 2 Remove: ", selectedIngredients.length)
|
|
|
|
|
|
|
|
ChangeAvailableSize(true)
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const ChangeAvailableSize = (remove: boolean) => {
|
|
|
|
|
|
|
|
if(remove){
|
|
|
|
|
|
|
|
if (selectedIngredients.length == 1){
|
|
|
|
|
|
|
|
setAvailableSize(0)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (selectedIngredients.length == 2){
|
|
|
|
|
|
|
|
setAvailableSize(90)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (selectedIngredients.length == 3){
|
|
|
|
|
|
|
|
setAvailableSize(180)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (selectedIngredients.length == 4){
|
|
|
|
|
|
|
|
setAvailableSize(260)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else{
|
|
|
|
|
|
|
|
setAvailableSize(280)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else{
|
|
|
|
|
|
|
|
if (selectedIngredients.length == 0){
|
|
|
|
|
|
|
|
setAvailableSize(90)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (selectedIngredients.length == 1){
|
|
|
|
|
|
|
|
setAvailableSize(180)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (selectedIngredients.length == 2){
|
|
|
|
|
|
|
|
setAvailableSize(260)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else{
|
|
|
|
|
|
|
|
setAvailableSize(280)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleLetterPress = async (letter: string) => {
|
|
|
|
const handleLetterPress = async (letter: string) => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const ingredientsByLetter = await ingredientService.getIngredientByLetter(letter);
|
|
|
|
const ingredientsByLetter = await ingredientService.getIngredientByLetter(letter);
|
|
|
@ -106,6 +147,24 @@ const loadIngredients = async () => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const changeListVisibility = () => {
|
|
|
|
|
|
|
|
if(listVisibility == "none"){
|
|
|
|
|
|
|
|
setListVisibility("flex")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else{
|
|
|
|
|
|
|
|
setListVisibility("none")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const changeAvailableVisibility = () => {
|
|
|
|
|
|
|
|
if(availableVisibility == "none"){
|
|
|
|
|
|
|
|
setAvailableVisibility("flex")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else{
|
|
|
|
|
|
|
|
setAvailableVisibility("none")
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const styles = StyleSheet.create({
|
|
|
|
const styles = StyleSheet.create({
|
|
|
|
linearGradient: {
|
|
|
|
linearGradient: {
|
|
|
|
width: "100%",
|
|
|
|
width: "100%",
|
|
|
@ -136,6 +195,12 @@ const loadIngredients = async () => {
|
|
|
|
<LinearGradient colors={[colors.primary, colors.primaryComplement]} style={[styles.linearGradient, {minHeight: useWindowDimensions().height}]}>
|
|
|
|
<LinearGradient colors={[colors.primary, colors.primaryComplement]} style={[styles.linearGradient, {minHeight: useWindowDimensions().height}]}>
|
|
|
|
<View style={{marginTop: "6%"}}/>
|
|
|
|
<View style={{marginTop: "6%"}}/>
|
|
|
|
<View style={styles.element}>
|
|
|
|
<View style={styles.element}>
|
|
|
|
|
|
|
|
<View style={{justifyContent: "center"}}>
|
|
|
|
|
|
|
|
<Pressable onPress={changeListVisibility} style={{alignItems: "center"}}>
|
|
|
|
|
|
|
|
<Image source={require("../assets/images/arrow.png")} style={{tintColor: colors.cardDetail}}/>
|
|
|
|
|
|
|
|
</Pressable>
|
|
|
|
|
|
|
|
</View>
|
|
|
|
|
|
|
|
<View style={{display: listVisibility}}>
|
|
|
|
<View style={[styles.horizontalAlignment, { margin: "2%" }]}>
|
|
|
|
<View style={[styles.horizontalAlignment, { margin: "2%" }]}>
|
|
|
|
{alphabetArray.map((source, index) => (
|
|
|
|
{alphabetArray.map((source, index) => (
|
|
|
|
<Pressable key={index} onPress={() => handleLetterPress(source)}>
|
|
|
|
<Pressable key={index} onPress={() => handleLetterPress(source)}>
|
|
|
@ -170,12 +235,16 @@ const loadIngredients = async () => {
|
|
|
|
<View style={{ marginTop: '6%' }}></View>
|
|
|
|
<View style={{ marginTop: '6%' }}></View>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
|
|
|
|
</View>
|
|
|
|
<View style={{marginTop: "6%"}}/>
|
|
|
|
<View style={{marginTop: "6%"}}/>
|
|
|
|
<View style={styles.element}>
|
|
|
|
<View style={styles.element}>
|
|
|
|
<View style={[styles.horizontalAlignment, {justifyContent: "flex-start", marginLeft: "5%"}]}>
|
|
|
|
<Pressable onPress={changeAvailableVisibility}>
|
|
|
|
<Text style={{fontSize: 20, color: colors.cardElementBorder}}>Available</Text>
|
|
|
|
<View style={[styles.horizontalAlignment, {justifyContent: "flex-start", marginHorizontal: "5%", marginBottom: "4%"}]}>
|
|
|
|
|
|
|
|
<Text style={{fontSize: 20, color: colors.cardElementBorder, flex: 1}}>Available</Text>
|
|
|
|
|
|
|
|
<Image source={require("../assets/images/arrow.png")} style={{tintColor: colors.cardDetail}}/>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
<View style={{height: 280}}>
|
|
|
|
</Pressable>
|
|
|
|
|
|
|
|
<View style={{height: availableSize, display: availableVisibility}}>
|
|
|
|
<FlatList
|
|
|
|
<FlatList
|
|
|
|
data={selectedIngredients}
|
|
|
|
data={selectedIngredients}
|
|
|
|
renderItem={({ item }) => (
|
|
|
|
renderItem={({ item }) => (
|
|
|
@ -188,7 +257,7 @@ const loadIngredients = async () => {
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
</View>
|
|
|
|
<View style={{marginTop: "8%"}}></View>
|
|
|
|
<View style={{marginTop: "8%"}}></View>
|
|
|
|
<ValidateButton title="Find a recipe" image="validate.png" colour={colors.buttonMain} backColour={colors.cardBackground} />
|
|
|
|
<ValidateButton title="Find a recipe" image="validate.png" colour={colors.buttonMain} backColour={colors.cardBackground}/>
|
|
|
|
<View style={{marginBottom: "20%"}}></View>
|
|
|
|
<View style={{marginBottom: "20%"}}></View>
|
|
|
|
</LinearGradient>
|
|
|
|
</LinearGradient>
|
|
|
|
</SafeAreaProvider>
|
|
|
|
</SafeAreaProvider>
|
|
|
|