use-debounce
Version:
Debounce hook for react
3 lines (2 loc) • 2.77 kB
JavaScript
var r=require("react");function n(n,e,t,u){var c=this,i=r.useRef(null),a=r.useRef(0),l=r.useRef(0),o=r.useRef(null),f=r.useRef([]),s=r.useRef(),v=r.useRef(),d=r.useRef(n),m=r.useRef(!0),h=r.useRef(),b=r.useRef();d.current=n;var g="undefined"!=typeof window,R=!e&&0!==e&&g;if("function"!=typeof n)throw new TypeError("Expected a function");e=+e||0;var x=!!(t=t||{}).leading,E=!("trailing"in t)||!!t.trailing,p=!!t.flushOnExit&&E,y="maxWait"in t,w="debounceOnServer"in t&&!!t.debounceOnServer,D=y?Math.max(+t.maxWait||0,e):null,O=r.useMemo(function(){var r=function(r){var n=f.current,e=s.current;return f.current=s.current=null,a.current=r,l.current=l.current||r,v.current=d.current.apply(e,n)},n=function(r,n){R&&cancelAnimationFrame(o.current),o.current=R?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!m.current)return!1;var n=r-i.current;return!i.current||n>=e||n<0||y&&r-a.current>=D},O=function(n){return o.current=null,E&&f.current?r(n):(f.current=s.current=null,v.current)},F=function r(){var u=Date.now();if(x&&l.current===a.current&&L(),t(u))return O(u);if(m.current){var c=e-(u-i.current),o=y?Math.min(c,D-(u-a.current)):c;n(r,o)}},L=function(){u&&u({})},S=function(){if(g||w){var u,l=Date.now(),d=t(l);if(f.current=[].slice.call(arguments),s.current=c,i.current=l,p&&!h.current&&(h.current=function(){var r;"hidden"===(null==(r=global.document)?void 0:r.visibilityState)&&b.current.flush()},null==(u=global.document)||null==u.addEventListener||u.addEventListener("visibilitychange",h.current)),d){if(!o.current&&m.current)return a.current=i.current,n(F,e),x?r(i.current):v.current;if(y)return n(F,e),r(i.current)}return o.current||n(F,e),v.current}};return S.cancel=function(){var r=o.current;r&&(R?cancelAnimationFrame(o.current):clearTimeout(o.current)),a.current=0,f.current=i.current=s.current=o.current=null,r&&u&&u({})},S.isPending=function(){return!!o.current},S.flush=function(){return o.current?O(Date.now()):v.current},S},[x,y,e,D,E,p,R,g,w,u]);return b.current=O,r.useEffect(function(){return m.current=!0,function(){var r;p&&b.current.flush(),h.current&&(null==(r=global.document)||null==r.removeEventListener||r.removeEventListener("visibilitychange",h.current),h.current=null),m.current=!1}},[p]),O}function e(r,n){return r===n}exports.useDebounce=function(t,u,c){var i=c&&c.equalityFn||e,a=r.useRef(t),l=r.useState({})[1],o=n(r.useCallback(function(r){a.current=r,l({})},[l]),u,c,l),f=r.useRef(t);return i(f.current,t)||(o(t),f.current=t),[a.current,o]},exports.useDebouncedCallback=n,exports.useThrottledCallback=function(r,e,t){var u=void 0===t?{}:t,c=u.leading,i=u.trailing,a=u.flushOnExit;return n(r,e,{maxWait:e,leading:void 0===c||c,trailing:void 0===i||i,flushOnExit:void 0!==a&&a})};
//# sourceMappingURL=index.js.map