UNPKG

react-interval-hook

Version:

React hook for using self-correcting setInterval, augmented by management methods (start, stop, isActive)

2 lines (1 loc) 1.11 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react");function T(a,t=1e3,{onFinish:f=()=>{},autoStart:k=!0,immediate:d=!1,selfCorrecting:y=!0}={}){const u=e.useRef(),c=e.useRef(!1),s=e.useRef(null),l=e.useRef(a),o=e.useCallback(()=>{const r=s.current||0;if(y){const n=Date.now()-r,p=1+(n>0?Math.floor(n/t):0);s.current=r+t*p,i(Math.max(t-n,1)),l.current(p)}else i(t),l.current()},[t]),i=e.useCallback(r=>{u.current!==void 0&&clearTimeout(u.current),c.current?u.current=setTimeout(o,r):console.debug("Trying to set interval timeout on inactive timer, this is no-op and probably indicates bug in your code.")},[o,c]),b=e.useCallback(()=>{const r=c.current;c.current=!0,s.current===null&&(s.current=Date.now()+t),d&&!r&&(s.current-=t,o()),i(t)},[o,t,d,i]),m=e.useCallback((r=!0)=>{const n=c.current;u.current!==void 0&&clearTimeout(u.current),c.current=!1,u.current=void 0,s.current=null,n&&r&&f()},[f]),C=e.useCallback(()=>c.current,[]);return e.useEffect(()=>{l.current=a},[a]),e.useEffect(()=>(k&&b(),m),[]),{start:b,stop:m,isActive:C}}exports.useInterval=T;