UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

241 lines 9.79 kB
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; import "core-js/modules/web.dom-collections.iterator.js"; 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 { LOCALE as defaultLocale } from '../../shared/defaults'; import { convertStringToDate } from '../date-picker/DatePickerCalc'; export function formatDate(dateValue) { let { locale = defaultLocale, options = { dateStyle: 'short' } } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; const date = convertStringToDate(dateValue); return typeof Intl !== 'undefined' ? new Intl.DateTimeFormat(locale, options).format(date) : date.toLocaleString(locale, options); } export function formatDateRange(dates) { let { locale = defaultLocale, options = { dateStyle: 'long' } } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; const startDate = convertStringToDate(dates.startDate); const endDate = convertStringToDate(dates.endDate); if (typeof Intl !== 'undefined') { return new Intl.DateTimeFormat(locale, options).formatRange(startDate, endDate); } const startDateString = startDate.toLocaleString(locale, options); const endDateString = endDate.toLocaleString(locale, options); return `${startDateString}-${endDateString}`; } const timeUnitsInMs = { seconds: 1000, minutes: 60_000, hours: 3_600_000, days: 86_400_000, weeks: 604_800_000, months: 30.4375 * 86_400_000, years: 365.25 * 86_400_000 }; export function getRelativeTime(date) { let locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultLocale; let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { numeric: 'always', style: 'long' }; let dateStyle = arguments.length > 3 ? arguments[3] : undefined; const relativeTimeOptions = _objectSpread(_objectSpread({}, options), {}, { style: dateStyle === 'short' ? 'narrow' : dateStyle === 'medium' ? 'short' : 'long' }); const relativeTimeFormatter = new Intl.RelativeTimeFormat(locale, relativeTimeOptions); const now = new Date(); const msDateDifference = date.getTime() - now.getTime(); const timeUnit = getTimeUnit(msDateDifference); const timeUnitDifference = Math.round(msDateDifference / timeUnitsInMs[timeUnit]); return relativeTimeFormatter.format(timeUnitDifference, timeUnit); } export function getRelativeTimeNextUpdateMs(date) { let now = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date(); const diff = date.getTime() - now.getTime(); if (!Number.isFinite(diff)) { return 1000; } const unit = getTimeUnit(diff); const unitMs = timeUnitsInMs[unit]; const v = diff / unitMs; const msUntilFlip = (v - (Math.round(v) - 0.5)) * unitMs; const min = unit === 'seconds' ? 500 : 1000; return Math.max(min, Math.floor(msUntilFlip) + 50); } const UNIT_THRESHOLDS = [[timeUnitsInMs.minutes, 'seconds'], [timeUnitsInMs.hours, 'minutes'], [timeUnitsInMs.days, 'hours'], [timeUnitsInMs.weeks, 'days'], [timeUnitsInMs.months, 'weeks'], [timeUnitsInMs.years, 'months']]; function getTimeUnit(msDifference) { var _UNIT_THRESHOLDS$find, _UNIT_THRESHOLDS$find2; const abs = Math.abs(msDifference); return (_UNIT_THRESHOLDS$find = (_UNIT_THRESHOLDS$find2 = UNIT_THRESHOLDS.find(_ref => { let [limit] = _ref; return abs < limit; })) === null || _UNIT_THRESHOLDS$find2 === void 0 ? void 0 : _UNIT_THRESHOLDS$find2[1]) !== null && _UNIT_THRESHOLDS$find !== void 0 ? _UNIT_THRESHOLDS$find : 'years'; } const DURATION_PATTERN = /^P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)W)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/; export function parseDuration(durationString) { if (!durationString || typeof durationString !== 'string') { return 0; } const match = durationString.match(DURATION_PATTERN); if (!match) { return 0; } const [, years = '0', months = '0', weeks = '0', days = '0', hours = '0', minutes = '0', seconds = '0'] = match; return parseInt(years) * timeUnitsInMs.years + parseInt(months) * timeUnitsInMs.months + parseInt(weeks) * timeUnitsInMs.weeks + parseInt(days) * timeUnitsInMs.days + parseInt(hours) * timeUnitsInMs.hours + parseInt(minutes) * timeUnitsInMs.minutes + parseInt(seconds) * timeUnitsInMs.seconds; } function buildDurationObject(durationMs, originalDurationString) { if (originalDurationString) { const match = originalDurationString.match(DURATION_PATTERN); if (match) { const [, years, months, weeks, days, hours, minutes, seconds] = match; const result = {}; if (years !== undefined && years !== '0') { result.years = parseInt(years); } if (months !== undefined && months !== '0') { result.months = parseInt(months); } if (weeks !== undefined && weeks !== '0') { result.weeks = parseInt(weeks); } if (days !== undefined && days !== '0') { result.days = parseInt(days); } if (hours !== undefined && hours !== '0') { result.hours = parseInt(hours); } if (minutes !== undefined && minutes !== '0') { result.minutes = parseInt(minutes); } if (seconds !== undefined && seconds !== '0') { result.seconds = parseInt(seconds); } return result; } } const absDuration = Math.abs(durationMs); const units = { years: Math.floor(absDuration / timeUnitsInMs.years), months: Math.floor(absDuration % timeUnitsInMs.years / timeUnitsInMs.months), weeks: Math.floor(absDuration % timeUnitsInMs.months / timeUnitsInMs.weeks), days: Math.floor(absDuration % timeUnitsInMs.weeks / timeUnitsInMs.days), hours: Math.floor(absDuration % timeUnitsInMs.days / timeUnitsInMs.hours), minutes: Math.floor(absDuration % timeUnitsInMs.hours / timeUnitsInMs.minutes), seconds: Math.floor(absDuration % timeUnitsInMs.minutes / timeUnitsInMs.seconds) }; if (durationMs === 0 && originalDurationString) { const match = originalDurationString.match(DURATION_PATTERN); if (match) { const [, years, months, weeks, days, hours, minutes, seconds] = match; const result = {}; if (years !== undefined) { result.years = 0; } if (months !== undefined) { result.months = 0; } if (weeks !== undefined) { result.weeks = 0; } if (days !== undefined) { result.days = 0; } if (hours !== undefined) { result.hours = 0; } if (minutes !== undefined) { result.minutes = 0; } if (seconds !== undefined) { result.seconds = 0; } return Object.keys(result).length > 0 ? result : { seconds: 0 }; } return { seconds: 0 }; } return Object.fromEntries(Object.entries(units).filter(_ref2 => { let [, value] = _ref2; return value > 0; })); } function createDurationFormatter(locale, dateStyle) { try { const DurationFormat = Intl.DurationFormat; return new DurationFormat(locale, { style: dateStyle === 'short' ? 'narrow' : dateStyle === 'medium' ? 'short' : 'long' }); } catch { return null; } } export function formatDuration(durationMs) { let locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultLocale; let dateStyle = arguments.length > 2 ? arguments[2] : undefined; let originalDurationString = arguments.length > 3 ? arguments[3] : undefined; if (!Number.isFinite(durationMs)) { return '0 seconds'; } const durationObject = buildDurationObject(durationMs, originalDurationString); let formatter = createDurationFormatter(locale, dateStyle); if (formatter) { try { const result = formatter.format(durationObject); if (result && result.trim() !== '') { return result; } } catch {} } formatter = createDurationFormatter('en', dateStyle); if (formatter) { try { const result = formatter.format(durationObject); if (result && result.trim() !== '') { return result; } } catch {} } if (durationMs === 0) { return '0'; } const parts = []; const unitLabels = { years: 'year', months: 'month', weeks: 'week', days: 'day', hours: 'hour', minutes: 'minute', seconds: 'second' }; Object.entries(durationObject).forEach(_ref3 => { let [unit, value] = _ref3; if (value > 0) { const label = unitLabels[unit]; parts.push(`${value} ${label}${value === 1 ? '' : 's'}`); } }); return parts.length > 0 ? parts.join(' ') : '0 seconds'; } export function isValidDuration(durationString) { if (!durationString || typeof durationString !== 'string') { return false; } const match = durationString.match(DURATION_PATTERN); if (!match) { return false; } const [, years, months, weeks, days, hours, minutes, seconds] = match; return !!(years !== undefined || months !== undefined || weeks !== undefined || days !== undefined || hours !== undefined || minutes !== undefined || seconds !== undefined); } //# sourceMappingURL=DateFormatUtils.js.map