diff --git a/ivette/src/dome/renderer/dome.tsx b/ivette/src/dome/renderer/dome.tsx index d04e21d20fcd440535875bf7d366fbf13040dc04..7752ea709bd934fe979e394bfae31e11ccf54193 100644 --- a/ivette/src/dome/renderer/dome.tsx +++ b/ivette/src/dome/renderer/dome.tsx @@ -672,14 +672,20 @@ const DEC_CLOCK = (period: number): void => { }; export interface Timer { - /** Starts the timer, if not yet. */ + /** Starts or re-start the timer. */ start(): void; /** Stops the timer. Can be restarted after. */ stop(): void; - /** Elapsed time (in milliseconds). */ - time: number; + /** Stops and reset elapsed time. */ + clear(): void; /** Running timer. */ running: boolean; + /** Elapsed time (in milliseconds). */ + time: number; + /** Number of periods (rounded). */ + periods: number; + /** Blink state (odd number of periods). */ + blink: boolean; } /** @@ -695,16 +701,24 @@ export interface Timer { @param initStart - whether to initially start the timer (default is `false`) */ -export function useClock(period: number, initStart: boolean): Timer { +export function useClock(period: number, initStart = false): Timer { const started = React.useRef(0); const [time, setTime] = React.useState(0); const [running, setRunning] = React.useState(initStart); - const start = React.useCallback(() => setRunning(false), []); + const start = React.useCallback(() => { + setRunning(true); + setTime(0); + }, []); const stop = React.useCallback(() => { setRunning(false); setTime(0); started.current = 0; }, []); + const clear = React.useCallback(() => { + setRunning(false); + started.current = time; + setTime(0); + }, [time]); React.useEffect(() => { if (running) { const event = INC_CLOCK(period); @@ -719,7 +733,9 @@ export function useClock(period: number, initStart: boolean): Timer { }; } return undefined; }, [period, running]); - return { time, running, start, stop }; + const periods = Math.ceil(time / period); + const blink = !!(periods & 1); + return { running, time, periods, blink, start, stop, clear }; } // --------------------------------------------------------------------------