import { useState, useRef, useCallback } from 'react'; import { Upload } from 'lucide-react'; import { cn } from '@/lib/utils'; interface FileDropZoneProps { accept?: string; multiple?: boolean; onFilesSelected: (files: File[]) => void; description?: string; disabled?: boolean; className?: string; } export function FileDropZone({ accept, multiple = false, onFilesSelected, description, disabled = false, className, }: FileDropZoneProps) { const [isDragging, setIsDragging] = useState(false); const fileInputRef = useRef(null); const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); if (!disabled) { setIsDragging(true); } }, [disabled]); const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); }, []); const handleDrop = useCallback( (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); if (disabled) return; const files = Array.from(e.dataTransfer.files); if (files.length > 0) { if (multiple) { onFilesSelected(files); } else { onFilesSelected([files[0]]); } } }, [disabled, multiple, onFilesSelected] ); const handleClick = useCallback(() => { if (!disabled) { fileInputRef.current?.click(); } }, [disabled]); const handleFileInputChange = useCallback( (e: React.ChangeEvent) => { const files = Array.from(e.target.files || []); if (files.length > 0) { onFilesSelected(files); } // Reset input value to allow selecting same file again if (fileInputRef.current) { fileInputRef.current.value = ''; } }, [onFilesSelected] ); return (
{/* 图标容器 */}
{/* 主文字 */}

{isDragging ? '松开以上传文件' : '点击或拖放文件到此处'}

{/* 副文字 */} {description && (

{description}

)} {/* 隐藏的文件输入 */}
); }