@ozen-ui/kit
Version:
React component library
78 lines (77 loc) • 3.34 kB
JavaScript
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,
};
}