@winglet/react-utils
Version:
React utility library providing custom hooks, higher-order components (HOCs), and utility functions to enhance React application development with improved reusability and functionality
39 lines (36 loc) • 1.14 kB
JavaScript
import { useRef, useEffect } from 'react';
import { useHandle } from './useHandle.mjs';
import { useTimeout } from './useTimeout.mjs';
const useDebounce = (callback, dependencyList, ms, options) => {
const optionsRef = useRef({ immediate: options?.immediate ?? true });
const isScheduled = useRef(false);
const handleCallback = useHandle(callback);
const debouncedCallback = useHandle(() => {
if (optionsRef.current.immediate) {
if (isScheduled.current) {
isScheduled.current = false;
handleCallback();
}
}
else
handleCallback();
});
const { isIdle, schedule, cancel } = useTimeout(debouncedCallback, ms);
useEffect(() => {
if (optionsRef.current.immediate) {
if (isIdle()) {
handleCallback();
isScheduled.current = false;
}
else
isScheduled.current = true;
}
schedule();
}, dependencyList);
useEffect(() => cancel, [cancel]);
return {
isIdle,
cancel,
};
};
export { useDebounce };