diff --git a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderTimers.tsx b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderTimers.tsx index 925d4ddff9..185cef40f5 100644 --- a/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderTimers.tsx +++ b/packages/webui/src/client/ui/RundownView/RundownHeader/RundownHeaderTimers.tsx @@ -33,13 +33,13 @@ function SingleTimer({ timer }: ISingleTimerProps) { const now = Date.now() - const isRunning = timer.mode!.type === 'countdown' && timer.mode!.pauseTime === null + const isRunning = timer.state !== null && !timer.state.paused - const { diff, isNegative, isFreeRun } = calculateDiff(timer, now) + const diff = calculateDiff(timer, now) const timeStr = RundownUtils.formatDiffToTimecode(Math.abs(diff), false, true, true, false, true) const parts = timeStr.split(':') - const timerSign = isFreeRun ? '+' : isNegative ? '-' : '+' + const timerSign = diff >= 0 ? '+' : '-' return (
{timer.label} @@ -74,27 +74,23 @@ function SingleTimer({ timer }: ISingleTimerProps) { ) } -function calculateDiff( - timer: RundownTTimer, - now: number -): { - diff: number - isNegative: boolean - isFreeRun: boolean -} { - if (timer.mode!.type === 'freeRun') { - const startTime = timer.mode!.startTime - const diff = now - startTime - return { diff, isNegative: false, isFreeRun: true } - } else if (timer.mode!.type === 'countdown') { - const endTime = timer.mode!.startTime + timer.mode!.duration - let diff = endTime - now - - if (timer.mode!.stopAtZero && diff < 0) { - diff = 0 - } - - return { diff, isNegative: diff >= 0, isFreeRun: false } +function calculateDiff(timer: RundownTTimer, now: number): number { + if (!timer.state) { + return 0 } - return { diff: 0, isNegative: false, isFreeRun: false } + + // Get current time: either frozen duration or calculated from zeroTime + const currentTime = timer.state.paused ? timer.state.duration : timer.state.zeroTime - now + + // Free run counts up, so negate to get positive elapsed time + if (timer.mode?.type === 'freeRun') { + return -currentTime + } + + // Apply stopAtZero if configured + if (timer.mode?.stopAtZero && currentTime < 0) { + return 0 + } + + return currentTime }