UNPKG

test-nut-ui

Version:

<p align="center"> <img alt="logo" src="https://img11.360buyimg.com/imagetools/jfs/t1/211965/25/7152/22022/61b16785E433119bb/aa41d7a9f7e823f3.png" width="150" style="margin-bottom: 10px;"> </p>

258 lines (257 loc) 9.36 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; var _excluded = ["paused", "startTime", "endTime", "remainingTime", "millisecond", "format", "autoStart", "time", "destroy", "className", "style", "onEnd", "onPaused", "onRestart", "onUpdate", "children"]; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function(sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), true).forEach(function(key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } import React__default, { useState, useRef, useImperativeHandle, useEffect } from "react"; import { useConfig } from "./ConfigProvider.js"; import { C as ComponentDefaults } from "./typings.js"; var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, { paused: false, startTime: Date.now(), endTime: Date.now(), remainingTime: 0, millisecond: false, format: "HH:mm:ss", autoStart: true, time: 0, destroy: false }); var InternalCountDown = function InternalCountDown2(props, ref) { useConfig(); var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props), paused = _defaultProps$props.paused, startTime = _defaultProps$props.startTime, endTime = _defaultProps$props.endTime, remainingTime = _defaultProps$props.remainingTime, millisecond = _defaultProps$props.millisecond, format = _defaultProps$props.format, autoStart = _defaultProps$props.autoStart, time = _defaultProps$props.time, destroy = _defaultProps$props.destroy, className = _defaultProps$props.className, style = _defaultProps$props.style, onEnd = _defaultProps$props.onEnd, onPaused = _defaultProps$props.onPaused, onRestart = _defaultProps$props.onRestart, onUpdate = _defaultProps$props.onUpdate, children = _defaultProps$props.children, rest = _objectWithoutProperties(_defaultProps$props, _excluded); var classPrefix = "nut-countdown"; var _useState = useState(0), _useState2 = _slicedToArray(_useState, 2), restTimeStamp = _useState2[0], setRestTime = _useState2[1]; var stateRef = useRef({ pauseTime: 0, curr: 0, isPaused: paused, isIninted: false, timer: 0, restTime: 0, counting: !paused && autoStart, handleEndTime: Date.now(), diffTime: 0 // 设置了 startTime 时,与 date.now() 的差异 }); var getTimeStamp = function getTimeStamp2(timeStr) { if (!timeStr) return Date.now(); var t = timeStr; t = t > 0 ? +t : t.toString().replace(/-/g, "/"); return new Date(t).getTime(); }; var initTime = function initTime2() { if (remainingTime) { stateRef.current.handleEndTime = Date.now() + Number(remainingTime); } else { stateRef.current.handleEndTime = endTime; stateRef.current.diffTime = Date.now() - getTimeStamp(startTime); } if (!stateRef.current.counting) stateRef.current.counting = true; tick(); }; var tick = function tick2() { stateRef.current.timer = requestAnimationFrame(function() { if (stateRef.current.counting) { var currentTime = Date.now() - stateRef.current.diffTime; var remainTime = Math.max(stateRef.current.handleEndTime - currentTime, 0); stateRef.current.restTime = remainTime; setRestTime(remainTime); if (!remainTime) { stateRef.current.counting = false; pause(); onEnd && onEnd(); } if (remainTime > 0) { tick2(); } } }); }; var formatRemainTime = function formatRemainTime2(t, type) { var ts = t; var rest2 = { d: 0, h: 0, m: 0, s: 0, ms: 0 }; var SECOND = 1e3; var MINUTE = 60 * SECOND; var HOUR = 60 * MINUTE; var DAY = 24 * HOUR; if (ts > 0) { rest2.d = ts >= SECOND ? Math.floor(ts / DAY) : 0; rest2.h = Math.floor(ts % DAY / HOUR); rest2.m = Math.floor(ts % HOUR / MINUTE); rest2.s = Math.floor(ts % MINUTE / SECOND); rest2.ms = Math.floor(ts % SECOND); } return type === "custom" ? formatToString(rest2) : parseFormat(_objectSpread({}, rest2)); }; var formatToString = function formatToString2(rest2) { var newRest = {}; Object.keys(rest2).map(function(k) { newRest[k] = padZero(rest2[k]); if (k === "ms") { newRest[k] = newRest[k].slice(0, 2); } }); return newRest; }; var parseFormat = function parseFormat2(time2) { var d = time2.d; var h = time2.h, m = time2.m, s = time2.s, ms = time2.ms; var formatCache = format; if (formatCache.includes("DD")) { formatCache = formatCache.replace("DD", padZero(d)); } else { h += Number(d) * 24; } if (formatCache.includes("HH")) { formatCache = formatCache.replace("HH", padZero(h)); } else { m += Number(h) * 60; } if (formatCache.includes("mm")) { formatCache = formatCache.replace("mm", padZero(m)); } else { s += Number(m) * 60; } if (formatCache.includes("ss")) { formatCache = formatCache.replace("ss", padZero(s)); } else { ms += Number(s) * 1e3; } if (formatCache.includes("S")) { var msC = padZero(ms, 3).toString(); if (formatCache.includes("SSS")) { formatCache = formatCache.replace("SSS", msC); } else if (formatCache.includes("SS")) { formatCache = formatCache.replace("SS", msC.slice(0, 2)); } else if (formatCache.includes("S")) { formatCache = formatCache.replace("SS", msC.slice(0, 1)); } } return formatCache; }; var padZero = function padZero2(num) { var length = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 2; num += ""; while (num.length < length) { num = "0".concat(num); } return num.toString(); }; var pause = function pause2() { cancelAnimationFrame(stateRef.current.timer); stateRef.current.counting = false; onPaused && onPaused(stateRef.current.restTime); }; useImperativeHandle(ref, function() { return { start: function start() { if (!stateRef.current.counting && !autoStart) { stateRef.current.counting = true; stateRef.current.handleEndTime = Date.now() + Number(stateRef.current.restTime); tick(); onRestart && onRestart(stateRef.current.restTime); } }, pause: function pause2() { cancelAnimationFrame(stateRef.current.timer); stateRef.current.counting = false; onPaused && onPaused(stateRef.current.restTime); }, reset: function reset() { if (!autoStart) { pause(); stateRef.current.restTime = time; setRestTime(time); } } }; }); useEffect(function() { var tranTime = formatRemainTime(stateRef.current.restTime, "custom"); onUpdate && onUpdate(tranTime); }, [restTimeStamp]); useEffect(function() { if (stateRef.current.isIninted) { if (paused) { if (stateRef.current.counting) { pause(); } } else { if (!stateRef.current.counting) { stateRef.current.counting = true; stateRef.current.handleEndTime = Date.now() + Number(stateRef.current.restTime); tick(); } onRestart && onRestart(stateRef.current.restTime); } } }, [paused]); useEffect(function() { if (stateRef.current.isIninted) { initTime(); } }, [endTime, startTime, remainingTime]); useEffect(function() { if (autoStart) { initTime(); } else { stateRef.current.restTime = time; setRestTime(time); } if (!stateRef.current.isIninted) { stateRef.current.isIninted = true; } return componentWillUnmount; }, []); var componentWillUnmount = function componentWillUnmount2() { destroy && cancelAnimationFrame(stateRef.current.timer); }; var renderTime = function() { return formatRemainTime(stateRef.current.restTime); }(); return React__default.createElement("div", _objectSpread({ className: "".concat(classPrefix, " ").concat(className), style: _objectSpread({}, style) }, rest), children || React__default.createElement("div", { className: "".concat(classPrefix, "__block"), // eslint-disable-next-line react/no-danger dangerouslySetInnerHTML: { __html: "".concat(renderTime) } })); }; var CountDown = React__default.forwardRef(InternalCountDown); CountDown.defaultProps = defaultProps; CountDown.displayName = "NutCountDown"; export { CountDown as default };