@yuntijs/ui
Version:
☁️ Yunti UI - an open-source UI component library for building Cloud Native web apps
77 lines (75 loc) • 3.61 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
var _excluded = ["time", "format", "relativeTime", "tooltip"];
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
import { Typography as AntdTypography, Tooltip } from 'antd';
import dayjs from 'dayjs';
import dayjsRelativeTime from 'dayjs/plugin/relativeTime';
import { set } from 'lodash-es';
import React, { useCallback, useEffect, useState } from 'react';
import { jsx as _jsx } from "react/jsx-runtime";
dayjs.extend(dayjsRelativeTime);
export var Typography = AntdTypography;
var getFromNow = function getFromNow(t) {
return dayjs(t ? new Date(t) : new Date()).fromNow();
};
var Time = function Time(props) {
var _tooltip$title;
var time = props.time,
format = props.format,
_props$relativeTime = props.relativeTime,
relativeTime = _props$relativeTime === void 0 ? true : _props$relativeTime,
tooltip = props.tooltip,
textProps = _objectWithoutProperties(props, _excluded);
var _useState = useState(getFromNow(time)),
_useState2 = _slicedToArray(_useState, 2),
showTime = _useState2[0],
setShowTime = _useState2[1];
// The relative time within the last hour is updated automatically
var setTimeInterval = useCallback(function (currentTime) {
var now = dayjs();
var timeMoment = dayjs(currentTime);
var diff = now.diff(timeMoment);
if (diff > 0 && diff < 60 * 60 * 1000) {
return setInterval(function () {
setShowTime(getFromNow(currentTime));
}, 60 * 1000);
}
}, []);
useEffect(function () {
var timeout;
if (relativeTime) {
timeout = setTimeInterval(new Date(time));
}
return function () {
if (timeout) {
clearInterval(timeout);
}
};
}, [relativeTime, setTimeInterval, time]);
useEffect(function () {
if (!relativeTime) return;
var nextFromNow = getFromNow(time);
if (nextFromNow !== showTime) {
setShowTime(nextFromNow);
setTimeInterval(new Date(time));
}
}, [time, relativeTime, showTime, setTimeInterval]);
var fmtTime = dayjs(time).format(format || 'YYYY-MM-DD HH:mm:ss');
var currentTime = relativeTime ? showTime : fmtTime;
var tooltipTitle = (_tooltip$title = tooltip === null || tooltip === void 0 ? void 0 : tooltip.title) !== null && _tooltip$title !== void 0 ? _tooltip$title : relativeTime ? fmtTime : undefined;
// Avoid duplicate tooltips
if (tooltipTitle) {
set(textProps, 'ellipsis.tooltip.title', undefined);
}
return /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({}, tooltip || {}), {}, {
title: tooltipTitle,
children: /*#__PURE__*/_jsx(Typography.Text, _objectSpread(_objectSpread({}, textProps), {}, {
children: currentTime
}))
}));
};
Typography.Time = Time;
export default Typography;