ng-time-past-pipe
Version:
Reactive textual representation of the time that has been passed between a given date and now in your Angular App.
123 lines • 12.7 kB
JavaScript
import { inject, InjectFlags, InjectionToken } from '@angular/core';
/**
* Custom `TimeDiffGenerator` Injection Token
*
* @public
* @api
*/
export const CUSTOM_TIME_DIFF_GENERATOR = new InjectionToken('Custom Time Diff Generator');
/**
* Return a respective textual representation of the input, as the input is a timespan that has been passed.
*
* @param diff The time diff object
* @public
* @api
*/
export const defaultTimeDiffGenerator = (diff) => {
if (diff.seconds === 0) {
return 'about now';
}
return diff.isFuture ? getFutureDiffString(diff) : getPastDiffString(diff);
};
export const getPastDiffString = (diff) => {
const { seconds, minutes, hours, months, days, years } = diff;
if (seconds <= 5) {
return 'a few seconds ago';
}
else if (seconds <= 59) {
return seconds + ' seconds ago';
}
else if (seconds <= 90) {
return 'about a minute ago';
}
if (minutes <= 45) {
return minutes + ' minutes ago';
}
else if (minutes <= 90) {
return 'one hour ago';
}
if (hours <= 22) {
return hours + ' hours ago';
}
else if (hours <= 36) {
return 'a day ago';
}
if (days <= 25) {
return days + ' days ago';
}
else if (days <= 45) {
return 'a month ago';
}
if (days <= 345) {
return months + ' months ago';
}
else if (days <= 545) {
return 'a year ago';
}
return years + ' years ago';
};
export const getFutureDiffString = (diff) => {
const { seconds, minutes, hours, months, days, years } = diff;
if (seconds <= 59) {
return 'in ' + seconds + ' seconds';
}
if (seconds <= 90) {
return 'in one minute';
}
else if (minutes <= 59) {
return 'in ' + minutes + ' minutes';
}
if (minutes <= 90) {
return 'in one hour';
}
else if (hours <= 22) {
return 'in ' + hours + ' hours';
}
if (hours <= 36) {
return 'in one day';
}
else if (days <= 25) {
return 'in ' + days + ' days';
}
if (days <= 45) {
return 'in one month';
}
else if (days <= 345) {
return 'in ' + months + ' months';
}
if (days <= 545) {
return 'in one year';
}
return 'in ' + years + ' years';
};
/**
* Provides the TimeDiffGenerator preferring a custom provider for internal usage
*
* @internal
*/
export const TIME_DIFF_GENERATOR = new InjectionToken('Time Diff Generator', {
factory: () => {
const customGenerator = inject(CUSTOM_TIME_DIFF_GENERATOR, InjectFlags.Optional);
return customGenerator ?? defaultTimeDiffGenerator;
},
});
/**
* TimeDiff Factory
*
* @param seconds The time difference in seconds. Negative values are considered as a future event
* @internal
*/
export const createTimeDiff = (seconds) => {
const isFuture = seconds < 0;
if (isFuture) {
seconds = Math.abs(seconds);
}
const diff = { seconds, isFuture };
diff.minutes = Math.round(seconds / 60);
diff.hours = Math.round(diff.minutes / 60);
diff.days = Math.round(diff.hours / 24);
diff.months = Math.round(diff.days / 30.416);
diff.years = Math.round(diff.days / 365);
return diff;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1kaWZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGltZS1wYXN0LXBpcGUvc3JjL2xpYi90aW1lLWRpZmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBMEJwRTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUMxRCw0QkFBNEIsQ0FDN0IsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFzQixDQUN6RCxJQUFjLEVBQ04sRUFBRTtJQUNWLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxXQUFXLENBQUM7S0FDcEI7SUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQWMsRUFBRSxFQUFFO0lBQ2xELE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUU5RCxJQUFJLE9BQU8sSUFBSSxDQUFDLEVBQUU7UUFDaEIsT0FBTyxtQkFBbUIsQ0FBQztLQUM1QjtTQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRTtRQUN4QixPQUFPLE9BQU8sR0FBRyxjQUFjLENBQUM7S0FDakM7U0FBTSxJQUFJLE9BQU8sSUFBSSxFQUFFLEVBQUU7UUFDeEIsT0FBTyxvQkFBb0IsQ0FBQztLQUM3QjtJQUVELElBQUksT0FBTyxJQUFJLEVBQUUs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SUFBSSxHQUFzQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUV0RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBRXpDLE9BQU8sSUFBZ0IsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdEZsYWdzLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFRpbWUgRGlmZmVyZW5jZSBpbiB0aGUgZGlmZmVyZW50IHRpbWUgdW5pdHNcbiAqXG4gKiBAcHVibGljXG4gKiBAYXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURpZmYge1xuICBzZWNvbmRzOiBudW1iZXI7XG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgaG91cnM6IG51bWJlcjtcbiAgbW9udGhzOiBudW1iZXI7XG4gIGRheXM6IG51bWJlcjtcbiAgeWVhcnM6IG51bWJlcjtcbiAgaXNGdXR1cmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIFR5cGUgZm9yIHRoZSBgVGltZURpZmZHZW5lcmF0b3JgXG4gKlxuICogQHB1YmxpY1xuICogQGFwaVxuICovXG5leHBvcnQgdHlwZSBUaW1lRGlmZkdlbmVyYXRvciA9IChkaWZmOiBUaW1lRGlmZikgPT4gc3RyaW5nO1xuXG4vKipcbiAqIEN1c3RvbSBgVGltZURpZmZHZW5lcmF0b3JgIEluamVjdGlvbiBUb2tlblxuICpcbiAqIEBwdWJsaWNcbiAqIEBhcGlcbiAqL1xuZXhwb3J0IGNvbnN0IENVU1RPTV9USU1FX0RJRkZfR0VORVJBVE9SID0gbmV3IEluamVjdGlvblRva2VuPFRpbWVEaWZmR2VuZXJhdG9yPihcbiAgJ0N1c3RvbSBUaW1lIERpZmYgR2VuZXJhdG9yJ1xuKTtcblxuLyoqXG4gKiBSZXR1cm4gYSByZXNwZWN0aXZlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0LCBhcyB0aGUgaW5wdXQgaXMgYSB0aW1lc3BhbiB0aGF0IGhhcyBiZWVuIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0gZGlmZiBUaGUgdGltZSBkaWZmIG9iamVjdFxuICogQHB1YmxpY1xuICogQGFwaVxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFRpbWVEaWZmR2VuZXJhdG9yOiBUaW1lRGlmZkdlbmVyYXRvciA9IChcbiAgZGlmZjogVGltZURpZmZcbik6IHN0cmluZyA9PiB7XG4gIGlmIChkaWZmLnNlY29uZHMgPT09IDApIHtcbiAgICByZXR1cm4gJ2Fib3V0IG5vdyc7XG4gIH1cblxuICByZXR1cm4gZGlmZi5pc0Z1dHVyZSA/IGdldEZ1dHVyZURpZmZTdHJpbmcoZGlmZikgOiBnZXRQYXN0RGlmZlN0cmluZyhkaWZmKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYXN0RGlmZlN0cmluZyA9IChkaWZmOiBUaW1lRGlmZikgPT4ge1xuICBjb25zdCB7IHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCBtb250aHMsIGRheXMsIHllYXJzIH0gPSBkaWZmO1xuXG4gIGlmIChzZWNvbmRzIDw9IDUpIHtcbiAgICByZXR1cm4gJ2EgZmV3IHNlY29uZHMgYWdvJztcbiAgfSBlbHNlIGlmIChzZWNvbmRzIDw9IDU5KSB7XG4gICAgcmV0dXJuIHNlY29uZHMgKyAnIHNlY29uZHMgYWdvJztcbiAgfSBlbHNlIGlmIChzZWNvbmRzIDw9IDkwKSB7XG4gICAgcmV0dXJuICdhYm91dCBhIG1pbnV0ZSBhZ28nO1xuICB9XG5cbiAgaWYgKG1pbnV0ZXMgPD0gNDUpIHtcbiAgICByZXR1cm4gbWludXRlcyArICcgbWludXRlcyBhZ28nO1xuICB9IGVsc2UgaWYgKG1pbnV0ZXMgPD0gOTApIHtcbiAgICByZXR1cm4gJ29uZSBob3VyIGFnbyc7XG4gIH1cblxuICBpZiAoaG91cnMgPD0gMjIpIHtcbiAgICByZXR1cm4gaG91cnMgKyAnIGhvdXJzIGFnbyc7XG4gIH0gZWxzZSBpZiAoaG91cnMgPD0gMzYpIHtcbiAgICByZXR1cm4gJ2EgZGF5IGFnbyc7XG4gIH1cblxuICBpZiAoZGF5cyA8PSAyNSkge1xuICAgIHJldHVybiBkYXlzICsgJyBkYXlzIGFnbyc7XG4gIH0gZWxzZSBpZiAoZGF5cyA8PSA0NSkge1xuICAgIHJldHVybiAnYSBtb250aCBhZ28nO1xuICB9XG5cbiAgaWYgKGRheXMgPD0gMzQ1KSB7XG4gICAgcmV0dXJuIG1vbnRocyArICcgbW9udGhzIGFnbyc7XG4gIH0gZWxzZSBpZiAoZGF5cyA8PSA1NDUpIHtcbiAgICByZXR1cm4gJ2EgeWVhciBhZ28nO1xuICB9XG5cbiAgcmV0dXJuIHllYXJzICsgJyB5ZWFycyBhZ28nO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZ1dHVyZURpZmZTdHJpbmcgPSAoZGlmZjogVGltZURpZmYpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHNlY29uZHMsIG1pbnV0ZXMsIGhvdXJzLCBtb250aHMsIGRheXMsIHllYXJzIH0gPSBkaWZmO1xuXG4gIGlmIChzZWNvbmRzIDw9IDU5KSB7XG4gICAgcmV0dXJuICdpbiAnICsgc2Vjb25kcyArICcgc2Vjb25kcyc7XG4gIH1cblxuICBpZiAoc2Vjb25kcyA8PSA5MCkge1xuICAgIHJldHVybiAnaW4gb25lIG1pbnV0ZSc7XG4gIH0gZWxzZSBpZiAobWludXRlcyA8PSA1OSkge1xuICAgIHJldHVybiAnaW4gJyArIG1pbnV0ZXMgKyAnIG1pbnV0ZXMnO1xuICB9XG5cbiAgaWYgKG1pbnV0ZXMgPD0gOTApIHtcbiAgICByZXR1cm4gJ2luIG9uZSBob3VyJztcbiAgfSBlbHNlIGlmIChob3VycyA8PSAyMikge1xuICAgIHJldHVybiAnaW4gJyArIGhvdXJzICsgJyBob3Vycyc7XG4gIH1cblxuICBpZiAoaG91cnMgPD0gMzYpIHtcbiAgICByZXR1cm4gJ2luIG9uZSBkYXknO1xuICB9IGVsc2UgaWYgKGRheXMgPD0gMjUpIHtcbiAgICByZXR1cm4gJ2luICcgKyBkYXlzICsgJyBkYXlzJztcbiAgfVxuXG4gIGlmIChkYXlzIDw9IDQ1KSB7XG4gICAgcmV0dXJuICdpbiBvbmUgbW9udGgnO1xuICB9IGVsc2UgaWYgKGRheXMgPD0gMzQ1KSB7XG4gICAgcmV0dXJuICdpbiAnICsgbW9udGhzICsgJyBtb250aHMnO1xuICB9XG5cbiAgaWYgKGRheXMgPD0gNTQ1KSB7XG4gICAgcmV0dXJuICdpbiBvbmUgeWVhcic7XG4gIH1cblxuICByZXR1cm4gJ2luICcgKyB5ZWFycyArICcgeWVhcnMnO1xufTtcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgVGltZURpZmZHZW5lcmF0b3IgcHJlZmVycmluZyBhIGN1c3RvbSBwcm92aWRlciBmb3IgaW50ZXJuYWwgdXNhZ2VcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRJTUVfRElGRl9HRU5FUkFUT1IgPSBuZXcgSW5qZWN0aW9uVG9rZW48VGltZURpZmZHZW5lcmF0b3I+KFxuICAnVGltZSBEaWZmIEdlbmVyYXRvcicsXG4gIHtcbiAgICBmYWN0b3J5OiAoKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21HZW5lcmF0b3IgPSBpbmplY3QoXG4gICAgICAgIENVU1RPTV9USU1FX0RJRkZfR0VORVJBVE9SLFxuICAgICAgICBJbmplY3RGbGFncy5PcHRpb25hbFxuICAgICAgKTtcbiAgICAgIHJldHVybiBjdXN0b21HZW5lcmF0b3IgPz8gZGVmYXVsdFRpbWVEaWZmR2VuZXJhdG9yO1xuICAgIH0sXG4gIH1cbik7XG5cbi8qKlxuICogVGltZURpZmYgRmFjdG9yeVxuICpcbiAqIEBwYXJhbSBzZWNvbmRzIFRoZSB0aW1lIGRpZmZlcmVuY2UgaW4gc2Vjb25kcy4gTmVnYXRpdmUgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGFzIGEgZnV0dXJlIGV2ZW50XG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVRpbWVEaWZmID0gKHNlY29uZHM6IG51bWJlcik6IFRpbWVEaWZmID0+IHtcbiAgY29uc3QgaXNGdXR1cmUgPSBzZWNvbmRzIDwgMDtcblxuICBpZiAoaXNGdXR1cmUpIHtcbiAgICBzZWNvbmRzID0gTWF0aC5hYnMoc2Vjb25kcyk7XG4gIH1cblxuICBjb25zdCBkaWZmOiBQYXJ0aWFsPFRpbWVEaWZmPiA9IHsgc2Vjb25kcywgaXNGdXR1cmUgfTtcblxuICBkaWZmLm1pbnV0ZXMgPSBNYXRoLnJvdW5kKHNlY29uZHMgLyA2MCk7XG4gIGRpZmYuaG91cnMgPSBNYXRoLnJvdW5kKGRpZmYubWludXRlcyAvIDYwKTtcbiAgZGlmZi5kYXlzID0gTWF0aC5yb3VuZChkaWZmLmhvdXJzIC8gMjQpO1xuICBkaWZmLm1vbnRocyA9IE1hdGgucm91bmQoZGlmZi5kYXlzIC8gMzAuNDE2KTtcbiAgZGlmZi55ZWFycyA9IE1hdGgucm91bmQoZGlmZi5kYXlzIC8gMzY1KTtcblxuICByZXR1cm4gZGlmZiBhcyBUaW1lRGlmZjtcbn07XG4iXX0=