openoperator / hooks /useDebouncedCallback.ts
Leon4gr45's picture
Deploy to clean space
75fefa7 verified
import {
useCallback, useRef
} from 'react';
const DEFAULT_CONFIG = { timeout: 0 };
export function useDebouncedCallback<T extends (...args: any[]) => any>(
callback: T,
config: number | { timeout?: number }
): T {
const timeoutRef = useRef(0);
const callbackRef = useRef(callback);
callbackRef.current = callback;
const currentConfig = typeof config === 'object' ? {
...DEFAULT_CONFIG,
...config
} : {
...DEFAULT_CONFIG,
timeout: config
};
return useCallback((...args: Parameters<T>) => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef.current = window.setTimeout(() => {
callbackRef.current(...args);
}, currentConfig.timeout);
}, [currentConfig.timeout]) as T;
}
export default useDebouncedCallback;