import { useState, useEffect } from 'react'; import { createPipeline, startPipeline, getCompileJobs } from '../../../api'; const fmtDur = (s) => { if (!s) return '0:00'; const m = Math.floor(s / 60); const sec = Math.round(s % 60); return `${m}:${String(sec).padStart(2, '0')}`; }; export default function PipelineStartModal({ library, initialTrackId, onClose, onCreated }) { const [inputType, setInputType] = useState('track'); // 'track' | 'compile' const [tid, setTid] = useState(initialTrackId || library?.[0]?.id || ''); const [cid, setCid] = useState(''); const [compileJobs, setCompileJobs] = useState([]); const [advanced, setAdvanced] = useState(false); const [visualStyle, setVisualStyle] = useState(''); const [bgMode, setBgMode] = useState(''); const [bgKeyword, setBgKeyword] = useState(''); const [error, setError] = useState(''); useEffect(() => { if (inputType === 'compile') { getCompileJobs() .then(r => { const list = (r.jobs || r || []); const completed = list.filter(j => j.status === 'done' || j.status === 'succeeded'); setCompileJobs(completed); if (completed.length && !cid) setCid(completed[0].id); }) .catch(e => setError(String(e))); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [inputType]); const submit = async () => { try { const payload = {}; if (inputType === 'track') { payload.track_id = parseInt(tid); } else { if (!cid) { setError('완료된 Mix를 선택해주세요'); return; } payload.compile_job_id = parseInt(cid); } if (visualStyle) payload.visual_style = visualStyle; if (bgMode) payload.background_mode = bgMode; if (bgKeyword) payload.background_keyword = bgKeyword; const p = await createPipeline(payload); await startPipeline(p.id); onCreated(p); } catch (e) { setError(e.message || String(e)); } }; return (