import React, { useState, useCallback } from 'react'; import { Upload, File, X, AlertCircle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; const FileUpload = ({ onFileSelect, acceptedTypes = '.pdf,.png,.jpg,.jpeg,.tiff,.tif,.txt' }) => { const [dragActive, setDragActive] = useState(false); const [selectedFile, setSelectedFile] = useState(null); const [error, setError] = 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[0]) { handleFileSelection(e.dataTransfer.files[0]); } }, []); const handleFileSelection = (file) => { setError(''); // Check file size (50MB limit) if (file.size > 50 * 1024 * 1024) { setError('File size must be less than 50MB'); return; } // Check file type const allowedTypes = acceptedTypes.split(',').map(type => type.trim().toLowerCase()); const fileExtension = '.' + file.name.split('.').pop().toLowerCase(); if (!allowedTypes.includes(fileExtension)) { setError(`File type not supported. Allowed types: ${acceptedTypes}`); return; } setSelectedFile(file); onFileSelect(file); }; const handleFileInput = (e) => { if (e.target.files && e.target.files[0]) { handleFileSelection(e.target.files[0]); } }; const removeFile = () => { setSelectedFile(null); setError(''); onFileSelect(null); }; 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 parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; return (
{!selectedFile ? (

Drop your file here, or{' '} browse

Supports: PDF, PNG, JPG, TIFF, TXT (max 50MB)

) : (

{selectedFile.name}

{formatFileSize(selectedFile.size)}

)} {error && (
{error}
)}
); }; export default FileUpload;