UNPKG

@ozen-ui/kit

Version:

React component library

81 lines (80 loc) 3.49 kB
"use strict"; 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, }; }