UNPKG

@ozen-ui/kit

Version:

React component library

78 lines (77 loc) 3.34 kB
import { __assign, __read } from "tslib"; import { useCallback, useEffect, useRef, useState } from 'react'; import { logger } from '@ozen-ui/logger'; import { useInterval } from '../useInterval'; import { USE_TIMER_ERROR_EQ_TIME, USE_TIMER_ERROR_MULTIPLICITY_INTERVAL_TO_END_TIME, USE_TIMER_ERROR_MULTIPLICITY_INTERVAL_TO_START_TIME, } from './constants'; export function useTimer(_a) { var _b = _a.startTime, startTime = _b === void 0 ? 0 : _b, _c = _a.endTime, endTime = _c === void 0 ? 0 : _c, _d = _a.interval, interval = _d === void 0 ? 1000 : _d, onTimerEnd = _a.onTimerEnd; var _e = __read(useState({ count: startTime, isTimerRunning: false, }), 2), state = _e[0], setState = _e[1]; var savedOnTimerEnd = useRef(); var timerCallback = function () { setState(function (_a) { var prevCount = _a.count; var DEC = startTime > endTime; var newCount = DEC ? prevCount - interval : prevCount + interval; if ((DEC && newCount < endTime) || (!DEC && newCount > endTime)) { newCount = endTime; } return { isTimerRunning: newCount !== endTime, count: newCount, }; }); }; useInterval(timerCallback, state.isTimerRunning ? interval : null); var resetTimer = useCallback(function () { setState(function () { return ({ isTimerRunning: false, count: startTime, }); }); }, [startTime]); var pauseTimer = useCallback(function () { setState(function (state) { return (__assign(__assign({}, state), { isTimerRunning: false })); }); }, []); var startTimer = useCallback(function () { setState(function (_a) { var count = _a.count; return ({ // Если счетчик завершился — сбрасываем счетчик // Если не завершился продолжаем с текущего счетчика count: count === endTime ? startTime : count, isTimerRunning: startTime !== endTime, }); }); }, [startTime, endTime]); useEffect(function () { savedOnTimerEnd.current = onTimerEnd; }, [onTimerEnd]); useEffect(function () { if (process.env.NODE_ENV !== 'production') { if (startTime === endTime) { logger.error(USE_TIMER_ERROR_EQ_TIME); } if (startTime % interval) { logger.error(USE_TIMER_ERROR_MULTIPLICITY_INTERVAL_TO_START_TIME); } if (endTime % interval) { logger.error(USE_TIMER_ERROR_MULTIPLICITY_INTERVAL_TO_END_TIME); } } }, [startTime, endTime, interval]); useEffect(function () { var _a; if (state.count === endTime && startTime !== endTime) { (_a = savedOnTimerEnd === null || savedOnTimerEnd === void 0 ? void 0 : savedOnTimerEnd.current) === null || _a === void 0 ? void 0 : _a.call(savedOnTimerEnd); } }, [state.count, endTime, startTime]); return { count: state.count, isTimerRunning: state.isTimerRunning, startTimer: startTimer, pauseTimer: pauseTimer, resetTimer: resetTimer, }; }