@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
92 lines (91 loc) • 2.77 kB
JavaScript
"use client";
const require_use_callback_ref = require("../utils/use-callback-ref/use-callback-ref.cjs");
let react = require("react");
//#region packages/@mantine/hooks/src/use-debounced-callback/use-debounced-callback.ts
function useDebouncedCallback(callback, options) {
const { delay, flushOnUnmount, leading } = typeof options === "number" ? {
delay: options,
flushOnUnmount: false,
leading: false
} : options;
const handleCallback = require_use_callback_ref.useCallbackRef(callback);
const debounceTimerRef = (0, react.useRef)(0);
const lastCallback = (0, react.useMemo)(() => {
const currentCallback = Object.assign((...args) => {
window.clearTimeout(debounceTimerRef.current);
const isFirstCall = currentCallback._isFirstCall;
currentCallback._isFirstCall = false;
function clearTimeoutAndLeadingRef() {
window.clearTimeout(debounceTimerRef.current);
debounceTimerRef.current = 0;
currentCallback._isFirstCall = true;
}
if (leading && isFirstCall) {
handleCallback(...args);
const resetLeadingState = () => {
clearTimeoutAndLeadingRef();
};
const flush = () => {
if (debounceTimerRef.current !== 0) {
clearTimeoutAndLeadingRef();
handleCallback(...args);
}
};
const cancel = () => {
clearTimeoutAndLeadingRef();
};
currentCallback.flush = flush;
currentCallback.cancel = cancel;
debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);
return;
}
if (leading && !isFirstCall) {
const flush = () => {
if (debounceTimerRef.current !== 0) {
clearTimeoutAndLeadingRef();
handleCallback(...args);
}
};
const cancel = () => {
clearTimeoutAndLeadingRef();
};
currentCallback.flush = flush;
currentCallback.cancel = cancel;
const resetLeadingState = () => {
clearTimeoutAndLeadingRef();
};
debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);
return;
}
const flush = () => {
if (debounceTimerRef.current !== 0) {
clearTimeoutAndLeadingRef();
handleCallback(...args);
}
};
const cancel = () => {
clearTimeoutAndLeadingRef();
};
currentCallback.flush = flush;
currentCallback.cancel = cancel;
debounceTimerRef.current = window.setTimeout(flush, delay);
}, {
flush: () => {},
cancel: () => {},
_isFirstCall: true
});
return currentCallback;
}, [
handleCallback,
delay,
leading
]);
(0, react.useEffect)(() => () => {
if (flushOnUnmount) lastCallback.flush();
else lastCallback.cancel();
}, [lastCallback, flushOnUnmount]);
return lastCallback;
}
//#endregion
exports.useDebouncedCallback = useDebouncedCallback;
//# sourceMappingURL=use-debounced-callback.cjs.map