import React, { useState, useRef, useCallback } from 'react'; import { Upload, File, X, FilePlus } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { useToast } from '@/hooks/use-toast'; import { cn } from '@/lib/utils'; interface FileUploadZoneProps { onFileUpload: (files: File[]) => void; isUploading: boolean; acceptedFileTypes?: string; maxFiles?: number; } export function MultipleFileUploadZone({ onFileUpload, isUploading, acceptedFileTypes = "application/pdf", maxFiles = 10, }: FileUploadZoneProps) { const { toast } = useToast(); const [isDragging, setIsDragging] = useState(false); const [uploadedFiles, setUploadedFiles] = useState([]); const fileInputRef = useRef(null); const handleDragEnter = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); }, []); const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); }, []); const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (!isDragging) { setIsDragging(true); } }, [isDragging]); const validateFile = (file: File) => { if (!file.type.match(acceptedFileTypes)) { toast({ title: "Invalid file type", description: "Please upload a PDF file.", variant: "destructive" }); return false; } if (file.size > 5 * 1024 * 1024) { toast({ title: "File too large", description: "File size should be less than 5MB.", variant: "destructive" }); return false; } return true; }; const handleFiles = (files: FileList | null) => { if (!files) return; const newFiles = Array.from(files).filter(validateFile); const totalFiles = uploadedFiles.length + newFiles.length; if (totalFiles > maxFiles) { toast({ title: "Too Many Files", description: `You can only upload up to ${maxFiles} files.`, variant: "destructive", }); return; } const updatedFiles = [...uploadedFiles, ...newFiles]; setUploadedFiles(updatedFiles); onFileUpload(updatedFiles); }; const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); handleFiles(e.dataTransfer.files); }, [uploadedFiles]); const handleFileSelect = useCallback((e: React.ChangeEvent) => { handleFiles(e.target.files); }, [uploadedFiles]); const handleBrowseClick = () => { if (fileInputRef.current) { fileInputRef.current.click(); } }; const handleRemoveFile = (index: number) => { const newFiles = [...uploadedFiles]; newFiles.splice(index, 1); setUploadedFiles(newFiles); onFileUpload(newFiles); }; return (
{isUploading ? (

Uploading files...

) : uploadedFiles.length > 0 ? (

{uploadedFiles.length} file(s) uploaded

    {uploadedFiles.map((file, index) => (
  • {file.name}
  • ))}
) : (

Drag and drop PDF files here

Or click to browse files

Up to {maxFiles} PDF files, 5MB each

)}
); }