import { useRef, useState, type ChangeEvent } from 'react' import { Button } from '@/components/ui/button' import { Upload, X, FileAudio } from 'lucide-react' import { toast } from 'sonner' import { useAudioValidation } from '@/hooks/useAudioValidation' interface AudioInfo { duration: number size: number } interface FileUploaderProps { value: File | null onChange: (file: File | null) => void error?: string } export function FileUploader({ value, onChange, error }: FileUploaderProps) { const inputRef = useRef(null) const { validateAudioFile } = useAudioValidation() const [isValidating, setIsValidating] = useState(false) const [audioInfo, setAudioInfo] = useState(null) const handleFileSelect = async (e: ChangeEvent) => { const file = e.target.files?.[0] if (!file) return setIsValidating(true) const result = await validateAudioFile(file) setIsValidating(false) if (result.valid && result.duration) { onChange(file) setAudioInfo({ duration: result.duration, size: file.size }) } else { toast.error(result.error || '文件验证失败') e.target.value = '' } } const handleRemove = () => { onChange(null) setAudioInfo(null) if (inputRef.current) { inputRef.current.value = '' } } return (
{!value ? ( ) : (

{value.name}

{audioInfo && (

{(audioInfo.size / 1024 / 1024).toFixed(2)} MB · {audioInfo.duration.toFixed(1)} 秒

)}
)} {error &&

{error}

}
) }