import { useState, useRef, useCallback } from "react"; interface DropZoneProps { onFilesSelected: (files: File[]) => void; disabled?: boolean; } export default function DropZone({ onFilesSelected, disabled }: DropZoneProps) { const [isDragging, setIsDragging] = useState(false); const inputRef = useRef(null); const dragCounter = useRef(0); const handleDragEnter = useCallback((e: React.DragEvent) => { e.preventDefault(); dragCounter.current++; if (e.dataTransfer.items.length > 0) { setIsDragging(true); } }, []); const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); dragCounter.current--; if (dragCounter.current === 0) { setIsDragging(false); } }, []); const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); }, []); const handleDrop = useCallback( (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); dragCounter.current = 0; if (disabled) return; const files = Array.from(e.dataTransfer.files); if (files.length > 0) { onFilesSelected(files); } }, [onFilesSelected, disabled], ); const handleClick = () => { if (!disabled) { inputRef.current?.click(); } }; const handleFileChange = (e: React.ChangeEvent) => { const files = Array.from(e.target.files || []); if (files.length > 0) { onFilesSelected(files); } e.target.value = ""; }; return (
{isDragging ? "Release" : "Drop"}

{disabled ? "Select a device first" : isDragging ? "Release to send" : "Drop files here"}

or click to choose

); }