import { useState, useCallback, useMemo } from 'react' import { Upload, Play } from 'lucide-react' import { useAppStore } from '@/store/appStore' import { formatBytes } from '@/lib/utils' export function UploadPanel() { const [file, setFile] = useState(null) const [duration, setDuration] = useState(null) const startRun = useAppStore((s) => s.startRun) const onFiles = useCallback((files: FileList | null) => { if (!files || files.length === 0) return const f = files[0] setFile(f) // compute duration const url = URL.createObjectURL(f) const audio = new Audio(url) audio.addEventListener('loadedmetadata', () => { setDuration(audio.duration) URL.revokeObjectURL(url) }) }, []) const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault() onFiles(e.dataTransfer.files) }, [onFiles]) const handleBrowse = useCallback((e: React.ChangeEvent) => { onFiles(e.target.files) }, [onFiles]) const disabled = !file const durationText = useMemo(() => { if (duration == null) return '—' const m = Math.floor(duration / 60) const s = Math.round(duration % 60) return `${m}:${s.toString().padStart(2, '0')}` }, [duration]) return (
e.preventDefault()} onDrop={handleDrop} className="border-2 border-dashed rounded-lg p-6 text-center hover:bg-muted/50" >

Drag and drop WAV/MP3/M4A here or click to browse

{file && (
{file.name} Size: {formatBytes(file.size)} Duration: {durationText}
)}
) }