import React, { useState, useEffect, useRef } from 'react'; import { Card, CardContent, Grid, Box, Typography, TextField, IconButton } from '@mui/material'; import { Upload as UploadIcon, Trash2 as DeleteIcon } from 'lucide-react'; import { audioUploadRowStyles } from '../theme'; export default function AudioUploadRow({ index, data, onChange, onRemove }) { const [audioFile, setAudioFile] = useState(null); const [audioUrl, setAudioUrl] = useState(''); const [isDragActive, setIsDragActive] = useState(false); const inputRef = useRef(null); useEffect(() => { if (!data.file && !data.audioUrl) { if (audioUrl) { URL.revokeObjectURL(audioUrl); } setAudioFile(null); setAudioUrl(''); } }, [data.file, data.audioUrl, audioUrl]); const acceptFile = (file) => { if (!file || !file.type.startsWith('audio/')) return; const url = URL.createObjectURL(file); setAudioFile(file); setAudioUrl(url); onChange(index, { ...data, file, audioUrl: url }); }; return ( inputRef.current?.click()} onDragOver={(e) => { e.preventDefault(); setIsDragActive(true); }} onDragLeave={() => setIsDragActive(false)} onDrop={(e) => { e.preventDefault(); setIsDragActive(false); acceptFile(e.dataTransfer.files?.[0]); }} sx={audioUploadRowStyles.uploadDropZone(isDragActive)} > acceptFile(e.target.files?.[0])} /> {audioFile ? ( {audioFile.name} {audioUrl && ( ) : ( {isDragActive ? 'Drop audio here' : ""} )} onChange(index, { ...data, prompt: e.target.value })} variant="outlined" /> onRemove(index)} sx={audioUploadRowStyles.deleteIconButton} > ); }