@mdus/use-timer-hooks
Version:
React timer hooks — useTimeout and useInterval with cleanup, lifecycle safety, and manual control.
2 lines (1 loc) • 974 B
JavaScript
import{useRef as r,useState as t,useEffect as e,useCallback as n}from"react";function u(u,c){const l=r(u),o=r(null),[i,s]=t(!1);e(()=>{l.current=u},[u]);const m=n(()=>{"number"==typeof c&&null===o.current&&(o.current=setInterval(()=>{l.current?.()},c),s(!0))},[c]),a=n(()=>{null!==o.current&&(clearInterval(o.current),o.current=null,s(!1))},[]),f=n(()=>{a(),m()},[a,m]);return e(()=>{if("number"==typeof c)return m(),a},[c,m,a]),{startInterval:m,stopInterval:a,resetInterval:f,isIntervalActive:i}}function c(u,c){const l=r(u),o=r(null),[i,s]=t(!1);e(()=>{l.current=u},[u]);const m=n(()=>{"number"==typeof c&&null===o.current&&(o.current=setTimeout(()=>{l.current?.(),o.current=null,s(!1)},c),s(!0))},[c]),a=n(()=>{null!==o.current&&(clearTimeout(o.current),o.current=null,s(!1))},[]),f=n(()=>{a(),m()},[a,m]);return e(()=>{if("number"==typeof c)return m(),a},[c,m,a]),{startTimeout:m,stopTimeout:a,resetTimeout:f,isTimeoutActive:i}}export{u as useInterval,c as useTimeout};