import { useState, useCallback, useRef } from "react"; import { Upload, Loader2, X, FileIcon } from "lucide-react"; interface EvidenceUploadProps { onUpload: (file: File) => Promise; isUploading: boolean; } export default function EvidenceUpload({ onUpload, isUploading }: EvidenceUploadProps) { const [isDragging, setIsDragging] = useState(false); const [selectedFile, setSelectedFile] = useState(null); const fileInputRef = useRef(null); const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); setIsDragging(true); }, []); const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); }, []); const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); const file = e.dataTransfer.files[0]; if (file) { setSelectedFile(file); } }, []); const handleFileSelect = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setSelectedFile(file); } }; const handleUpload = async () => { if (selectedFile) { await onUpload(selectedFile); setSelectedFile(null); if (fileInputRef.current) { fileInputRef.current.value = ""; } } }; const clearSelection = () => { setSelectedFile(null); if (fileInputRef.current) { fileInputRef.current.value = ""; } }; const formatFileSize = (bytes: number): string => { if (bytes < 1024) return bytes + " B"; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB"; return (bytes / (1024 * 1024)).toFixed(1) + " MB"; }; return (
{/* Drop zone */}
fileInputRef.current?.click()} className={`cursor-pointer rounded-lg border-2 border-dashed p-8 text-center transition-colors ${ isDragging ? "border-cyan-500 bg-cyan-500/10" : "border-gray-700 bg-gray-800/50 hover:border-gray-600 hover:bg-gray-800" }`} >

{isDragging ? ( "Drop file here" ) : ( <> Drag and drop a file, or browse )}

Screenshots, logs, pcap files, etc.

{/* Selected file preview */} {selectedFile && (

{selectedFile.name}

{formatFileSize(selectedFile.size)}

)}
); }