"use client"; import { useRef, useState } from "react"; import { useRouter } from "next/navigation"; import { Camera, Loader2 } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { FakeProgressBar } from "@/components/ui/fake-progress-bar"; export function PhotoImportButton() { const router = useRouter(); const fileRef = useRef(null); const [loading, setLoading] = useState(false); function handleClick() { fileRef.current?.click(); } async function handleFile(e: React.ChangeEvent) { const file = e.target.files?.[0]; if (!file) return; setLoading(true); try { const base64 = await new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => { const result = reader.result as string; // Strip the data:mime/type;base64, prefix const comma = result.indexOf(","); resolve(comma !== -1 ? result.slice(comma + 1) : result); }; reader.onerror = () => reject(reader.error); reader.readAsDataURL(file); }); const res = await fetch("/api/v1/ai/import-photo", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ imageBase64: base64, mimeType: file.type, }), }); if (!res.ok) { const data = await res.json().catch(() => ({})) as { error?: string }; throw new Error(data.error ?? `Request failed: ${res.status}`); } const { id } = await res.json() as { id: string }; router.push(`/recipes/${id}/edit`); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to import recipe from photo."); } finally { setLoading(false); // Reset input so the same file can be re-selected if (fileRef.current) fileRef.current.value = ""; } } return (
); }