"use client"; import { useRef, useState } from "react"; interface Props { onChange: (files: File[]) => void; files: File[]; disabled?: boolean; } export function FileUploader({ onChange, files, disabled }: Props) { const inputRef = useRef(null); const [dragOver, setDragOver] = useState(false); function addFiles(incoming: FileList | null) { if (!incoming) return; const next = [...files]; for (const file of Array.from(incoming)) { if (!next.some((f) => f.name === file.name && f.size === file.size)) { next.push(file); } } onChange(next); } function remove(index: number) { onChange(files.filter((_, i) => i !== index)); } return (
{ e.preventDefault(); setDragOver(true); }} onDragLeave={() => setDragOver(false)} onDrop={(e) => { e.preventDefault(); setDragOver(false); addFiles(e.dataTransfer.files); }} onClick={() => !disabled && inputRef.current?.click()} className={`flex cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed px-6 py-8 text-sm transition-colors ${ dragOver ? "border-primary-400 bg-primary-50" : "border-neutral-300 hover:border-neutral-400" } ${disabled ? "cursor-not-allowed opacity-60" : ""}`} > Drop files here or click to browse PDF, images up to 10 MB each addFiles(e.target.files)} accept=".pdf,.png,.jpg,.jpeg,.gif,.webp" />
{files.length > 0 && ( )}
); }