"use client"; import { useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Sparkles, Loader2, Image as ImageIcon, RefreshCw, CheckCircle, XCircle, } from "lucide-react"; import Image from "next/image"; interface AIImageGeneratorProps { projectId: number; projectTitle: string; currentImageUrl?: string | null; onImageGenerated?: (imageUrl: string) => void; } export default function AIImageGenerator({ projectId, projectTitle, currentImageUrl, onImageGenerated, }: AIImageGeneratorProps) { const [isGenerating, setIsGenerating] = useState(false); const [status, setStatus] = useState<"idle" | "success" | "error">("idle"); const [message, setMessage] = useState(""); const [generatedImageUrl, setGeneratedImageUrl] = useState( currentImageUrl || null, ); const [showPreview, setShowPreview] = useState(false); const handleGenerate = async (regenerate: boolean = false) => { setIsGenerating(true); setStatus("idle"); setMessage("Generating AI image..."); try { const response = await fetch("/api/n8n/generate-image", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ projectId: projectId, regenerate: regenerate, }), }); const data = await response.json(); if (response.ok && data.success) { setStatus("success"); setMessage(data.message || "Image generated successfully!"); setGeneratedImageUrl(data.imageUrl); setShowPreview(true); if (onImageGenerated) { onImageGenerated(data.imageUrl); } } else { setStatus("error"); setMessage(data.error || data.message || "Failed to generate image"); } } catch (error) { setStatus("error"); setMessage( error instanceof Error ? error.message : "An unexpected error occurred", ); } finally { setIsGenerating(false); } }; return (
Generate cover image for:{" "} {projectTitle}
💡 How it works: The AI analyzes your project&aposs title, description, category, and tech stack to create a unique cover image using Stable Diffusion. Generation takes 15-30 seconds.
Image Size: 1024x768 (4:3 aspect ratio)
Quality: High (30 steps, CFG 7)
Sampler: DPM++ 2M Karras
Model: SDXL Base / Category-specific