"use client"; import { useCallback, useState } from "react"; import { useDropzone } from "react-dropzone"; import { Upload, X, File } from "lucide-react"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; interface FileUploadProps { onFilesSelected: (files: File[]) => void; maxFiles?: number; accept?: string; maxSize?: number; // bytes } export function FileUpload({ onFilesSelected, maxFiles = 5, accept = ".pdf,.doc,.docx", maxSize = 10485760, // 10MB }: FileUploadProps) { const [files, setFiles] = useState([]); const onDrop = useCallback( (acceptedFiles: File[]) => { setFiles((prev) => { const newFiles = [...prev, ...acceptedFiles].slice(0, maxFiles); onFilesSelected(newFiles); return newFiles; }); }, [maxFiles, onFilesSelected] ); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, maxFiles, accept: accept.split(",").reduce((acc, ext) => ({ ...acc, [ext]: [] }), {}), maxSize, }); const removeFile = (index: number) => { setFiles((prev) => { const newFiles = prev.filter((_, i) => i !== index); onFilesSelected(newFiles); return newFiles; }); }; return (

{isDragActive ? "Drop files here" : "Drag & drop files or click to browse"}

Maximum {maxFiles} files, {(maxSize / 1024 / 1024).toFixed(0)}MB each

{files.length > 0 && (
{files.map((file, index) => (

{file.name}

{(file.size / 1024).toFixed(1)} KB

))}
)}
); }