import React, { useState, useRef, useCallback } from 'react'; import { Upload, Film, Globe, X, Plus, Loader } from 'lucide-react'; import { Button } from '../ui'; import MultiLangPicker from './MultiLangPicker'; import { PRESETS } from '../utils/constants'; import './BatchAddDialog.css'; /** * BatchAddDialog — multi-file drop zone + shared settings for batch dubbing. * * Users drop N video files, pick languages + voice, then click "Add to Queue". * Each file is POSTed as a separate job to the batch endpoint. */ export default function BatchAddDialog({ open, onClose, profiles = [], onEnqueue, // async (files, settings) => void }) { const [files, setFiles] = useState([]); const [langs, setLangs] = useState([{ lang: 'Spanish', code: 'es' }]); const [voiceId, setVoiceId] = useState(''); const [preserveBg, setPreserveBg] = useState(true); const [submitting, setSubmitting] = useState(false); const fileInputRef = useRef(null); const handleDrop = useCallback((e) => { e.preventDefault(); const dropped = Array.from(e.dataTransfer.files).filter(f => f.type.startsWith('video/')); if (dropped.length) setFiles(prev => [...prev, ...dropped]); }, []); const removeFile = (idx) => { setFiles(prev => prev.filter((_, i) => i !== idx)); }; const handleSubmit = async () => { if (!files.length || !langs.length) return; setSubmitting(true); try { await onEnqueue?.(files, { langs, voiceId, preserveBg }); setFiles([]); onClose?.(); } finally { setSubmitting(false); } }; if (!open) return null; return (