"use client" import { type Job, type JobStatus } from "@/lib/api" import { CheckCircle2, Circle, Loader2, XCircle } from "lucide-react" const STAGES: { key: JobStatus; label: string }[] = [ { key: "downloading", label: "下载视频" }, { key: "splitting", label: "拆分音视频" }, { key: "frames_extracted", label: "抽取关键帧" }, { key: "transcribing", label: "音频转写+改写" }, { key: "transcribed", label: "完成" }, ] const ORDER: JobStatus[] = ["created", "downloading", "splitting", "frames_extracted", "transcribing", "transcribed"] export function JobStatusBar({ job }: { job: Job }) { const currentIdx = ORDER.indexOf(job.status) return (
Job {job.id.slice(0, 8)}
{job.status === "failed" ? `失败: ${job.error ?? "未知错误"}` : (job.message ?? "")}
{STAGES.map((s, i) => { const stageIdx = ORDER.indexOf(s.key) const done = currentIdx >= stageIdx && job.status !== "failed" const active = currentIdx === stageIdx - 1 && job.status !== "failed" && job.status !== "transcribed" const failed = job.status === "failed" && currentIdx + 1 === stageIdx return (
{failed ? ( ) : done ? ( ) : active ? ( ) : ( )} {s.label}
{i < STAGES.length - 1 && (
)}
) })}
) }