import { useState, useCallback } from 'react' import { motion, AnimatePresence } from 'framer-motion' import { UploadCloud, CheckCircle2, FileVideo, FileArchive, FileText, FileImage, Database, Zap, ShieldCheck } from 'lucide-react' import { useAnimatedNumber } from '../hooks/useUtils.js' const fileIcons = { video: FileVideo, archive: FileArchive, file: FileText, image: FileImage, database: Database, } export default function UploadScreen() { const [dragging, setDragging] = useState(false) const [uploads, setUploads] = useState([ { id: 1, name: 'movie.mov', size: '12.4 GB', progress: 84, speed: 1.82, status: 'uploading' }, ]) const handleDrop = useCallback((e) => { e.preventDefault() setDragging(false) const files = Array.from(e.dataTransfer?.files || []) if (files.length === 0) { const fakeFiles = [ { name: 'dataset_' + Math.random().toString(36).slice(2, 8) + '.tar.gz', size: '4.2 GB' }, { name: 'model_weights.bin', size: '8.1 GB' }, ] fakeFiles.forEach((f, i) => { setUploads(prev => [...prev, { id: Date.now() + i, name: f.name, size: f.size, progress: 0, speed: 2.0 + Math.random() * 2, status: 'uploading', }]) }) } }, []) return (
{/* Drop zone */} { e.preventDefault(); setDragging(true) }} onDragLeave={() => setDragging(false)} onDrop={handleDrop} onClick={() => setDragging(true)} > {/* Ripple background */} {dragging && ( <> )}

{dragging ? 'Release to upload' : 'Drop anything here'}

or click to browse

Instant start Hash verified
{/* Active uploads */}
{uploads.map(u => ( ))}
) } function UploadCard({ upload }) { const [progress, setProgress] = useState(upload.progress) const animatedSpeed = useAnimatedNumber(upload.speed, 500) useState(() => { if (upload.status === 'uploading') { const id = setInterval(() => { setProgress(prev => { if (prev >= 100) { clearInterval(id) return 100 } return prev + Math.random() * 4 }) }, 200) return () => clearInterval(id) } }, []) const remaining = ((100 - progress) / animatedSpeed * 10).toFixed(1) const isComplete = progress >= 100 return (
{upload.name}
{upload.size}
{isComplete ? ( Verified ) : ( {Math.round(progress)}% )}
Progress {Math.round(progress)}%
Speed {animatedSpeed.toFixed(2)} GB/s
Remaining {isComplete ? 'Done' : remaining + 's'}
Hash {isComplete ? 'Verified' : 'Verifying'}
) }