-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathindex.js
43 lines (38 loc) · 978 Bytes
/
index.js
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
import { useEffect, useRef } from 'react';
const DEFAULT_CONFIG = {
timeout: 0,
ignoreInitialCall: true,
};
export function useDebouncedEffect(callback, config, deps = []) {
let currentConfig;
if (typeof config === 'object') {
currentConfig = {
...DEFAULT_CONFIG,
...config,
};
} else {
currentConfig = {
...DEFAULT_CONFIG,
timeout: config,
};
}
const { timeout, ignoreInitialCall } = currentConfig;
const data = useRef({ firstTime: true });
useEffect(() => {
const { firstTime, clearFunc } = data.current;
if (firstTime && ignoreInitialCall) {
data.current.firstTime = false;
return;
}
const handler = setTimeout(() => {
if (clearFunc && typeof clearFunc === 'function') {
clearFunc();
}
data.current.clearFunc = callback();
}, timeout);
return () => {
clearTimeout(handler);
};
}, [timeout, ...deps]);
}
export default useDebouncedEffect;