fix favorite list

This commit is contained in:
hamid zarghami
2026-02-14 10:12:23 +03:30
parent 2f90d61788
commit 72bc06cf91
2 changed files with 30 additions and 26 deletions
+25 -14
View File
@@ -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[]>;