import { useState } from 'react'; import { cancelPipeline, publishPipeline } from '../../../api'; import PipelineDetailModal from './PipelineDetailModal'; const STEP_LABELS = ['커버','영상','썸네','메타','검토','발행']; function stepIndex(state) { if (!state) return -1; if (state.startsWith('cover')) return 0; if (state.startsWith('video')) return 1; if (state.startsWith('thumb')) return 2; if (state.startsWith('meta')) return 3; if (state.startsWith('ai_review') || state === 'publish_pending') return 4; if (state.startsWith('publish')) return 5; if (state === 'published') return 6; return -1; } export default function PipelineCard({ pipeline, onChanged }) { const [showDetail, setShowDetail] = useState(false); const i = stepIndex(pipeline.state); const title = pipeline.compile_title || pipeline.track_title || `Pipeline #${pipeline.id}`; const handleCardClick = (e) => { if (e.target.closest('button') || e.target.closest('a')) return; setShowDetail(true); }; return ( <>

{title}

{pipeline.visual_style && ( {pipeline.visual_style} )} {!['published','cancelled','failed'].includes(pipeline.state) && ( )}
{pipeline.cover_url && ( )} {pipeline.thumbnail_url && ( )} {pipeline.video_url && }
{STEP_LABELS.map((lbl, idx) => (
{lbl}
))}
현재: {pipeline.state}
{pipeline.review && (
AI 검토: {pipeline.review.verdict} ({pipeline.review.weighted_total}/100)
)} {pipeline.state === 'publish_pending' && ( )} {pipeline.youtube_video_id && ( 유튜브에서 보기 )}
{showDetail && setShowDetail(false)} />} ); }