-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
38 lines (31 loc) · 1.06 KB
/
index.ts
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
import { DependencyList, EffectCallback, useEffect, useRef } from 'react';
import { useCallbackConst } from '../use-callback-const';
import { useEffectTrigger } from '../use-effect-trigger';
import { useInitialRender } from '../use-initial-render';
/**
* Executes the given effect on an interval.
*/
export function useInterval(effect: EffectCallback, deps: DependencyList, interval = 1000) {
const savedCallback = useRef(effect);
const isInitialRender = useInitialRender();
const isCleared = useRef(false);
// Remember the latest callback.
useEffect(() => {
savedCallback.current = effect;
}, [effect]);
// Set up the interval.
const triggerInterval = useEffectTrigger(() => {
if (!isInitialRender && !isCleared.current) return savedCallback.current();
return undefined;
}, [...deps]);
useEffect(() => {
const id = setInterval(() => {
triggerInterval();
}, interval);
return () => clearInterval(id);
}, [triggerInterval, interval]);
const clear = useCallbackConst(() => {
isCleared.current = true;
});
return clear;
}