Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 1x 772x 1544x 1544x 1544x 1544x 772x 772x 772x 772x 772x 772x 4x 4x 4x 772x 16x 1x 16x 772x 3x 772x 772x 6x 6x 6x 1x 772x 41x 41x 16x 731x 731x 25x 41x 28x 12x 772x | import { useCallback, useEffect, useState } from 'react'; import { Config, ReturnValue } from './types'; export const useTimer = ({ initialTime = 0, interval = 1000, step = 1, timerType = 'INCREMENTAL', endTime, onTimeOver, }: Partial<Config> = {}): ReturnValue => { const [time, setTime] = useState(initialTime); const [isRunning, setIsRunning] = useState(false); const [isTimeOver, setIsTimeOver] = useState(false); const reset = useCallback(() => { setIsRunning(false); setIsTimeOver(false); setTime(initialTime); }, [initialTime]); const start = useCallback(() => { if (isTimeOver) { reset(); } setIsRunning(true); }, [reset, isTimeOver]); const pause = useCallback(() => { setIsRunning(false); }, []); useEffect(() => { if (isRunning && time === endTime) { setIsRunning(false); setIsTimeOver(true); if (typeof onTimeOver === 'function') { onTimeOver(); } } }, [endTime, onTimeOver, time, isRunning]); useEffect(() => { let intervalId: NodeJS.Timeout | null = null; if (isRunning) { intervalId = setInterval(() => { setTime(previousTime => timerType === 'DECREMENTAL' ? previousTime - step : previousTime + step ); }, interval); } else Iif (intervalId) { clearInterval(intervalId); } return () => { if (intervalId) { clearInterval(intervalId); } }; }, [isRunning, step, timerType, interval]); return { isRunning, pause, reset, start, time }; }; |