import { memo, useState } from "react"; import { generateImage, IMAGE_GEN_MODELS, DEFAULT_IMAGE_MODEL } from "@/lib/imageGen"; import { getHuggingFaceToken as getToken } from "@/lib/apiKeys"; interface ImageGenBlockProps { prompt: string; } const ImageGenBlock = memo(function ImageGenBlock({ prompt }: ImageGenBlockProps) { const [status, setStatus] = useState<"idle" | "loading" | "done" | "error">("idle"); const [imageUrl, setImageUrl] = useState(null); const [error, setError] = useState(null); const [model, setModel] = useState(DEFAULT_IMAGE_MODEL.id); // S725-IMG1: imageGen.ts ora restituisce data URL — nessuna revoca necessaria const generate = async () => { const token = getToken(); if (!token) { setError("Token HuggingFace mancante. Vai in Impostazioni."); setStatus("error"); return; } setStatus("loading"); setError(null); try { const result = await generateImage(token, prompt.trim(), model); setImageUrl(result.url); setStatus("done"); // S725-IMG1: auto-save nel VFS — riutilizzabile dall'agente in step successivi const _vfsPath = `images/generated_${Date.now()}.png`; import("@/lib/vfsDb").then(({ vfsAsync }) => vfsAsync.write(_vfsPath, result.url, "image/png").catch(() => {}) ).catch(() => {}); } catch (err) { setError(err instanceof Error ? err.message : "Errore generazione"); setStatus("error"); } }; const download = () => { if (!imageUrl) return; const _fn = `image-${Date.now()}.png`; // S725-XLSX1: tenta a.click() (desktop) + agent:download-ready per iOS DownloadQueue try { const a = document.createElement("a"); a.href = imageUrl; a.download = _fn; document.body.appendChild(a); a.click(); document.body.removeChild(a); } catch { /* noop */ } window.dispatchEvent(new CustomEvent("agent:download-ready", { detail: { url: imageUrl, filename: _fn } })); }; return (
IMG Generazione immagine AI {status === "idle" && ( )}
"{prompt.slice(0, 200)}{prompt.length > 200 ? "..." : ""}"
{status === "idle" && ( )} {status === "loading" && (
Generazione in corso... (30-60s)
)} {status === "error" && (
Err: {error}
)} {status === "done" && imageUrl && (
{prompt}
)}
); } ); export default ImageGenBlock;