From 72bc06cf91de90464a569af88af83e8df26693ab Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sat, 14 Feb 2026 10:12:23 +0330 Subject: [PATCH] fix favorite list --- src/app/[name]/(Profile)/favorite/page.tsx | 39 ++++++++++++------- .../[name]/(Profile)/favorite/types/Types.ts | 17 +++----- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/app/[name]/(Profile)/favorite/page.tsx b/src/app/[name]/(Profile)/favorite/page.tsx index a7c99c4..f92a2c8 100644 --- a/src/app/[name]/(Profile)/favorite/page.tsx +++ b/src/app/[name]/(Profile)/favorite/page.tsx @@ -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 = {} + 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 (
@@ -108,9 +119,9 @@ function FavoritePage() {
) : ( - {productItems.map((product) => ( + {productItems.map(({ product, variantId }) => ( - + ))} diff --git a/src/app/[name]/(Profile)/favorite/types/Types.ts b/src/app/[name]/(Profile)/favorite/types/Types.ts index 7e2fc69..85fe43d 100644 --- a/src/app/[name]/(Profile)/favorite/types/Types.ts +++ b/src/app/[name]/(Profile)/favorite/types/Types.ts @@ -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;