// File: components/forms/file-upload.tsx "use client"; import { useRef, useState } from "react"; import { UploadCloud, X, File, FileText, Image as ImageIcon } from "lucide-react"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; interface FileUploadProps { onFilesChange: (files: File[]) => void; maxFiles?: number; maxSize?: number; // MB accept?: string; // e.g. ".pdf,.jpg,.png" } export function FileUpload({ onFilesChange, maxFiles = 5, maxSize = 50, accept }: FileUploadProps) { const [dragActive, setDragActive] = useState(false); const [files, setFiles] = useState([]); const inputRef = useRef(null); const handleDrag = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (e.type === "dragenter" || e.type === "dragover") { setDragActive(true); } else if (e.type === "dragleave") { setDragActive(false); } }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setDragActive(false); if (e.dataTransfer.files && e.dataTransfer.files[0]) { handleFiles(Array.from(e.dataTransfer.files)); } }; const handleChange = (e: React.ChangeEvent) => { e.preventDefault(); if (e.target.files && e.target.files[0]) { handleFiles(Array.from(e.target.files)); } }; const handleFiles = (newFiles: File[]) => { // Validate size & type here if needed const validFiles = newFiles.slice(0, maxFiles - files.length); const updatedFiles = [...files, ...validFiles]; setFiles(updatedFiles); onFilesChange(updatedFiles); }; const removeFile = (idx: number) => { const updatedFiles = files.filter((_, i) => i !== idx); setFiles(updatedFiles); onFilesChange(updatedFiles); }; const getFileIcon = (type: string) => { if (type.includes("image")) return ; if (type.includes("pdf")) return ; return ; }; return (
inputRef.current?.click()}>

Click to upload or drag and drop

PDF, DWG, DOCX (Max {maxSize}MB)

{/* File List */} {files.length > 0 && (
{files.map((file, idx) => (
{getFileIcon(file.type)} {file.name} ({(file.size / 1024 / 1024).toFixed(2)} MB)
))}
)}
); }