"use client"; import { useState } from "react"; import { useTranslations } from "next-intl"; import { toast } from "sonner"; import { ChefHat, Pencil, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Sheet, SheetContent, SheetHeader, SheetTitle } from "@/components/ui/sheet"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { useLocale } from "@/lib/i18n/provider"; import { MarkCookedDialog } from "./mark-cooked-dialog"; import { EditCookLogDialog, type CookLog } from "./edit-cook-log-dialog"; const TOOLTIP_DATE_LIMIT = 8; export function MarkCookedSection({ recipeId, baseServings, initialLogs, }: { recipeId: string; baseServings: number; initialLogs: CookLog[]; }) { const t = useTranslations("recipe"); const tCommon = useTranslations("common"); const { locale } = useLocale(); const [logs, setLogs] = useState(initialLogs); const [sheetOpen, setSheetOpen] = useState(false); const [editingLog, setEditingLog] = useState(null); const [confirmId, setConfirmId] = useState(null); function formatDate(dateStr: string): string { return new Date(dateStr).toLocaleDateString(locale, { month: "short", day: "numeric", year: "numeric" }); } async function handleDelete(id: string) { const res = await fetch(`/api/v1/recipes/${recipeId}/cooked/${id}`, { method: "DELETE" }); if (res.ok) { setLogs((prev) => prev.filter((l) => l.id !== id)); toast.success(t("deleteCookLogSuccess")); } else { toast.error(t("deleteCookLogFailed")); } } const cookCount = logs.length; const lastCookedAt = logs[0]?.cookedAt ?? null; const logPendingDelete = logs.find((l) => l.id === confirmId) ?? null; return (
{ const entry = { id: log.id, cookedAt: new Date(log.cookedAt).toISOString(), servings: log.servings, notes: null }; setLogs((prev) => [...prev, entry].sort((a, b) => new Date(b.cookedAt).getTime() - new Date(a.cookedAt).getTime())); }} trigger={ } /> {cookCount > 0 && ( setSheetOpen(true)} className="text-xs text-muted-foreground hover:text-foreground underline-offset-2 hover:underline text-left" > {cookCount === 1 ? t("markCookedCountSingular") : t("markCookedCountPlural", { count: cookCount })} {lastCookedAt && t("markCookedLast", { date: formatDate(lastCookedAt) })} } />
    {logs.slice(0, TOOLTIP_DATE_LIMIT).map((l) => (
  • {formatDate(l.cookedAt)}
  • ))}
{logs.length > TOOLTIP_DATE_LIMIT && (

{t("cookLogMore", { count: logs.length - TOOLTIP_DATE_LIMIT })}

)}
)} {t("cookLogSheetTitle")}
{logs.length === 0 &&

{t("cookLogEmpty")}

} {logs.map((log) => (

{formatDate(log.cookedAt)}

{log.servings &&

{t("markCookedServingsLabel")}: {log.servings}

} {log.notes &&

{log.notes}

}
))}
{editingLog && ( !open && setEditingLog(null)} onSaved={(updated) => { setLogs((prev) => [...prev.filter((l) => l.id !== updated.id), updated].sort((a, b) => new Date(b.cookedAt).getTime() - new Date(a.cookedAt).getTime())); setEditingLog(null); }} /> )} !open && setConfirmId(null)}> {t("deleteCookLogConfirmTitle")} {logPendingDelete ? t("deleteCookLogConfirmDescription", { date: formatDate(logPendingDelete.cookedAt) }) : ""} {tCommon("cancel")} { if (confirmId) void handleDelete(confirmId); setConfirmId(null); }} className="bg-destructive text-destructive-foreground hover:bg-destructive/90" > {tCommon("delete")}
); }