'use client';
import type { MenuItem } from '@/domain/menu/entities';
import WishlistButton from '@/components/WishlistButton';
import {
applyNextImageFallback,
getMenuPosterCandidates,
getMenuPosterSrc,
} from '@/lib/assets';
export type SignatureDish = MenuItem & {
desc: string;
};
interface SignatureMenuMarqueeProps {
dishes: SignatureDish[];
addToCartLabel: string;
perHalfKgLabel: string;
perKgLabel: string;
onAdd: (dish: SignatureDish) => void;
}
function renderMarqueePrice(
item: MenuItem,
perHalfKgLabel: string,
perKgLabel: string
) {
if (item.pricing === 'weight') {
return (
{item.pricePerHalfKg ?? item.price}
{perHalfKgLabel}
{item.pricePerKg} {perKgLabel}
);
}
return (
);
}
const CARD_WIDTH = 240;
const CARD_GAP = 20;
export default function SignatureMenuMarquee({
dishes,
addToCartLabel,
perHalfKgLabel,
perKgLabel,
onAdd,
}: SignatureMenuMarqueeProps) {
if (dishes.length === 0) return null;
const reelItems = [...dishes, ...dishes];
const trackWidth = reelItems.length * (CARD_WIDTH + CARD_GAP);
const durationSeconds = Math.max(50, dishes.length * 2.8);
return (
{reelItems.map((dish, index) => (
})
{
applyNextImageFallback(
e.target as HTMLImageElement,
getMenuPosterCandidates(dish),
(e.target as HTMLImageElement).src
);
}}
/>
{dish.name}
{renderMarqueePrice(dish, perHalfKgLabel, perKgLabel)}
{dish.desc}
))}
);
}