/* eslint-disable @next/next/no-img-element */ "use client"; import { useCart } from "@/app/[name]/(Main)/cart/hook/useCart"; import type { Food, FoodImage } from "@/app/[name]/(Main)/types/Types"; import MinusIcon from "@/components/icons/MinusIcon"; import PlusIcon from "@/components/icons/PlusIcon"; import clsx from "clsx"; import { motion } from "framer-motion"; import Link from "next/link"; import { useParams } from "next/navigation"; import { memo, useEffect, useMemo, useState } from "react"; interface MenuItemProps { food: Food; } const MenuItem = ({ food }: MenuItemProps) => { const { items, addToCart, removeFromCart } = useCart(); const params = useParams<{ name: string }>(); const name = params?.name || ""; const quantity = useMemo(() => { const item = items?.[food.id]; if (item && typeof item === "object" && "quantity" in item) { return item.quantity || 0; } return 0; }, [items, food.id]); const fallbackImage = "/assets/images/no-image.png"; const resolvedImage = useMemo(() => { if (Array.isArray(food.images) && food.images.length > 0) { const [firstImage] = food.images; if (typeof firstImage === "string") return firstImage; const imageObj = firstImage as FoodImage; return (typeof imageObj === "object" && imageObj?.url) || fallbackImage; } return fallbackImage; }, [food.images]); const [imageSrc, setImageSrc] = useState(resolvedImage); useEffect(() => { setImageSrc(resolvedImage); }, [resolvedImage]); const foodName = useMemo(() => food.title || "بدون نام", [food.title]); const foodContent = useMemo(() => { const content = food.content; if (!content) return ""; if (Array.isArray(content)) { return content .filter((item) => item && typeof item === "string") .join("، "); } return ""; }, [food.content]); const foodDescription = useMemo(() => { const desc = food.desc; if (!desc || typeof desc !== "string") return ""; return desc.replace(/,/g, "،"); }, [food.desc]); const finalPrice = useMemo(() => { const basePrice = food.price || 0; const discount = food.discount || 0; if (discount > 0) { return Math.max(0, basePrice - discount); } return basePrice; }, [food.price, food.discount]); const formattedPrice = useMemo( () => (finalPrice ? finalPrice.toLocaleString("fa-IR") : "0"), [finalPrice], ); const formattedOriginalPrice = useMemo( () => (food.price ? food.price.toLocaleString("fa-IR") : "0"), [food.price], ); const hasDiscount = useMemo(() => (food.discount || 0) > 0, [food.discount]); const isAvailable = food.isAvailable !== false; const handleAddToCart = () => { if (!isAvailable) return; addToCart(food.id); }; const handleRemoveFromCart = () => { removeFromCart(food.id); }; const foodDetailUrl = `/${name}/${food.id}?category=${food.category}`; return (