@thibault.sh/hooks
Version:
A comprehensive collection of React hooks for browser storage, UI interactions, and more
1 lines • 3.64 kB
Source Map (JSON)
{"version":3,"sources":["../src/hooks/useTimer.ts"],"names":["useTimer","initialTime","step","countDown","time","setTime","useState","isRunning","setIsRunning","intervalRef","useRef","start","useCallback","prevTime","newTime","pause","reset","useEffect"],"mappings":"0DAgBO,SAASA,EAASC,CAAqBC,CAAAA,CAAAA,CAAe,CAAGC,CAAAA,CAAAA,CAAqB,GAAgC,CACnH,GAAM,CAACC,CAAAA,CAAMC,CAAO,CAAIC,CAAAA,QAAAA,CAASL,CAAW,CAAA,CACtC,CAACM,CAAWC,CAAAA,CAAY,CAAIF,CAAAA,QAAAA,CAAS,EAAK,CAC1CG,CAAAA,CAAAA,CAAcC,QAEdC,CAAAA,CAAAA,CAAQC,YAAY,IAAM,CACzBL,CACHC,GAAAA,CAAAA,CAAa,EAAI,CACjBC,CAAAA,CAAAA,CAAY,OAAU,CAAA,WAAA,CAAY,IAAM,CACtCJ,CAAAA,CAASQ,CAAa,EAAA,CACpB,IAAMC,CAAUX,CAAAA,CAAAA,CAAYU,CAAWX,CAAAA,CAAAA,CAAOW,EAAWX,CACzD,CAAA,OAAIC,CAAaW,EAAAA,CAAAA,EAAW,GAC1B,aAAcL,CAAAA,CAAAA,CAAY,OAAO,CAAA,CACjCD,EAAa,CAAK,CAAA,CAAA,CACX,CAEFM,EAAAA,CACT,CAAC,EACH,CAAA,CAAGZ,EAAO,GAAI,CAAA,EAElB,EAAG,CAACK,CAAAA,CAAWL,CAAMC,CAAAA,CAAS,CAAC,CAEzBY,CAAAA,CAAAA,CAAQH,WAAY,CAAA,IAAM,CAC1BL,CAAaE,EAAAA,CAAAA,CAAY,OAC3B,GAAA,aAAA,CAAcA,EAAY,OAAO,CAAA,CACjCA,CAAY,CAAA,OAAA,CAAU,OACtBD,CAAa,CAAA,CAAA,CAAK,CAEtB,EAAA,CAAA,CAAG,CAACD,CAAS,CAAC,CAERS,CAAAA,CAAAA,CAAQJ,YAAY,IAAM,CAC1BH,CAAY,CAAA,OAAA,GACd,cAAcA,CAAY,CAAA,OAAO,EACjCA,CAAY,CAAA,OAAA,CAAU,QAExBD,CAAa,CAAA,CAAA,CAAK,CAClBH,CAAAA,CAAAA,CAAQJ,CAAW,EACrB,CAAA,CAAG,CAACA,CAAW,CAAC,CAEhB,CAAA,OAAAgB,SAAU,CAAA,IACD,IAAM,CACPR,CAAAA,CAAY,OACd,GAAA,aAAA,CAAcA,EAAY,OAAO,CAAA,CACjCA,CAAY,CAAA,OAAA,CAAU,QAE1B,CACC,CAAA,EAAE,CAAA,CAEE,CACLL,CACA,CAAA,CACE,KAAAO,CAAAA,CAAAA,CACA,MAAAI,CACA,CAAA,KAAA,CAAAC,EACA,SAAAT,CAAAA,CACF,CACF,CACF","file":"useTimer.mjs","sourcesContent":["import { useState, useEffect, useCallback, useRef } from \"react\";\n\ninterface TimerControls {\n start: () => void;\n pause: () => void;\n reset: () => void;\n isRunning: boolean;\n}\n\n/**\n * Hook that provides a timer with controls\n * @param initialTime - Initial time in seconds\n * @param step - Time step in seconds (default: 1)\n * @param countDown - Whether to count down instead of up (default: false)\n * @returns [currentTime, controls]\n */\nexport function useTimer(initialTime: number, step: number = 1, countDown: boolean = false): [number, TimerControls] {\n const [time, setTime] = useState(initialTime);\n const [isRunning, setIsRunning] = useState(false);\n const intervalRef = useRef<ReturnType<typeof setInterval>>();\n\n const start = useCallback(() => {\n if (!isRunning) {\n setIsRunning(true);\n intervalRef.current = setInterval(() => {\n setTime((prevTime) => {\n const newTime = countDown ? prevTime - step : prevTime + step;\n if (countDown && newTime <= 0) {\n clearInterval(intervalRef.current);\n setIsRunning(false);\n return 0;\n }\n return newTime;\n });\n }, step * 1000);\n }\n }, [isRunning, step, countDown]);\n\n const pause = useCallback(() => {\n if (isRunning && intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n setIsRunning(false);\n }\n }, [isRunning]);\n\n const reset = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n setIsRunning(false);\n setTime(initialTime);\n }, [initialTime]);\n\n useEffect(() => {\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n };\n }, []);\n\n return [\n time,\n {\n start,\n pause,\n reset,\n isRunning,\n },\n ];\n}\n"]}