import React, { useCallback, useState } from 'react'; import { UploadCloud } from 'lucide-react'; import { useToast } from '../../components/feedback/ToastProvider'; interface FileUploadZoneProps { onFilesSelected: (files: File[]) => void; acceptedFormats?: string[]; maxSizeInMB?: number; } export const FileUploadZone: React.FC = ({ onFilesSelected, acceptedFormats = ['.wav', '.mp3', '.aiff', '.flac', '.zip'], maxSizeInMB = 500, }) => { const { addToast } = useToast(); const [isDragging, setIsDragging] = useState(false); const validateFile = (file: File): boolean => { // Check size if (file.size > maxSizeInMB * 1024 * 1024) { addToast(`File ${file.name} exceeds ${maxSizeInMB}MB limit`, 'error'); return false; } // Check extension (simple check) const ext = `.${file.name.split('.').pop()?.toLowerCase()}`; if (!acceptedFormats.includes(ext)) { addToast(`Format ${ext} not supported for ${file.name}`, 'error'); return false; } return true; }; const handleDrop = useCallback( (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); const droppedFiles = Array.from(e.dataTransfer.files); const validFiles = droppedFiles.filter(validateFile); if (validFiles.length > 0) { onFilesSelected(validFiles); } }, [onFilesSelected], ); const handleFileInput = (e: React.ChangeEvent) => { if (e.target.files) { const selectedFiles = Array.from(e.target.files); const validFiles = selectedFiles.filter(validateFile); if (validFiles.length > 0) { onFilesSelected(validFiles); } } }; return (
{ e.preventDefault(); setIsDragging(true); }} onDragLeave={() => setIsDragging(false)} onDrop={handleDrop} className={` border-2 border-dashed rounded-xl p-12 flex flex-col items-center justify-center text-center transition-all duration-[var(--duration-normal)] group cursor-pointer ${ isDragging ? 'border-primary bg-primary/10 scale-[1.02]' : 'border-border/50 bg-muted/30 hover:bg-muted/50 hover:border-border/50' } `} >
); };