UNPKG

@thibault.sh/hooks

Version:

A comprehensive collection of React hooks for browser storage, UI interactions, and more

1 lines 2.05 kB
{"version":3,"sources":["../src/hooks/useInterval.ts"],"names":["useInterval","callback","delay","savedCallback","useRef","useEffect","id"],"mappings":"wCAmCO,SAASA,CAAYC,CAAAA,CAAAA,CAAsBC,CAAsB,CAAA,CACtE,IAAMC,CAAAA,CAAgBC,aAAOH,CAAQ,CAAA,CAErCI,eAAU,CAAA,IAAM,CACdF,CAAAA,CAAc,QAAUF,EAC1B,CAAA,CAAG,CAACA,CAAQ,CAAC,CAAA,CAEbI,gBAAU,IAAM,CACd,GAAIH,CAAAA,GAAU,IAAM,CAAA,OAMpB,IAAMI,CAAK,CAAA,WAAA,CAJE,IAAM,CACjBH,CAAc,CAAA,OAAA,GAChB,CAE6BD,CAAAA,CAAK,CAClC,CAAA,OAAO,IAAM,aAAA,CAAcI,CAAE,CAC/B,CAAG,CAAA,CAACJ,CAAK,CAAC,EACZ","file":"useInterval.cjs","sourcesContent":["import { useEffect, useRef } from \"react\";\n\n/**\n * Hook that creates a setInterval that automatically cleans up on unmount.\n *\n * Provides a declarative way to use intervals in React components with proper\n * cleanup and the ability to pause/resume by passing null as the delay.\n *\n * @param callback - The function to execute on each interval tick\n * @param delay - The delay in milliseconds between executions, or null to pause the interval\n *\n * @example\n * ```tsx\n * function Timer() {\n * const [count, setCount] = useState(0);\n * const [isRunning, setIsRunning] = useState(true);\n *\n * // Increment count every second when running\n * useInterval(() => {\n * setCount(count => count + 1);\n * }, isRunning ? 1000 : null);\n *\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={() => setIsRunning(!isRunning)}>\n * {isRunning ? 'Pause' : 'Resume'}\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * @see https://thibault.sh/hooks/use-interval\n */\nexport function useInterval(callback: () => void, delay: number | null) {\n const savedCallback = useRef(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => {\n savedCallback.current();\n };\n\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n"]}