import { useCallback, useState } from "react"; import { Upload, File, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; type UploadedFile = { name: string; size: number; type: string; }; type FileUploadZoneProps = { onFilesSelected: (files: File[]) => void; onClose?: () => void; }; export function FileUploadZone({ onFilesSelected, onClose }: FileUploadZoneProps) { const [dragActive, setDragActive] = useState(false); const [selectedFiles, setSelectedFiles] = useState([]); const handleDrag = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (e.type === "dragenter" || e.type === "dragover") { setDragActive(true); } else if (e.type === "dragleave") { setDragActive(false); } }, []); const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setDragActive(false); const files = Array.from(e.dataTransfer.files); handleFiles(files); }, []); const handleFiles = (files: File[]) => { const uploadedFiles = files.map(f => ({ name: f.name, size: f.size, type: f.type })); setSelectedFiles(prev => [...prev, ...uploadedFiles]); onFilesSelected(files); }; const handleFileInput = (e: React.ChangeEvent) => { if (e.target.files) { handleFiles(Array.from(e.target.files)); } }; const removeFile = (index: number) => { setSelectedFiles(prev => prev.filter((_, i) => i !== index)); }; const formatFileSize = (bytes: number) => { if (bytes < 1024) return bytes + " B"; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB"; return (bytes / (1024 * 1024)).toFixed(1) + " MB"; }; return (

Upload Files

{onClose && ( )}

Drag and drop files here

or

Supports: .html, .js, .css, .py, .json, and more

{selectedFiles.length > 0 && (

Selected Files:

{selectedFiles.map((file, index) => (

{file.name}

{formatFileSize(file.size)}

))}
)}
); }