From e1bc89a3b6b236534682af98e6fe87f0b668f78b Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 12 May 2026 17:12:16 +0800 Subject: [PATCH] auto-save 2026-05-12 17:12 (~3) --- .memory/worklog.json | 7 +++++++ web/app/page.tsx | 7 +++++++ web/components/nodes/index.tsx | 12 +++++++----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index 4982249..dd5302e 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -111,6 +111,13 @@ "message": "auto-save 2026-05-12 17:00 (~3)", "hash": "4138bea", "files_changed": 3 + }, + { + "ts": "2026-05-12T17:06:43+08:00", + "type": "commit", + "message": "auto-save 2026-05-12 17:06 (+1, ~3)", + "hash": "94afd6d", + "files_changed": 4 } ] } diff --git a/web/app/page.tsx b/web/app/page.tsx index 5f8a286..0929d50 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -141,8 +141,15 @@ export default function Home() { }, [job?.id]) // 轮询 Job(downloaded / transcribed / failed 三态停止) + const prevStatusRef = useRef(null) useEffect(() => { if (!job) return + // 状态切到 downloaded 时提示用户点解析(仅一次) + if (job.status === "downloaded" && prevStatusRef.current !== "downloaded") { + toast.info("📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮", { duration: 6000 }) + } + prevStatusRef.current = job.status + const TERMINAL: Job["status"][] = ["downloaded", "transcribed", "failed"] if (TERMINAL.includes(job.status)) { if (pollRef.current) { clearInterval(pollRef.current); pollRef.current = null } diff --git a/web/components/nodes/index.tsx b/web/components/nodes/index.tsx index c848a9d..bc581a5 100644 --- a/web/components/nodes/index.tsx +++ b/web/components/nodes/index.tsx @@ -141,14 +141,16 @@ export function InputNode({ data, selected }: NodeProps<{ data: NodeData }> | an type="button" disabled={isAnalyzing || d.analyzing} onClick={d.onAnalyze} - className="mt-2 w-full text-[12px] py-2 rounded-md bg-gradient-to-r from-indigo-500 to-violet-500 text-white hover:opacity-95 disabled:opacity-40 disabled:cursor-not-allowed flex items-center justify-center gap-1.5 font-medium" + className={`mt-2 w-full text-[14px] py-3 rounded-md bg-gradient-to-r from-indigo-500 to-violet-500 text-white hover:opacity-95 disabled:opacity-40 disabled:cursor-not-allowed flex items-center justify-center gap-2 font-semibold shadow-lg shadow-violet-500/30 ${ + !isAnalyzing && !d.analyzing && !isDone ? "animate-[pulse_2s_ease-in-out_infinite] ring-2 ring-violet-400/40 ring-offset-2 ring-offset-transparent" : "" + }`} > {(isAnalyzing || d.analyzing) ? ( - <> 解析中… + <> 解析中… ) : isDone ? ( "重新解析" ) : ( - "解析 →" + <>▶ 点这里开始解析 )} @@ -265,10 +267,10 @@ export function KeyframeNode({ data, selected }: any) { )} } title="关键帧 · Keyframes" - subtitle={`STEP 4 · ${frames.length ? `${d.selectedFrames.size}/${frames.length} 选用` : "等待抽取"}`} + subtitle={`STEP 4 · ffmpeg · ${frames.length ? `${d.selectedFrames.size}/${frames.length} 选用` : "等待抽取"}`} width={KEYFRAME_WIDTH} selected={selected} >