svelte-ux
Version:
- Increment version in `package.json` and commit as `Version bump to x.y.z` - `npm run publish`
114 lines (113 loc) • 4.66 kB
JavaScript
import { parseISO } from 'date-fns';
export var DurationUnits;
(function (DurationUnits) {
DurationUnits[DurationUnits["Year"] = 0] = "Year";
DurationUnits[DurationUnits["Day"] = 1] = "Day";
DurationUnits[DurationUnits["Hour"] = 2] = "Hour";
DurationUnits[DurationUnits["Minute"] = 3] = "Minute";
DurationUnits[DurationUnits["Second"] = 4] = "Second";
DurationUnits[DurationUnits["Millisecond"] = 5] = "Millisecond";
})(DurationUnits || (DurationUnits = {}));
// export enum DurationUnits {
// Millisecond = 1,
// Second = 1000 * Millisecond,
// Minute = 60 * Second,
// Hour = 60 * Minute,
// Day = 24 * Hour,
// Year = 365 * Day,
// }
export function getDuration(start, end, duration) {
var _a, _b, _c, _d, _e, _f, _g;
const startDate = typeof start === 'string' ? parseISO(start) : start;
const endDate = typeof end === 'string' ? parseISO(end) : end;
const differenceInMs = startDate
? Math.abs(Number(endDate || new Date()) - Number(startDate))
: undefined;
if (!Number.isFinite(differenceInMs) && duration == null) {
return null;
}
var milliseconds = (_b = (_a = duration === null || duration === void 0 ? void 0 : duration.milliseconds) !== null && _a !== void 0 ? _a : differenceInMs) !== null && _b !== void 0 ? _b : 0;
var seconds = (_c = duration === null || duration === void 0 ? void 0 : duration.seconds) !== null && _c !== void 0 ? _c : 0;
var minutes = (_d = duration === null || duration === void 0 ? void 0 : duration.minutes) !== null && _d !== void 0 ? _d : 0;
var hours = (_e = duration === null || duration === void 0 ? void 0 : duration.hours) !== null && _e !== void 0 ? _e : 0;
var days = (_f = duration === null || duration === void 0 ? void 0 : duration.days) !== null && _f !== void 0 ? _f : 0;
var years = (_g = duration === null || duration === void 0 ? void 0 : duration.years) !== null && _g !== void 0 ? _g : 0;
if (milliseconds >= 1000) {
const carrySeconds = (milliseconds - (milliseconds % 1000)) / 1000;
seconds += carrySeconds;
milliseconds = milliseconds - carrySeconds * 1000;
}
if (seconds >= 60) {
const carryMinutes = (seconds - (seconds % 60)) / 60;
minutes += carryMinutes;
seconds = seconds - carryMinutes * 60;
}
if (minutes >= 60) {
const carryHours = (minutes - (minutes % 60)) / 60;
hours += carryHours;
minutes = minutes - carryHours * 60;
}
if (hours >= 24) {
const carryDays = (hours - (hours % 24)) / 24;
days += carryDays;
hours = hours - carryDays * 24;
}
if (days >= 365) {
const carryYears = (days - (days % 365)) / 365;
years += carryYears;
days = days - carryYears * 365;
}
return {
milliseconds,
seconds,
minutes,
hours,
days,
years,
};
}
// See also: https://stackoverflow.com/questions/19700283/how-to-convert-time-milliseconds-to-hours-min-sec-format-in-javascript/33909506
export function humanizeDuration(config) {
const { start, end, minUnits, totalUnits = 99, variant = 'short' } = config;
const duration = getDuration(start, end, config.duration);
if (duration === null) {
return 'unknown';
}
var sentenceArr = [];
var unitNames = variant === 'short'
? ['y', 'd', 'h', 'm', 's', 'ms']
: ['years', 'days', 'hours', 'minutes', 'seconds', 'milliseconds'];
var unitNums = [
duration.years,
duration.days,
duration.hours,
duration.minutes,
duration.seconds,
duration.milliseconds,
].filter((x, i) => i <= (minUnits || 99));
// Combine unit numbers and names
for (var i in unitNums) {
if (sentenceArr.length >= totalUnits) {
break;
}
const unitNum = unitNums[i];
let unitName = unitNames[i];
// Hide `0` values unless last unit (and none shown before)
if (unitNum !== 0 || (sentenceArr.length === 0 && Number(i) === unitNums.length - 1)) {
switch (variant) {
case 'short':
sentenceArr.push(unitNum + unitName);
break;
case 'long':
if (unitNum === 1) {
// Trim off plural `s`
unitName = unitName.slice(0, -1);
}
sentenceArr.push(unitNum + ' ' + unitName);
break;
}
}
}
const sentence = sentenceArr.join(variant === 'long' ? ' and ' : ' ');
return sentence;
}