UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

208 lines (207 loc) 8.11 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; require("core-js/modules/es.string.replace.js"); require("core-js/modules/web.dom-collections.iterator.js"); var _react = _interopRequireWildcard(require("react")); var _Context = _interopRequireDefault(require("../../shared/Context")); var _DatePickerCalc = require("../date-picker/DatePickerCalc"); var _DateFormatUtils = require("./DateFormatUtils"); var _dateFns = require("date-fns"); var _classnames = _interopRequireDefault(require("classnames")); var _SpacingUtils = require("../space/SpacingUtils"); var _Tooltip = _interopRequireDefault(require("../Tooltip")); var _SkeletonHelper = require("../skeleton/SkeletonHelper"); var _shared = require("../../shared"); var _componentHelper = require("../../shared/component-helper"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function DateFormat(props) { const context = (0, _react.useContext)(_Context.default); const { invalidDate } = (0, _shared.useTranslation)().DateFormat; const { value, children, locale: localeProp, dateStyle = 'long', skeleton, relativeTime = false } = props; const locale = localeProp || context.locale; const ref = (0, _react.useRef)(); const date = (0, _react.useMemo)(() => { return getDate({ value, children }); }, [value, children]); const durationValue = (0, _react.useMemo)(() => { const durationString = String(value || children); if (!durationString || !(0, _DateFormatUtils.isValidDuration)(durationString)) { return; } return (0, _DateFormatUtils.parseDuration)(durationString); }, [value, children]); const getDuration = (0, _react.useCallback)(dateStyle => { if (durationValue === undefined) { return; } return (0, _DateFormatUtils.formatDuration)(durationValue, locale, dateStyle, String(value || children)); }, [children, durationValue, locale, value]); const durationFormatted = (0, _react.useMemo)(() => { return getDuration(dateStyle); }, [dateStyle, getDuration]); const durationFormattedFull = (0, _react.useMemo)(() => { return getDuration('full'); }, [getDuration]); const attributes = (0, _react.useMemo)(() => { const attrs = { className: (0, _classnames.default)('dnb-date-format', (0, _SpacingUtils.createSpacingClasses)(props), (0, _SkeletonHelper.createSkeletonClass)('font', skeleton, context)), lang: locale }; (0, _SkeletonHelper.skeletonDOMAttributes)(attrs, skeleton, context); return attrs; }, [props, skeleton, context, locale]); const getAbsoluteDateTime = (0, _react.useCallback)(function () { let style = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'yyyy-MM-dd'; if (!date || isNaN(date.getTime())) { return; } return (0, _dateFns.format)(date, style); }, [date]); const getAbsoluteDateFormatted = (0, _react.useCallback)(function () { let { options = { dateStyle } } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!date || isNaN(date.getTime())) { return; } return (0, _DateFormatUtils.formatDate)(date, { locale, options }); }, [date, locale, dateStyle]); const [label, setLabel] = (0, _react.useState)(() => { return relativeTime && date ? (0, _DateFormatUtils.getRelativeTime)(date, locale, undefined, dateStyle) : undefined; }); (0, _react.useEffect)(() => { if (!relativeTime || !date) { return; } let timeoutId; const scheduleNextUpdate = () => { const delay = (0, _DateFormatUtils.getRelativeTimeNextUpdateMs)(date); timeoutId = setTimeout(() => { const next = (0, _DateFormatUtils.getRelativeTime)(date, locale, undefined, dateStyle); setLabel(prev => prev !== next ? next : prev); scheduleNextUpdate(); }, delay); }; setLabel((0, _DateFormatUtils.getRelativeTime)(date, locale, undefined, dateStyle)); scheduleNextUpdate(); return () => { clearTimeout(timeoutId); }; }, [date, locale, relativeTime, dateStyle]); const hasValidDate = date && !isNaN(date.getTime()); if (durationValue !== undefined) { const originalDurationString = String(value || children); const hasAriaLabel = durationFormattedFull !== durationFormatted; return _react.default.createElement("time", _extends({}, attributes, { dateTime: originalDurationString, "aria-label": hasAriaLabel ? durationFormattedFull : undefined }), _react.default.createElement("span", { "aria-hidden": hasAriaLabel }, durationFormatted)); } if (relativeTime) { if (hasValidDate) { return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("time", _extends({ dateTime: getAbsoluteDateTime('yyyy-MM-dd HH:mm:ss') }, attributes, { ref: ref }), label), _react.default.createElement(_Tooltip.default, { targetElement: ref, tooltip: getAbsoluteDateFormatted({ options: { dateStyle, timeStyle: 'short' } }) })); } return _react.default.createElement("span", { className: "dnb-date-format" }, invalidDate.replace('{value}', getInvalidValue({ value, children }))); } if (!hasValidDate && !durationValue) { return _react.default.createElement("span", { className: "dnb-date-format" }, invalidDate.replace('{value}', getInvalidValue({ value, children }))); } if (hasValidDate) { return _react.default.createElement("time", _extends({ dateTime: getAbsoluteDateTime() }, attributes), getAbsoluteDateFormatted()); } return _react.default.createElement("span", { className: "dnb-date-format" }, invalidDate.replace('{value}', getInvalidValue({ value, children }))); } function getDate(_ref) { let { value, children } = _ref; if (value) { if (typeof value === 'string' && (0, _DateFormatUtils.isValidDuration)(value)) { return; } if (typeof value === 'string') { return (0, _DatePickerCalc.convertStringToDate)(value); } if (value instanceof Date) { return value; } return (0, _DatePickerCalc.convertStringToDate)(String(value)); } const childrenValue = (0, _componentHelper.convertJsxToString)(children); if (childrenValue && (0, _DateFormatUtils.isValidDuration)(childrenValue)) { return; } return (0, _DatePickerCalc.convertStringToDate)(childrenValue); } function getInvalidValue(_ref2) { let { value, children } = _ref2; if (value instanceof Date) { return value.toString(); } if (children !== undefined && value === undefined) { return String(children); } return String(value); } var _default = exports.default = DateFormat; DateFormat._supportsSpacingProps = true; //# sourceMappingURL=DateFormat.js.map