返回 DeepSeek-Reasonix
workStatus.ts
根目录 / desktop / frontend / src / lib / workStatus.ts
1 // Work-status helpers shared by the transcript process-fold header and the
2 // live turn region's status row.
3
4 import { useEffect, useState } from "react";
5 import type { useT } from "./i18n";
6
7 export function useTick(on: boolean): number {
8 const [, setN] = useState(0);
9 useEffect(() => {
10 if (!on) return;
11 const id = window.setInterval(() => setN((n) => n + 1), 1000);
12 return () => window.clearInterval(id);
13 }, [on]);
14 return Date.now();
15 }
16
17 export function formatWorkDuration(durationMs: number, t: ReturnType<typeof useT>): string {
18 if (!Number.isFinite(durationMs) || durationMs <= 0) return "";
19 const totalSeconds = Math.max(1, Math.round(durationMs / 1000));
20 const minutes = Math.floor(totalSeconds / 60);
21 const seconds = totalSeconds % 60;
22 if (minutes <= 0) return t("transcript.durationSeconds", { s: totalSeconds });
23 if (seconds <= 0) return t("transcript.durationMinutes", { m: minutes });
24 return t("transcript.durationMinutesSeconds", { m: minutes, s: seconds });
25 }
26
27 export function workStatusLabel(durationMs: number, running: boolean, t: ReturnType<typeof useT>): string {
28 const duration = formatWorkDuration(durationMs, t);
29 if (running) {
30 return duration ? t("transcript.workingDuration", { duration }) : t("transcript.working");
31 }
32 return duration ? t("transcript.workedDuration", { duration }) : t("transcript.worked");
33 }
34
34 lines TYPESCRIPT