"use client"; import { useState } from "react"; import { Wine, Sparkles, Loader2, Coffee, Beer, GlassWater, Leaf } from "lucide-react"; import { FakeProgressBar } from "@/components/ui/fake-progress-bar"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; type Drink = { name: string; type: "wine" | "beer" | "cocktail" | "spirit" | "non-alcoholic" | "hot"; alcoholic: boolean; description: string; examples: string[]; whyItPairs: string; servingTip?: string; }; const TYPE_ICON: Record = { wine: Wine, beer: Beer, cocktail: Wine, spirit: Wine, "non-alcoholic": GlassWater, hot: Coffee, }; const TYPE_LABEL: Record = { wine: "Wine", beer: "Beer", cocktail: "Cocktail", spirit: "Spirit", "non-alcoholic": "Sans alcool", hot: "Chaud", }; export function DrinkPairingButton({ recipeId }: { recipeId: string }) { const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const [drinks, setDrinks] = useState([]); async function suggest() { setLoading(true); setDrinks([]); try { const res = await fetch(`/api/v1/ai/drinks/${recipeId}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ count: 4 }), }); if (!res.ok) { toast.error("Failed to suggest drinks"); return; } const data = await res.json() as { drinks: Drink[] }; setDrinks(data.drinks); } finally { setLoading(false); } } function handleOpen() { setOpen(true); if (drinks.length === 0) suggest(); } return ( <> Drink pairings AI-suggested drinks that complement this recipe. {loading ? (
) : drinks.length === 0 ? (
) : (
{drinks.map((drink, i) => { const Icon = TYPE_ICON[drink.type]; return (
{drink.name} {TYPE_LABEL[drink.type]} {!drink.alcoholic && ( Sans alcool )}

{drink.description}

{drink.examples.length > 0 && (

e.g. {drink.examples.join(" · ")}

)}

“{drink.whyItPairs}”

{drink.servingTip && (

{drink.servingTip}

)}
{i < drinks.length - 1 && }
); })}
)}
); }