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