UNPKG

@vergiss/chooks

Version:
121 lines (102 loc) 2.69 kB
import "core-js/modules/es.date.to-string"; import "core-js/modules/es.object.assign"; import "core-js/modules/web.timers"; var __assign = this && this.__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } } return t; }; return __assign.apply(this, arguments); }; import { useRef, useEffect, useState, useMemo } from 'react'; import { isDate } from '../../utils/type'; var SECOND = 1000; var MIN = 60 * SECOND; var HOUR = 60 * MIN; var DAY = 24 * HOUR; var DEFAULT_OPTION = { updateFrequency: 1000 }; function getTargetDate(target) { if (!target) { return new Date(0); } return isDate(target) ? target : new Date(target); } function getGapTime(target) { var dateObj = getTargetDate(target); var left = dateObj.getTime() - new Date().getTime(); return Math.max(left, 0); } function parseLeft(left) { var gap = left; var day = Math.floor(gap / DAY); var hour = Math.floor((gap - day * DAY) / HOUR); var min = Math.floor((gap - day * DAY - hour * HOUR) / MIN); var sec = Math.floor((gap - day * DAY - hour * HOUR - min * MIN) / SECOND); return { day: day, hour: hour, min: min, sec: sec }; } function useCountdown(targetDate, options) { if (options === void 0) { options = DEFAULT_OPTION; } var timerRef = useRef(null); var _a = useState(targetDate), target = _a[0], setTargetDate = _a[1]; var _b = useState(function () { return getGapTime(target); }), timeLeft = _b[0], setTimeLeft = _b[1]; var _c = useState(false), paused = _c[0], setPaused = _c[1]; useEffect(function () { if (paused) { clearInterval(timerRef.current); return; } if (!target) { setTimeLeft(0); return; } setTimeLeft(getGapTime(target)); var timer = timerRef.current = setInterval(function () { var timeLeft = getGapTime(target); setTimeLeft(timeLeft); if (timeLeft <= 0) { clearInterval(timer); } }, options.updateFrequency); return function () { return clearInterval(timer); }; }, [target, paused, options.updateFrequency]); var data = useMemo(function () { return parseLeft(timeLeft); }, [timeLeft]); return { data: __assign(__assign({}, data), { left: timeLeft }), stop: function stop() { return setPaused(true); }, start: function start() { return setPaused(false); }, setTarget: setTargetDate }; } export { useCountdown };