import { useCallback, useState } from 'react'; import { useDropzone } from 'react-dropzone'; import { Upload, X, Image as ImageIcon, Loader2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Progress } from '@/components/ui/progress'; import { useImageUpload } from '@/hooks/useImageUpload'; import { cn } from '@/lib/utils'; interface ImageUploaderProps { onUploadComplete: (urls: string[]) => void; maxFiles?: number; category?: string; className?: string; multiple?: boolean; } export const ImageUploader = ({ onUploadComplete, maxFiles = 5, category, className, multiple = true, }: ImageUploaderProps) => { const [previewUrls, setPreviewUrls] = useState([]); const { uploadSingle, uploadMultiple, uploading, progress } = useImageUpload({ category }); const onDrop = useCallback( async (acceptedFiles: File[]) => { // Create preview URLs const previews = acceptedFiles.map((file) => URL.createObjectURL(file)); setPreviewUrls(previews); // Upload files if (multiple && acceptedFiles.length > 1) { const response = await uploadMultiple(acceptedFiles); if (response?.success) { const urls = response.uploads.map((upload) => upload.url); onUploadComplete(urls); } else { // Clear previews on error setPreviewUrls([]); } } else { const response = await uploadSingle(acceptedFiles[0]); if (response?.success) { onUploadComplete([response.url]); } else { // Clear previews on error setPreviewUrls([]); } } }, [multiple, uploadSingle, uploadMultiple, onUploadComplete] ); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { 'image/jpeg': ['.jpg', '.jpeg'], 'image/png': ['.png'], 'image/webp': ['.webp'], 'image/gif': ['.gif'], }, maxFiles: multiple ? maxFiles : 1, multiple, disabled: uploading, }); const removePreview = (index: number) => { setPreviewUrls((prev) => prev.filter((_, i) => i !== index)); }; return (
{uploading ? ( ) : ( )}

{isDragActive ? 'Suelta las imágenes aquí...' : 'Arrastra y suelta imágenes aquí, o haz clic para seleccionar'}

JPG, PNG, WEBP, GIF hasta 5MB {multiple && `(máximo ${maxFiles} archivos)`}

{uploading && (
Subiendo... {progress}%
)} {previewUrls.length > 0 && (
{previewUrls.map((url, index) => (
{`Preview {!uploading && ( )}
))}
)}
); };