'use client'; import * as React from 'react'; import { Upload, X } from 'lucide-react'; import { cn } from '@/lib/utils/cn'; import { formatFileSize } from '@/lib/utils/fileUtils'; import { Button } from '@/components/ui/Button'; export interface FileUploadProps { onFileSelect: (files: File[]) => void; onFileRemove: (index: number) => void; selectedFiles?: File[]; accept?: string; maxSizeMB?: number; disabled?: boolean; } export function FileUpload({ onFileSelect, onFileRemove, selectedFiles = [], accept, maxSizeMB = 500, disabled = false, }: FileUploadProps) { const [isDragging, setIsDragging] = React.useState(false); const fileInputRef = React.useRef(null); const handleDragEnter = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (!disabled) { setIsDragging(true); } }; const handleDragLeave = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (disabled) return; const files = Array.from(e.dataTransfer.files); if (files.length > 0) { handleFiles(files); } }; const handleFileInput = (e: React.ChangeEvent) => { const files = Array.from(e.target.files || []); if (files.length > 0) { handleFiles(files); } }; const handleFiles = (files: File[]) => { // Check file sizes const maxBytes = maxSizeMB * 1024 * 1024; const validFiles = files.filter(file => { if (file.size > maxBytes) { alert(`${file.name} exceeds ${maxSizeMB}MB limit and will be skipped.`); return false; } return true; }); if (validFiles.length > 0) { onFileSelect(validFiles); } // Reset input if (fileInputRef.current) { fileInputRef.current.value = ''; } }; const handleClick = () => { if (!disabled) { fileInputRef.current?.click(); } }; const handleRemove = (index: number) => (e: React.MouseEvent) => { e.stopPropagation(); onFileRemove(index); }; return (
{selectedFiles.length > 0 ? (
{selectedFiles.map((file, index) => (

{file.name}

{formatFileSize(file.size)}

))} {/* Add more files button */}
) : (

Drop your files here or click to browse

Maximum file size: {maxSizeMB}MB per file

)}
); }