"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 (

AI Image Generator

Generate cover image for:{" "} {projectTitle}

{/* Current/Generated Image Preview */} {(generatedImageUrl || showPreview) && (
{generatedImageUrl ? ( {projectTitle} ) : (
)}
{generatedImageUrl && (
Current Image
)}
)}
{/* Status Message */} {message && ( {status === "success" && } {status === "error" && } {status === "idle" && isGenerating && ( )} {message} )} {/* Action Buttons */}
handleGenerate(false)} disabled={isGenerating || !!generatedImageUrl} className={`flex-1 py-3 px-4 rounded-xl font-semibold text-white transition-all duration-300 flex items-center justify-center gap-2 ${ isGenerating ? "bg-stone-400 cursor-not-allowed" : generatedImageUrl ? "bg-stone-300 cursor-not-allowed" : "bg-gradient-to-br from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700 shadow-lg hover:shadow-xl" }`} > {isGenerating ? ( <> Generating... ) : ( <> Generate Image )} {generatedImageUrl && ( handleGenerate(true)} disabled={isGenerating} className={`py-3 px-4 rounded-xl font-semibold transition-all duration-300 flex items-center justify-center gap-2 border-2 ${ isGenerating ? "bg-stone-100 border-stone-300 text-stone-400 cursor-not-allowed" : "bg-white border-purple-300 text-purple-700 hover:bg-purple-50 hover:border-purple-400" }`} > Regenerate )}
{/* Info Box */}

💡 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.

{/* Advanced Options (Optional) */}
Advanced Options

Image Size: 1024x768 (4:3 aspect ratio)

Quality: High (30 steps, CFG 7)

Sampler: DPM++ 2M Karras

Model: SDXL Base / Category-specific

); }