({
expiryTimestamp: expiry,
onExpire = () => {},
autoStart = true,
interval: customInterval = SECOND_INTERVAL,
}: useTimerSettingsType)
| 20 | }; |
| 21 | |
| 22 | export default function useTimer({ |
| 23 | expiryTimestamp: expiry, |
| 24 | onExpire = () => {}, |
| 25 | autoStart = true, |
| 26 | interval: customInterval = SECOND_INTERVAL, |
| 27 | }: useTimerSettingsType): useTimerResultType { |
| 28 | const [expiryTimestamp, setExpiryTimestamp] = useState(expiry); |
| 29 | const [milliseconds, setMilliseconds] = useState(Time.getMillisecondsFromExpiry(expiryTimestamp)); |
| 30 | const [isRunning, setIsRunning] = useState(autoStart); |
| 31 | const [didStart, setDidStart] = useState(autoStart); |
| 32 | const [interval, setInterval] = useState<number | null>(customInterval); |
| 33 | |
| 34 | const handleExpire = useCallback(() => { |
| 35 | if (Validate.onExpire(onExpire)) { |
| 36 | onExpire(); |
| 37 | } |
| 38 | setIsRunning(false); |
| 39 | setInterval(null); |
| 40 | }, [onExpire]); |
| 41 | |
| 42 | const pause = useCallback(() => { |
| 43 | setIsRunning(false); |
| 44 | }, []); |
| 45 | |
| 46 | const restart = useCallback((newExpiryTimestamp: Date, newAutoStart = true) => { |
| 47 | setInterval(customInterval); |
| 48 | setDidStart(newAutoStart); |
| 49 | setIsRunning(newAutoStart); |
| 50 | setExpiryTimestamp(newExpiryTimestamp); |
| 51 | setMilliseconds(Time.getMillisecondsFromExpiry(newExpiryTimestamp)); |
| 52 | }, [customInterval]); |
| 53 | |
| 54 | const resume = useCallback(() => { |
| 55 | const time = new Date(); |
| 56 | time.setMilliseconds(time.getMilliseconds() + milliseconds); |
| 57 | restart(time); |
| 58 | }, [milliseconds, restart]); |
| 59 | |
| 60 | const start = useCallback(() => { |
| 61 | if (didStart) { |
| 62 | setMilliseconds(Time.getMillisecondsFromExpiry(expiryTimestamp)); |
| 63 | setIsRunning(true); |
| 64 | } else { |
| 65 | resume(); |
| 66 | } |
| 67 | }, [expiryTimestamp, didStart, resume]); |
| 68 | |
| 69 | useInterval(() => { |
| 70 | const millisecondsValue = Time.getMillisecondsFromExpiry(expiryTimestamp); |
| 71 | setMilliseconds(millisecondsValue); |
| 72 | if (millisecondsValue <= 0) { |
| 73 | handleExpire(); |
| 74 | } else if (interval && millisecondsValue < interval) { |
| 75 | setInterval(millisecondsValue); |
| 76 | } |
| 77 | }, isRunning ? interval : null); |
| 78 | |
| 79 | useEffect(() => { |
no test coverage detected
searching dependent graphs…