@chatui/core
Version:
The React library for Chatbot UI
54 lines (53 loc) • 1.58 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import { useState, useEffect } from 'react';
import { useLatest } from './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 = useState(function () {
return calcLeft(targetDate);
}),
_useState2 = _slicedToArray(_useState, 2),
timeLeft = _useState2[0],
setTimeLeft = _useState2[1];
var onEndRef = useLatest(onEnd);
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);
};
export default useCountdown;