next-loaders
Version:
Provider server loader for NextJS
33 lines (32 loc) • 1.19 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { useCallback, useEffect, useRef } from "react";
export default function useThrottle(callback, delay) {
var timeoutRef = useRef();
var lastRun = useRef(0);
var callbackRef = useRef(callback);
useEffect(function () {
callbackRef.current = callback;
}, [callback]);
return useCallback(function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var now = Date.now();
if (delay <= 0 || Number.isNaN(delay) || !Number.isFinite(delay)) {
callbackRef.current.apply(callbackRef, args);
return;
}
if (now - lastRun.current >= delay) {
callbackRef.current.apply(callbackRef, args);
lastRun.current = now;
}
else {
timeoutRef.current && clearTimeout(timeoutRef.current);
timeoutRef.current = setTimeout(function () {
callbackRef.current.apply(callbackRef, args);
lastRun.current = Date.now();
}, delay - (now - lastRun.current));
}
}, [delay]);
}