@chatui/core
Version:
The React library for Chatbot UI
61 lines (59 loc) • 1.86 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _useLatest = require("./useLatest");
var calcLeft = function calcLeft(ts) {
if (!ts) {
return 0;
}
var left = new Date(ts).getTime() - Date.now();
return left < 0 ? 0 : left;
};
var parseMs = function parseMs(ms) {
return {
// days: Math.floor(ms / 86400000),
hours: Math.floor(ms / 3600000) % 24,
minutes: Math.floor(ms / 60000) % 60,
seconds: Math.floor(ms / 1000) % 60
};
};
var useCountdown = function useCountdown(options) {
var _ref = options || {},
targetDate = _ref.targetDate,
onEnd = _ref.onEnd;
var _useState = (0, _react.useState)(function () {
return calcLeft(targetDate);
}),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
timeLeft = _useState2[0],
setTimeLeft = _useState2[1];
var onEndRef = (0, _useLatest.useLatest)(onEnd);
(0, _react.useEffect)(function () {
if (!targetDate) {
// for stop
setTimeLeft(0);
return;
}
// 立即执行一次
setTimeLeft(calcLeft(targetDate));
var timer = setInterval(function () {
var targetLeft = calcLeft(targetDate);
setTimeLeft(targetLeft);
if (targetLeft === 0) {
var _onEndRef$current;
clearInterval(timer);
(_onEndRef$current = onEndRef.current) === null || _onEndRef$current === void 0 || _onEndRef$current.call(onEndRef);
}
}, 1000);
return function () {
return clearInterval(timer);
};
}, [onEndRef, targetDate]);
return parseMs(timeLeft);
};
var _default = exports.default = useCountdown;
;