"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useTranslations } from "next-intl"; import { toast } from "sonner"; import { ChefHat, Sparkles } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { MEAL_COURSES, type MealCourse } from "@/lib/ai/features/generate-meal"; type CreatedRecipe = { id: string; title: string; course: string }; export function GenerateMealDialog({ collectionId }: { collectionId: string }) { const router = useRouter(); const t = useTranslations("collections"); const [open, setOpen] = useState(false); const [theme, setTheme] = useState(""); const [courses, setCourses] = useState(["main", "dessert"]); const [servings, setServings] = useState("4"); const [dietaryPrefs, setDietaryPrefs] = useState(""); const [generating, setGenerating] = useState(false); function toggleCourse(course: MealCourse) { setCourses((prev) => (prev.includes(course) ? prev.filter((c) => c !== course) : [...prev, course])); } async function handleGenerate() { if (!theme.trim() || courses.length < 2) return; setGenerating(true); try { const res = await fetch("/api/v1/ai/generate-meal", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ collectionId, theme: theme.trim(), courses, servings: parseInt(servings) || 4, dietaryPrefs: dietaryPrefs.trim() || undefined, }), }); if (!res.ok) { const data = (await res.json()) as { error?: string }; throw new Error(data.error ?? t("generateMealFailed")); } const data = (await res.json()) as { recipes: CreatedRecipe[] }; toast.success(t("generateMealSuccess", { count: data.recipes.length })); setOpen(false); setTheme(""); router.refresh(); } catch (err) { toast.error(err instanceof Error ? err.message : t("generateMealFailed")); } finally { setGenerating(false); } } return ( <> setOpen(true)} aria-label={t("generateMeal")}> } /> {t("generateMeal")} {t("generateMealTitle")} {t("generateMealDescription")}
setTheme(e.target.value)} placeholder={t("themePlaceholder")} maxLength={200} />
{MEAL_COURSES.map((course) => ( ))}
{courses.length < 2 &&

{t("minCoursesHint")}

}
setServings(e.target.value)} />
setDietaryPrefs(e.target.value)} placeholder={t("dietaryPlaceholder")} maxLength={200} />
); }