import React, { useCallback, useState } from 'react'; import { Upload, FileText, Image as ImageIcon, X } from 'lucide-react'; const FileUpload = ({ onFilesSelected, disabled }) => { const [dragActive, setDragActive] = useState(false); const [selectedFiles, setSelectedFiles] = useState([]); const handleDrag = useCallback((e) => { e.preventDefault(); e.stopPropagation(); if (e.type === 'dragenter' || e.type === 'dragover') { setDragActive(true); } else if (e.type === 'dragleave') { setDragActive(false); } }, []); const handleDrop = useCallback((e) => { e.preventDefault(); e.stopPropagation(); setDragActive(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { handleFiles(Array.from(e.dataTransfer.files)); } }, []); const handleFiles = (files) => { const validFiles = files.filter(file => { const validTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'application/pdf']; return validTypes.includes(file.type); }); if (validFiles.length !== files.length) { alert('Some files were skipped. Only images (JPEG, PNG, GIF, WEBP) and PDF files are supported.'); } setSelectedFiles(prev => [...prev, ...validFiles]); }; const handleFileInput = (e) => { if (e.target.files && e.target.files.length > 0) { handleFiles(Array.from(e.target.files)); } }; const removeFile = (index) => { setSelectedFiles(prev => prev.filter((_, i) => i !== index)); }; const handleProcess = () => { if (selectedFiles.length > 0) { onFilesSelected(selectedFiles); setSelectedFiles([]); } }; const formatFileSize = (bytes) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i]; }; return (
Drop your files here or click to browse
Support for images (JPEG, PNG, GIF, WEBP) and PDF files
{file.name}
{formatFileSize(file.size)} {file.type === 'application/pdf' && ' • Will be converted to images'}