@vergiss/chooks
Version:
React hooks library
121 lines (102 loc) • 2.69 kB
JavaScript
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 };