'use client'; import { useState } from 'react'; import { Upload, X, Image as ImageIcon } from 'lucide-react'; interface ReferenceImage { id: string; data: string; // Base64 mimeType: string; preview: string; // Data URL para preview name: string; } interface ReferenceImagesProps { images: ReferenceImage[]; onImagesChange: (images: ReferenceImage[]) => void; maxImages?: number; } export function ReferenceImages({ images, onImagesChange, maxImages = 3 }: ReferenceImagesProps) { const [isDragging, setIsDragging] = useState(false); const handleFileSelect = async (files: FileList | null) => { if (!files || files.length === 0) return; const newImages: ReferenceImage[] = []; for (let i = 0; i < Math.min(files.length, maxImages - images.length); i++) { const file = files[i]; // Validar que sea una imagen if (!file.type.startsWith('image/')) { continue; } // Validar tamaño (máx 5MB) if (file.size > 5 * 1024 * 1024) { continue; } try { // Leer archivo como base64 const base64 = await fileToBase64(file); newImages.push({ id: `${Date.now()}-${i}`, data: base64, mimeType: file.type, preview: `data:${file.type};base64,${base64}`, name: file.name, }); } catch (error) { } } if (newImages.length > 0) { onImagesChange([...images, ...newImages]); } }; const fileToBase64 = (file: File): Promise => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => { const result = reader.result as string; // Remover el prefijo "data:image/...;base64," const base64 = result.split(',')[1]; resolve(base64); }; reader.onerror = reject; reader.readAsDataURL(file); }); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); handleFileSelect(e.dataTransfer.files); }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(true); }; const handleDragLeave = () => { setIsDragging(false); }; const removeImage = (id: string) => { onImagesChange(images.filter(img => img.id !== id)); }; return (
{/* Zona de drop */} {images.length < maxImages && (
handleFileSelect(e.target.files)} className="absolute inset-0 w-full h-full opacity-0 cursor-pointer" />

Arrastra imágenes aquí o haz clic para seleccionar

PNG, JPG, WebP (máx 5MB)

)} {/* Grid de imágenes */} {images.length > 0 && (
{images.map((image) => (
{image.name}
{image.name}
))}
)} {images.length === 0 && (

Las imágenes de referencia ayudan a guiar el estilo y composición de la imagen generada

)}
); }