@ozen-ui/kit
Version:
React component library
81 lines (80 loc) • 3.49 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.useTimer = useTimer;
var tslib_1 = require("tslib");
var react_1 = require("react");
var logger_1 = require("@ozen-ui/logger");
var useInterval_1 = require("../useInterval");
var constants_1 = require("./constants");
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 = tslib_1.__read((0, react_1.useState)({
count: startTime,
isTimerRunning: false,
}), 2), state = _e[0], setState = _e[1];
var savedOnTimerEnd = (0, react_1.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,
};
});
};
(0, useInterval_1.useInterval)(timerCallback, state.isTimerRunning ? interval : null);
var resetTimer = (0, react_1.useCallback)(function () {
setState(function () { return ({
isTimerRunning: false,
count: startTime,
}); });
}, [startTime]);
var pauseTimer = (0, react_1.useCallback)(function () {
setState(function (state) { return (tslib_1.__assign(tslib_1.__assign({}, state), { isTimerRunning: false })); });
}, []);
var startTimer = (0, react_1.useCallback)(function () {
setState(function (_a) {
var count = _a.count;
return ({
// Если счетчик завершился — сбрасываем счетчик
// Если не завершился продолжаем с текущего счетчика
count: count === endTime ? startTime : count,
isTimerRunning: startTime !== endTime,
});
});
}, [startTime, endTime]);
(0, react_1.useEffect)(function () {
savedOnTimerEnd.current = onTimerEnd;
}, [onTimerEnd]);
(0, react_1.useEffect)(function () {
if (process.env.NODE_ENV !== 'production') {
if (startTime === endTime) {
logger_1.logger.error(constants_1.USE_TIMER_ERROR_EQ_TIME);
}
if (startTime % interval) {
logger_1.logger.error(constants_1.USE_TIMER_ERROR_MULTIPLICITY_INTERVAL_TO_START_TIME);
}
if (endTime % interval) {
logger_1.logger.error(constants_1.USE_TIMER_ERROR_MULTIPLICITY_INTERVAL_TO_END_TIME);
}
}
}, [startTime, endTime, interval]);
(0, react_1.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,
};
}
;