MCPcopy Create free account
hub / github.com/amrlabib/react-timer-hook / useTimer

Function useTimer

src/useTimer.ts:22–86  ·  view source on GitHub ↗
({
  expiryTimestamp: expiry,
  onExpire = () => {},
  autoStart = true,
  interval: customInterval = SECOND_INTERVAL,
}: useTimerSettingsType)

Source from the content-addressed store, hash-verified

20};
21
22export 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(() => {

Callers 1

UseTimerDemoFunction · 0.85

Calls 5

useIntervalFunction · 0.90
onExpireMethod · 0.80
expiryTimestampMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…