"use client" import { useState, useRef, useEffect } from "react" import { Upload, X, Loader2 } from "lucide-react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" const COMIC_STYLES = [ { id: "american-modern", name: "American Modern" }, { id: "manga", name: "Manga" }, { id: "noir", name: "Noir" }, { id: "vintage", name: "Vintage" }, ] interface GeneratePageModalProps { isOpen: boolean onClose: () => void onGenerate: (data: { prompt: string style: string characterFiles?: File[] characterUrls?: string[] // For reusing existing characters isContinuation?: boolean }) => void pageNumber: number previousCharacters?: File[] previousPagePrompt?: string previousPageStyle?: string existingCharacterImages?: string[] // Character images from previous pages } export function GeneratePageModal({ isOpen, onClose, onGenerate, pageNumber, previousCharacters, previousPagePrompt, previousPageStyle, existingCharacterImages = [], }: GeneratePageModalProps) { const [prompt, setPrompt] = useState("") const [uploadedFiles, setUploadedFiles] = useState(previousCharacters || []) const [selectedExistingCharacters, setSelectedExistingCharacters] = useState([]) const [previews, setPreviews] = useState([]) const [showPreview, setShowPreview] = useState(null) const [isGenerating, setIsGenerating] = useState(false) const [isContinuing, setIsContinuing] = useState(false) const fileInputRef = useRef(null) const selectedStyle = previousPageStyle || "noir" useEffect(() => { if (previousCharacters && previousCharacters.length > 0) { const newPreviews: string[] = [] previousCharacters.forEach((file, index) => { const reader = new FileReader() reader.onload = (e) => { newPreviews[index] = e.target?.result as string if (newPreviews.filter(Boolean).length === previousCharacters.length) { setPreviews([...newPreviews]) } } reader.readAsDataURL(file) }) } }, [previousCharacters]) const handleFiles = (newFiles: FileList | null) => { if (!newFiles) return const validFiles = Array.from(newFiles).filter((file) => file.type.startsWith("image/")) const totalFiles = [...uploadedFiles, ...validFiles].slice(0, 2) // Max 2 files setUploadedFiles(totalFiles) const newPreviews: string[] = [] totalFiles.forEach((file, index) => { const reader = new FileReader() reader.onload = (e) => { newPreviews[index] = e.target?.result as string if (newPreviews.filter(Boolean).length === totalFiles.length) { setPreviews([...newPreviews]) } } reader.readAsDataURL(file) }) } const removeFile = (index: number) => { const newFiles = uploadedFiles.filter((_, i) => i !== index) const newPreviews = previews.filter((_, i) => i !== index) setUploadedFiles(newFiles) setPreviews(newPreviews) setShowPreview(null) if (fileInputRef.current) { fileInputRef.current.value = "" } } const toggleExistingCharacter = (characterUrl: string) => { setSelectedExistingCharacters(prev => prev.includes(characterUrl) ? prev.filter(url => url !== characterUrl) : [...prev, characterUrl] ) } const handleGenerate = () => { if (!prompt.trim()) return setIsGenerating(true) onGenerate({ prompt, style: selectedStyle, characterFiles: uploadedFiles.length > 0 ? uploadedFiles : undefined, characterUrls: selectedExistingCharacters.length > 0 ? selectedExistingCharacters : undefined, isContinuation: false, }) } const handleContinue = () => { setIsContinuing(true) onGenerate({ prompt: prompt.trim() || `Continue the story from where it left off. Previous context: ${previousPagePrompt}`, style: selectedStyle, characterFiles: uploadedFiles.length > 0 ? uploadedFiles : undefined, characterUrls: selectedExistingCharacters.length > 0 ? selectedExistingCharacters : undefined, isContinuation: true, }) } useEffect(() => { if (!isOpen) { setIsGenerating(false) setIsContinuing(false) setPrompt("") } }, [isOpen]) return ( <> Generate Page {pageNumber}
{selectedStyle}