created favorite page
This commit is contained in:
parent
e2c67c021f
commit
2c592fa8ef
4 changed files with 211 additions and 12 deletions
60
donutshop/app/components/FavCard.tsx
Normal file
60
donutshop/app/components/FavCard.tsx
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
import { ImageProps, StyleSheet, Text, View } from 'react-native'
|
||||||
|
import React from 'react'
|
||||||
|
import FavImgBackground from "../components/FavImgBackground";
|
||||||
|
|
||||||
|
|
||||||
|
interface FavoritesItemCardProps {
|
||||||
|
id: string;
|
||||||
|
image_item: ImageProps;
|
||||||
|
name: string;
|
||||||
|
donutname: string;
|
||||||
|
type: string;
|
||||||
|
calories: string
|
||||||
|
average_rating: number;
|
||||||
|
ratings_count: string;
|
||||||
|
description: string;
|
||||||
|
favourite: boolean;
|
||||||
|
ToggleFavouriteItem: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FavCard: React.FC<FavoritesItemCardProps> = ({
|
||||||
|
id,
|
||||||
|
image_item,
|
||||||
|
name,
|
||||||
|
donutname,
|
||||||
|
type,
|
||||||
|
calories,
|
||||||
|
average_rating,
|
||||||
|
ratings_count,
|
||||||
|
description,
|
||||||
|
favourite,
|
||||||
|
ToggleFavouriteItem,
|
||||||
|
}) => {
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={{overflow: 'hidden'}}>
|
||||||
|
<FavImgBackground
|
||||||
|
EnableBackHandler={false}
|
||||||
|
id={id}
|
||||||
|
image_item={image_item}
|
||||||
|
name={name}
|
||||||
|
donutname={donutname}
|
||||||
|
type={type}
|
||||||
|
calories={calories}
|
||||||
|
average_rating={average_rating}
|
||||||
|
ratings_count={ratings_count}
|
||||||
|
description={description}
|
||||||
|
favourite={favourite}
|
||||||
|
ToggleFavourite={ToggleFavouriteItem}
|
||||||
|
/>
|
||||||
|
<View style={{paddingHorizontal: 20, borderBottomWidth:1, borderColor: '#EEEEEE'}}>
|
||||||
|
<Text style={{fontSize: 16, color: 'gray', marginVertical: 30}}>{description}</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FavCard
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({})
|
79
donutshop/app/components/FavImgBackground.tsx
Normal file
79
donutshop/app/components/FavImgBackground.tsx
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
import { ImageBackground, ImageProps, Pressable, StyleSheet, Text, View } from 'react-native'
|
||||||
|
import React from 'react'
|
||||||
|
import { AntDesign } from '@expo/vector-icons';
|
||||||
|
|
||||||
|
|
||||||
|
interface FavImgBackgroundProps {
|
||||||
|
EnableBackHandler: boolean;
|
||||||
|
id: string;
|
||||||
|
image_item: ImageProps;
|
||||||
|
name: string;
|
||||||
|
donutname: string;
|
||||||
|
type: string;
|
||||||
|
calories: string;
|
||||||
|
average_rating: number;
|
||||||
|
ratings_count: string;
|
||||||
|
description: string;
|
||||||
|
favourite: boolean;
|
||||||
|
ToggleFavourite: any;
|
||||||
|
BackHandler?: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const FavImgBackground: React.FC<FavImgBackgroundProps> = ({
|
||||||
|
EnableBackHandler,
|
||||||
|
id,
|
||||||
|
image_item,
|
||||||
|
name,
|
||||||
|
donutname,
|
||||||
|
calories,
|
||||||
|
type,
|
||||||
|
average_rating,
|
||||||
|
ratings_count,
|
||||||
|
description,
|
||||||
|
favourite,
|
||||||
|
ToggleFavourite,
|
||||||
|
BackHandler,
|
||||||
|
|
||||||
|
}) => {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View>
|
||||||
|
<ImageBackground source={image_item} style={{width: '100%', aspectRatio: 1, justifyContent: 'space-between', }}>
|
||||||
|
{EnableBackHandler? (
|
||||||
|
<View style={{padding: 20, flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between',}}>
|
||||||
|
<Pressable onPress={() => {BackHandler()}}>
|
||||||
|
<AntDesign name="left" size={24} color="gray" />
|
||||||
|
</Pressable>
|
||||||
|
<Pressable onPress={() => {ToggleFavourite(favourite, type, id);}}>
|
||||||
|
<AntDesign name="heart" size={24} color="#EF5A6F" />
|
||||||
|
</Pressable>
|
||||||
|
</View>
|
||||||
|
):(
|
||||||
|
<View style={{padding: 20, flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end',}}>
|
||||||
|
<Pressable onPress={() => {ToggleFavourite(favourite, type, id);}}>
|
||||||
|
<AntDesign name="heart" size={24} color="#EF5A6F" />
|
||||||
|
</Pressable>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
<View style={{paddingVertical: 10, paddingHorizontal: 10, backgroundColor: 'rgba(255, 255, 255, 0.8)', borderTopLeftRadius: 10, borderTopRightRadius: 10}}>
|
||||||
|
<View style={{marginHorizontal: 10, marginVertical: 10}}>
|
||||||
|
<Text style={{color: '#DA7297', fontSize: 22, fontWeight: 500}}>{donutname || name}</Text>
|
||||||
|
</View>
|
||||||
|
<View style={{flexDirection: 'row', justifyContent: 'space-between', paddingHorizontal: 10, marginVertical: 10}}>
|
||||||
|
<Text style={{color: '#DA7297', fontSize: 18}}>{calories} calories</Text>
|
||||||
|
<View style={{flexDirection: 'row', gap: 3, alignItems: 'center'}}>
|
||||||
|
<AntDesign name="star" size={20} color="#EF5A6F"/>
|
||||||
|
<Text style={{color: '#DA7297', textAlign: 'right', fontSize: 18}}>{average_rating}</Text>
|
||||||
|
<Text style={{color: 'gray', fontSize: 12}}>({ratings_count})</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</ImageBackground>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FavImgBackground
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({})
|
|
@ -1,7 +1,6 @@
|
||||||
import { View, Text, ScrollView, Image, Pressable} from 'react-native'
|
import { View, Text, ScrollView, Image, Pressable} from 'react-native'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { useStore } from '../store/store';
|
import { useStore } from '../store/store';
|
||||||
import {useBottomTabBarHeight} from '@react-navigation/bottom-tabs';
|
|
||||||
import Payment from '../components/Payment';
|
import Payment from '../components/Payment';
|
||||||
import CartItem from '../components/CartItem';
|
import CartItem from '../components/CartItem';
|
||||||
|
|
||||||
|
@ -15,13 +14,22 @@ const Cart = ({navigation, route}: any) => {
|
||||||
const addCartItemQuantity = useStore((state: any) => state.addCartItemQuantity);
|
const addCartItemQuantity = useStore((state: any) => state.addCartItemQuantity);
|
||||||
const removeCartItemQuantity = useStore((state: any) => state.removeCartItemQuantity);
|
const removeCartItemQuantity = useStore((state: any) => state.removeCartItemQuantity);
|
||||||
const calculateCartPrice = useStore((state: any) => state.calculateCartPrice);
|
const calculateCartPrice = useStore((state: any) => state.calculateCartPrice);
|
||||||
|
|
||||||
const tabBarHeight = useBottomTabBarHeight();
|
|
||||||
//console.log("CartList =", CartList.length)
|
//console.log("CartList =", CartList.length)
|
||||||
|
|
||||||
const buttonPressHandler = () => {
|
const buttonPressHandler = () => {
|
||||||
navigation.push('payment');
|
navigation.push('payment');
|
||||||
}
|
}
|
||||||
|
//add to cart functionality
|
||||||
|
const addCartItemQuantityHandler = (id: string, size: string) => {
|
||||||
|
addCartItemQuantity(id, size);
|
||||||
|
calculateCartPrice();
|
||||||
|
};
|
||||||
|
//remove from cart functionality
|
||||||
|
const removeCartItemQuantityHandler = (id: string, size: string) => {
|
||||||
|
removeCartItemQuantity(id, size);
|
||||||
|
calculateCartPrice();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={{flex: 1, backgroundColor: 'white'}}>
|
<View style={{flex: 1, backgroundColor: 'white'}}>
|
||||||
|
@ -32,12 +40,14 @@ const Cart = ({navigation, route}: any) => {
|
||||||
{CartList.length == 0 ? (
|
{CartList.length == 0 ? (
|
||||||
<View style={{marginVertical: 50, alignItems: 'center'}}>
|
<View style={{marginVertical: 50, alignItems: 'center'}}>
|
||||||
<Image source={require('../../assets/images/misc/empty_bag.png')} style={{ width: 200, height: 200, resizeMode: "contain"}} />
|
<Image source={require('../../assets/images/misc/empty_bag.png')} style={{ width: 200, height: 200, resizeMode: "contain"}} />
|
||||||
<Text style={{marginTop: 30, fontSize: 16, fontWeight: 500}}>You bag is empty!</Text>
|
<Text style={{marginTop: 30, fontSize: 16, fontWeight: 500}}>Your cart is empty!</Text>
|
||||||
</View>
|
</View>
|
||||||
):(
|
):(
|
||||||
<View style={{gap: 10, marginTop: 20}}>
|
<View style={{gap: 10, marginTop: 20}}>
|
||||||
{CartList.map((data: any)=> (
|
{CartList.map((data: any)=> (
|
||||||
<Pressable key={data.id} onPress={() => {}}>
|
<Pressable key={data.id} onPress={() => {
|
||||||
|
navigation.push('detail', {index: data.index, id:data.id, type: data.type})
|
||||||
|
}}>
|
||||||
<CartItem
|
<CartItem
|
||||||
id = {data.id}
|
id = {data.id}
|
||||||
name = {data.name}
|
name = {data.name}
|
||||||
|
@ -45,8 +55,8 @@ const Cart = ({navigation, route}: any) => {
|
||||||
prices = {data.prices}
|
prices = {data.prices}
|
||||||
type = {data.type}
|
type = {data.type}
|
||||||
image_item = {data.image_item}
|
image_item = {data.image_item}
|
||||||
addCartItemQuantityHandler = {() => {}}
|
addCartItemQuantityHandler = {addCartItemQuantityHandler}
|
||||||
removeCartItemQuantityHandler = {() => {}}
|
removeCartItemQuantityHandler = {removeCartItemQuantityHandler}
|
||||||
/>
|
/>
|
||||||
</Pressable>
|
</Pressable>
|
||||||
))}
|
))}
|
||||||
|
|
|
@ -1,10 +1,60 @@
|
||||||
import { View, Text } from 'react-native'
|
import { View, Text, ScrollView, Image, Pressable } from 'react-native';
|
||||||
import React from 'react'
|
import React from 'react';
|
||||||
|
import { useStore } from '../store/store';
|
||||||
|
import FavCard from "../components/FavCard";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const Favorite = ({navigation}: any) => {
|
||||||
|
const FavoriteList = useStore((state: any) => state.FavoriteList);
|
||||||
|
const addToFavoriteList = useStore((state: any) => state.addToFavoriteList);
|
||||||
|
const deleteFromFavoriteList = useStore((state: any) => state.deleteFromFavoriteList);
|
||||||
|
|
||||||
|
const ToggleFavourite = (favourite: boolean, type: string, id: string) => {
|
||||||
|
favourite ? deleteFromFavoriteList(type, id) : addToFavoriteList(type, id)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const Favorite = () => {
|
|
||||||
return (
|
return (
|
||||||
<View>
|
<View style={{flex: 1, backgroundColor: 'white'}}>
|
||||||
<Text>Favorite</Text>
|
<ScrollView showsVerticalScrollIndicator={false} contentContainerStyle={{flexGrow: 1}}>
|
||||||
|
<View style={{flex: 1, justifyContent: 'space-between'}}>
|
||||||
|
<View style={{marginTop: 20, paddingVertical: 10}}>
|
||||||
|
<Text style={{paddingHorizontal: 20, fontSize: 30, fontWeight: 600}}>Favorite List</Text>
|
||||||
|
{FavoriteList.length == 0 ? (
|
||||||
|
<View style={{marginVertical: 50, alignItems: 'center'}}>
|
||||||
|
<Image source={require('../../assets/images/misc/fav.png')} style={{ width: 200, height: 200, resizeMode: "contain"}} />
|
||||||
|
<Text style={{marginTop: 30, fontSize: 16, fontWeight: 500}}>Your have no favorite list!</Text>
|
||||||
|
</View>
|
||||||
|
):(
|
||||||
|
<View style={{gap: 10, marginTop: 20}}>
|
||||||
|
{FavoriteList.map((data: any)=> (
|
||||||
|
<Pressable key={data.id} onPress={() => {
|
||||||
|
navigation.push('detail', {index: data.index, id:data.id, type: data.type})
|
||||||
|
}}>
|
||||||
|
<FavCard
|
||||||
|
id={data.id}
|
||||||
|
image_item={data.image_item}
|
||||||
|
name={data.name}
|
||||||
|
donutname={data.donutname}
|
||||||
|
type={data.type}
|
||||||
|
calories={data.calories}
|
||||||
|
average_rating={data.average_rating}
|
||||||
|
ratings_count={data.ratings_count}
|
||||||
|
description={data.description}
|
||||||
|
favourite={data.favourite}
|
||||||
|
ToggleFavouriteItem={ToggleFavourite}
|
||||||
|
/>
|
||||||
|
</Pressable>
|
||||||
|
))}
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</ScrollView>
|
||||||
</View>
|
</View>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue