@lesnoypudge/utils-react
Version:
lesnoypudge's utils-react
37 lines (36 loc) • 1.2 kB
JavaScript
import { useBoolean } from "../useBoolean/useBoolean.js";
import { useFunction } from "../useFunction/useFunction.js";
import { useLatest } from "../useLatest/useLatest.js";
import { useUnmountEffect } from "../useUnmountEffect/useUnmountEffect.js";
import { useRef } from "react";
const useDebounce = (options = {}) => {
const debounceState = useBoolean(false);
const isDebouncingRef = useRef(debounceState.value);
const timeoutRef = useRef();
const lastOptionsRef = useLatest(options);
const shouldUpdateState = !lastOptionsRef.current.stateless;
const debounce = useFunction((callback, delay) => {
return (...args) => {
clearTimeout(timeoutRef.current);
isDebouncingRef.current = true;
shouldUpdateState && debounceState.setTrue();
timeoutRef.current = setTimeout(() => {
callback(...args);
isDebouncingRef.current = false;
shouldUpdateState && debounceState.setFalse();
}, delay);
};
});
useUnmountEffect(() => {
clearTimeout(timeoutRef.current);
});
return {
isDebouncing: debounceState.value,
isDebouncingRef,
debounce
};
};
export {
useDebounce
};
//# sourceMappingURL=useDebounce.js.map