| 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 |