"use client"; import { useState, type ChangeEvent, type DragEvent, type ReactNode } from "react"; export const VPX_FILE_INPUT_ID = "vpx-file-input"; export interface FileDropZoneProps { onFile: (file: File) => void; onError: (message: string) => void; children: ReactNode; className?: string; } function validate(file: File | undefined, onFile: (file: File) => void, onError: (m: string) => void) { if (!file) return; if (!file.name.toLowerCase().endsWith(".vpx")) { onError(`"${file.name}" isn't a .vpx file.`); return; } onFile(file); } export default function FileDropZone({ onFile, onError, children, className = "" }: FileDropZoneProps) { const [isDragging, setIsDragging] = useState(false); const handleDrop = (e: DragEvent) => { e.preventDefault(); setIsDragging(false); validate(e.dataTransfer.files[0], onFile, onError); }; const handleInputChange = (e: ChangeEvent) => { validate(e.target.files?.[0], onFile, onError); e.target.value = ""; }; return (
{ e.preventDefault(); setIsDragging(true); }} onDragLeave={() => setIsDragging(false)} onDrop={handleDrop} className={`relative ${className}`} > {children} {isDragging && (
DROP TO LOAD
)}
); }