import clsx from "clsx"; import { createSignal } from "solid-js"; type FileInputProps = { onFileSelect: (file: File) => void; onError?: (message: string) => void; accept?: string; disabled?: boolean; maxSize?: number; // in bytes }; export default function FileDropZone(props: FileInputProps) { const [isDragOver, setIsDragOver] = createSignal(false); let inputRef: HTMLInputElement | undefined; const validateAndSelect = (file: File) => { if (props.maxSize && file.size > props.maxSize) { props.onError?.(`File size exceeds limit of ${(props.maxSize / (1024 * 1024)).toFixed(0)}MB`); return; } props.onFileSelect(file); }; const handleDragOver = (e: DragEvent) => { e.preventDefault(); if (!props.disabled) { setIsDragOver(true); } }; const handleDragLeave = () => { setIsDragOver(false); }; const handleDrop = (e: DragEvent) => { e.preventDefault(); setIsDragOver(false); if (props.disabled) return; if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) { validateAndSelect(e.dataTransfer.files[0]); } }; const handleClick = () => { if (!props.disabled) { inputRef?.click(); } }; const handleInputChange = (e: Event) => { const target = e.target as HTMLInputElement; if (target.files && target.files.length > 0) { validateAndSelect(target.files[0]); } }; return (
Click to upload or drag and drop
PDF or DOCX (max 10MB)