fix favorite list
This commit is contained in:
@@ -4,6 +4,8 @@ import { useRouter } from 'next/navigation'
|
||||
import { ArrowLeft } from 'iconsax-react'
|
||||
import Image from 'next/image'
|
||||
import { useGetFavorites } from './hooks/useFavoriteData'
|
||||
import { useGetProducts } from '@/app/[name]/(Main)/hooks/useMenuData'
|
||||
import { getPrimaryVariantId } from '@/app/[name]/(Main)/types/Types'
|
||||
import MenuItem from '@/components/listview/MenuItem'
|
||||
import MenuItemRenderer from '@/components/listview/MenuItemRenderer'
|
||||
import VerticalScrollView from '@/components/listview/VerticalScrollView'
|
||||
@@ -13,6 +15,15 @@ import type { Product, ProductCategory, ProductVariant } from '@/app/[name]/(Mai
|
||||
function FavoritePage() {
|
||||
const router = useRouter()
|
||||
const { data: favoritesData, isLoading } = useGetFavorites()
|
||||
const { data: productsData } = useGetProducts()
|
||||
const menuProducts = useMemo(() => productsData?.data ?? [], [productsData?.data])
|
||||
const productById = useMemo(() => {
|
||||
const map: Record<string, Product> = {}
|
||||
for (const p of menuProducts) {
|
||||
map[p.id] = p
|
||||
}
|
||||
return map
|
||||
}, [menuProducts])
|
||||
|
||||
const favorites = useMemo(() => {
|
||||
return favoritesData?.data || []
|
||||
@@ -20,8 +31,11 @@ function FavoritePage() {
|
||||
|
||||
const productItems = useMemo(() => {
|
||||
return favorites.map((favorite: Favorite) => {
|
||||
const favProduct = favorite.food
|
||||
// تبدیل FavoriteProduct به Product برای استفاده در MenuItem
|
||||
const favProduct = favorite.product
|
||||
const menuProduct = productById[favProduct.id]
|
||||
if (menuProduct) {
|
||||
return { product: menuProduct, variantId: getPrimaryVariantId(menuProduct) }
|
||||
}
|
||||
const category: ProductCategory = {
|
||||
id: favProduct.category,
|
||||
createdAt: '',
|
||||
@@ -30,7 +44,7 @@ function FavoritePage() {
|
||||
parent: null,
|
||||
title: '',
|
||||
isActive: true,
|
||||
shop: '',
|
||||
shop: favProduct.shop,
|
||||
avatarUrl: '',
|
||||
order: 0,
|
||||
}
|
||||
@@ -41,25 +55,22 @@ function FavoritePage() {
|
||||
deletedAt: favProduct.deletedAt,
|
||||
product: favProduct.id,
|
||||
value: '',
|
||||
price: favProduct.price,
|
||||
price: favProduct.price ?? 0,
|
||||
}
|
||||
const product: Product = {
|
||||
id: favProduct.id,
|
||||
createdAt: favProduct.createdAt,
|
||||
updatedAt: favProduct.updatedAt,
|
||||
deletedAt: favProduct.deletedAt,
|
||||
shop: favProduct.restaurant,
|
||||
shop: favProduct.shop,
|
||||
category,
|
||||
attribute: '',
|
||||
attribute: favProduct.attribute ?? '',
|
||||
title: favProduct.title,
|
||||
desc: favProduct.desc,
|
||||
content: favProduct.content,
|
||||
price: favProduct.price,
|
||||
order: favProduct.order || 0,
|
||||
order: favProduct.order ?? 0,
|
||||
isActive: favProduct.isActive,
|
||||
images: favProduct.images,
|
||||
inPlaceServe: favProduct.inPlaceServe,
|
||||
pickupServe: favProduct.pickupServe,
|
||||
score: favProduct.score,
|
||||
discount: favProduct.discount,
|
||||
isSpecialOffer: favProduct.isSpecialOffer,
|
||||
@@ -67,9 +78,9 @@ function FavoritePage() {
|
||||
description: favProduct.desc,
|
||||
variants: [singleVariant],
|
||||
}
|
||||
return product
|
||||
return { product, variantId: favProduct.id }
|
||||
})
|
||||
}, [favorites])
|
||||
}, [favorites, productById])
|
||||
|
||||
return (
|
||||
<div className='overflow-y-auto h-full noscrollbar flex flex-col'>
|
||||
@@ -108,9 +119,9 @@ function FavoritePage() {
|
||||
</div>
|
||||
) : (
|
||||
<VerticalScrollView className="overflow-y-auto h-full">
|
||||
{productItems.map((product) => (
|
||||
{productItems.map(({ product, variantId }) => (
|
||||
<MenuItemRenderer key={product.id}>
|
||||
<MenuItem product={product} />
|
||||
<MenuItem product={product} variantId={variantId} />
|
||||
</MenuItemRenderer>
|
||||
))}
|
||||
</VerticalScrollView>
|
||||
|
||||
@@ -1,29 +1,23 @@
|
||||
import { BaseResponse } from "@/app/[name]/(Main)/types/Types";
|
||||
|
||||
export type MealType = "breakfast" | "lunch" | "dinner" | "snack";
|
||||
|
||||
/** محصول تو در تو در پاسخ API علاقهمندیها */
|
||||
export interface FavoriteProduct {
|
||||
id: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
deletedAt: string | null;
|
||||
restaurant: string;
|
||||
shop: string;
|
||||
category: string;
|
||||
attribute: string | null;
|
||||
title: string;
|
||||
desc: string;
|
||||
content: string[];
|
||||
price: number;
|
||||
order: number | null;
|
||||
prepareTime: number | null;
|
||||
weekDays: number[];
|
||||
mealTypes: MealType[];
|
||||
isActive: boolean;
|
||||
images: string[];
|
||||
inPlaceServe: boolean;
|
||||
pickupServe: boolean;
|
||||
score: number;
|
||||
discount: number;
|
||||
isSpecialOffer: boolean;
|
||||
price: number | null;
|
||||
}
|
||||
|
||||
export interface Favorite {
|
||||
@@ -32,8 +26,7 @@ export interface Favorite {
|
||||
updatedAt: string;
|
||||
deletedAt: string | null;
|
||||
user: string;
|
||||
/** API returns "food" key */
|
||||
food: FavoriteProduct;
|
||||
product: FavoriteProduct;
|
||||
}
|
||||
|
||||
export type FavoritesResponse = BaseResponse<Favorite[]>;
|
||||
|
||||
Reference in New Issue
Block a user