@byndyusoft-ui/use-throttled-callback
Version:
Byndyusoft UI React Hook
33 lines (32 loc) • 1.27 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = require("react");
const use_timeout_1 = __importDefault(require("@byndyusoft-ui/use-timeout"));
function useThrottledCallback(callback, delay, { leading = true, trailing = true } = {}) {
const argsRef = (0, react_1.useRef)(null);
const isThrottling = (0, react_1.useRef)(false);
const execute = (0, react_1.useCallback)(() => {
if (trailing && argsRef.current) {
callback(...argsRef.current);
argsRef.current = null;
}
isThrottling.current = false;
}, [callback, trailing]);
const { start } = (0, use_timeout_1.default)(execute, delay);
return (0, react_1.useCallback)((...args) => {
if (!isThrottling.current && leading) {
callback(...args);
}
else {
argsRef.current = args;
}
if (!isThrottling.current) {
isThrottling.current = true;
start();
}
}, [callback, delay, leading, trailing]);
}
exports.default = useThrottledCallback;