'use strict'; function secondsToHumanUnitAgo(seconds) { const times = [ ['second', 1], ['min', 60], ['hour', 60 * 60], ['day', 60 * 60 * 24], ['week', 60 * 60 * 24 * 7], ['month', 60 * 60 * 24 * 30], ['year', 60 * 60 * 24 * 365], ]; if (seconds < times[0][1]) return 'just now'; let scale = 0; // If the amount of seconds is more than a minute, we change the scale to minutes // If the amount of seconds then is more than an hour, we change the scale to hours // This continues until the unit above our current scale is longer than `seconds`, or doesn't exist while (scale + 1 < times.length && seconds >= times[scale + 1][1]) scale += 1; const wholeUnits = Math.floor(seconds / times[scale][1]); const unitName = times[scale][0] + (wholeUnits === 1 ? '' : 's'); return wholeUnits + ' ' + unitName + ' ago'; } /** * Returns a given time in seconds as a human readable form, e.g. (5 min ago) * * @param {object} options * @param {number} options.oldTimeInSeconds * @param {function} [(humanTime) => `(${humanTime})`] options.formatter * @param {number} [60 * 60 * 24 - 1] options.maxDisplayedAge The maximum display age in seconds * * @returns {string} A formatted string in human readable form. Note that the default formatter returns a string with markup in it. */ function timeAgo({ oldTimeInSeconds, formatter = (humanTime) => `(${humanTime})`, maxDisplayedAge = 60 * 60 * 24 - 1, }) { const timeNow = new Date() / 1000; const diff = Math.round(timeNow - oldTimeInSeconds); if (diff > maxDisplayedAge) return ''; return formatter(secondsToHumanUnitAgo(diff)); } // TODO: This is for Storybook/jest. // Longterm, this should be a utility function that can be imported. // For the time being, duplication of this function is being avoided. if (typeof globalThis !== 'undefined') { globalThis.timeAgo = timeAgo; // eslint-disable-line no-undef }