All files useTimer.ts

97.83% Statements 45/46
92.31% Branches 24/26
100% Functions 9/9
97.44% Lines 38/39

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 691x     772x 1544x 1544x 1544x 1544x 772x 772x   772x 772x 772x   772x 4x 4x 4x     772x 16x 1x     16x     772x 3x     772x 772x 6x 6x   6x 1x         772x 41x   41x 16x 731x 731x         25x       41x 28x 12x         772x    
import { useCallback, useEffect, useState } from 'react';
import { Config, ReturnValue } from './types';
 
export const useTimer = ({
  initialTime = 0,
  interval = 1000,
  step = 1,
  timerType = 'INCREMENTAL',
  endTime,
  onTimeOver,
}: Partial<Config> = {}): ReturnValue => {
  const [time, setTime] = useState(initialTime);
  const [isRunning, setIsRunning] = useState(false);
  const [isTimeOver, setIsTimeOver] = useState(false);
 
  const reset = useCallback(() => {
    setIsRunning(false);
    setIsTimeOver(false);
    setTime(initialTime);
  }, [initialTime]);
 
  const start = useCallback(() => {
    if (isTimeOver) {
      reset();
    }
 
    setIsRunning(true);
  }, [reset, isTimeOver]);
 
  const pause = useCallback(() => {
    setIsRunning(false);
  }, []);
 
  useEffect(() => {
    if (isRunning && time === endTime) {
      setIsRunning(false);
      setIsTimeOver(true);
 
      if (typeof onTimeOver === 'function') {
        onTimeOver();
      }
    }
  }, [endTime, onTimeOver, time, isRunning]);
 
  useEffect(() => {
    let intervalId: NodeJS.Timeout | null = null;
 
    if (isRunning) {
      intervalId = setInterval(() => {
        setTime(previousTime =>
          timerType === 'DECREMENTAL'
            ? previousTime - step
            : previousTime + step
        );
      }, interval);
    } else Iif (intervalId) {
      clearInterval(intervalId);
    }
 
    return () => {
      if (intervalId) {
        clearInterval(intervalId);
      }
    };
  }, [isRunning, step, timerType, interval]);
 
  return { isRunning, pause, reset, start, time };
};