mirror of
https://github.com/cpvalente/ontime.git
synced 2026-08-16 21:03:29 +00:00
feat: keep clock ticking on server drops
This commit is contained in:
committed by
Carlos Valente
parent
9e771a2f24
commit
37dc9a620d
@@ -0,0 +1,33 @@
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
import { useRuntimeStore } from '../stores/runtime';
|
||||
|
||||
const takeOverTimeMs = 1500;
|
||||
|
||||
/**
|
||||
* Keeps the clock value ticking if the server drops updates
|
||||
*/
|
||||
export function useAutoTickingClock(): number {
|
||||
const clock = useRuntimeStore((state) => state.clock);
|
||||
|
||||
const baselineRef = useRef({ clock, time: performance.now() });
|
||||
const [, setTick] = useState(0);
|
||||
|
||||
// Update baseline when server clock changes
|
||||
useEffect(() => {
|
||||
baselineRef.current = { clock, time: performance.now() };
|
||||
}, [clock]);
|
||||
|
||||
// Force periodic re-renders
|
||||
useEffect(() => {
|
||||
const id = setInterval(() => setTick((t) => t + 1), 1000);
|
||||
return () => clearInterval(id);
|
||||
}, []);
|
||||
|
||||
// Always derive from baseline + elapsed at render time
|
||||
const elapsed = performance.now() - baselineRef.current.time;
|
||||
if (elapsed < takeOverTimeMs) {
|
||||
return clock;
|
||||
}
|
||||
return baselineRef.current.clock + Math.round(elapsed);
|
||||
}
|
||||
@@ -143,8 +143,6 @@ export const useTimer = createSelector((state: RuntimeStore) => ({
|
||||
...state.timer,
|
||||
}));
|
||||
|
||||
export const useClock = createSelector((state: RuntimeStore) => state.clock);
|
||||
|
||||
export const useNextFlag = createSelector((state: RuntimeStore) => ({
|
||||
id: state.eventFlag?.id ?? null,
|
||||
expectedStart: state.offset.expectedFlagStart,
|
||||
|
||||
Reference in New Issue
Block a user