react-countdown-hook
Version:
Dead simple yet powerful countdown hook for React.
3 lines (2 loc) • 1.3 kB
JavaScript
import e from"react";export default(t=6e4,r=1e3)=>{const[n,u]=e.useState(0),a=e.useRef({}),c=e=>{a.current.started||(a.current.started=e,a.current.lastInterval=e);const t=Math.min(r,a.current.timeLeft||Infinity);e-a.current.lastInterval>=t&&(a.current.lastInterval+=t,u(e=>(a.current.timeLeft=e-t,a.current.timeLeft))),e-a.current.started<a.current.timeToCount?a.current.requestId=window.requestAnimationFrame(c):(a.current={},u(0))},i=e.useCallback(e=>{window.cancelAnimationFrame(a.current.requestId);const r=void 0!==e?e:t;a.current.started=null,a.current.lastInterval=null,a.current.timeToCount=r,a.current.requestId=window.requestAnimationFrame(c),u(r)},[]),s=e.useCallback(()=>{window.cancelAnimationFrame(a.current.requestId),a.current.started=null,a.current.lastInterval=null,a.current.timeToCount=a.current.timeLeft},[]),l=e.useCallback(()=>{!a.current.started&&a.current.timeLeft>0&&(window.cancelAnimationFrame(a.current.requestId),a.current.requestId=window.requestAnimationFrame(c))},[]),m=e.useCallback(()=>{a.current.timeLeft&&(window.cancelAnimationFrame(a.current.requestId),a.current={},u(0))},[]),o=e.useMemo(()=>({start:i,pause:s,resume:l,reset:m}),[]);return e.useEffect(()=>()=>window.cancelAnimationFrame(a.current.requestId),[]),[n,o]};
//# sourceMappingURL=index.modern.js.map