"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { Languages, Loader2 } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; const LANGUAGES = [ { code: "French", label: "French" }, { code: "Spanish", label: "Spanish" }, { code: "German", label: "German" }, { code: "Italian", label: "Italian" }, { code: "Portuguese", label: "Portuguese" }, { code: "English", label: "English" }, { code: "Japanese", label: "Japanese" }, { code: "Chinese", label: "Chinese" }, { code: "Arabic", label: "Arabic" }, { code: "Dutch", label: "Dutch" }, { code: "Polish", label: "Polish" }, { code: "Russian", label: "Russian" }, ]; export function TranslateButton({ recipeId }: { recipeId: string }) { const router = useRouter(); const [open, setOpen] = useState(false); const [targetLanguage, setTargetLanguage] = useState("French"); const [translating, setTranslating] = useState(false); async function handleTranslate() { setTranslating(true); try { const res = await fetch(`/api/v1/ai/translate/${recipeId}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetLanguage }), }); if (!res.ok) { const err = await res.json() as { error?: string }; toast.error(err.error ?? "Failed to translate recipe"); return; } const { id } = await res.json() as { id: string }; toast.success("Translation saved as new draft recipe"); setOpen(false); router.push(`/recipes/${id}/edit`); } finally { setTranslating(false); } } return ( <> setOpen(true)}> } /> Translate Translate Recipe AI will translate the title, description, ingredients, and steps. Quantities and units are preserved.
{translating && (

This may take 20–30 seconds…

)}
); }