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.
99 lines • 13.1 kB
JavaScript
import { Inject, Pipe, } from '@angular/core';
import { createTimeDiff, TIME_DIFF_GENERATOR, } from './time-diff';
import { UPDATE_INTERVAL_GENERATOR, } from './time-interval';
import { parseInputValue, validateTAInputType } from './time-past';
import { TIME_PAST_TICKER } from './ticker';
import { filter, map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "rxjs";
export class TimePastPipe {
/**
* TimePastPipe Class Constructor
*/
constructor(changeDetectorRef, ticker, timeDiffGenerator, updateIntervalGenerator) {
this.changeDetectorRef = changeDetectorRef;
this.ticker = ticker;
this.timeDiffGenerator = timeDiffGenerator;
this.updateIntervalGenerator = updateIntervalGenerator;
this.currentPeriod = 1;
this.intervalTimer = this.ticker.pipe(filter((tick) => tick % this.currentPeriod === 0), map((tick) => tick / this.currentPeriod));
this.intervalSubscription = this.intervalTimer.subscribe(() => {
this.changeDetectorRef.markForCheck();
});
}
/**
* Transform anything that can be parsed to a Date in the past, to a string that represent the relative
* time that has been passed between now and this point of time.
*
* @param value A value that can be parsed to a Date in the past or future
* @param overflow Overflow to time in past when initial date was in future
* @return The textual representation of the time that has been passed between the given Date
* and the current.
*/
transform(value, overflow = true) {
if (this.isValidInput(value) === false) {
return value;
}
const seconds = parseInputValue(value);
this.initialSeconds || (this.initialSeconds = seconds);
if (this.lastSeconds === seconds || (overflow === false && this.initialSeconds < 0 && seconds > 0)) {
return this.lastResult;
}
// The ChangeDetector should not call transform again while the new value is being resolved
this.changeDetectorRef.detach();
this.lastSeconds = seconds;
const timeDiff = createTimeDiff(seconds);
const result = (this.lastResult = this.timeDiffGenerator(timeDiff));
// Make sure the update interval refreshed as well
this.currentPeriod = this.updateIntervalGenerator(timeDiff);
// Reattach the ChangeDetector so that further changes are being transformed
this.changeDetectorRef.reattach();
return result;
}
/**
* Validate the Input Value and log a warning per value when it fails
*
* @param value
* @private
*/
isValidInput(value) {
const validationResult = validateTAInputType(value);
if (validationResult === false && this.lastInput !== value) {
console.warn(`[TimePastPipe] Invalid Input of type ${typeof value} (${value}).`);
}
this.lastInput = value;
return validationResult;
}
/**
* Clear interval ticker subscription
*/
ngOnDestroy() {
if (this.intervalSubscription) {
this.intervalSubscription.unsubscribe();
}
}
}
TimePastPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TimePastPipe, deps: [{ token: i0.ChangeDetectorRef }, { token: TIME_PAST_TICKER }, { token: TIME_DIFF_GENERATOR }, { token: UPDATE_INTERVAL_GENERATOR }], target: i0.ɵɵFactoryTarget.Pipe });
TimePastPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.3", ngImport: i0, type: TimePastPipe, isStandalone: true, name: "timePast", pure: false });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TimePastPipe, decorators: [{
type: Pipe,
args: [{
standalone: true,
name: 'timePast',
pure: false,
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.Observable, decorators: [{
type: Inject,
args: [TIME_PAST_TICKER]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [TIME_DIFF_GENERATOR]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [UPDATE_INTERVAL_GENERATOR]
}] }]; } });
/**
* @deprecated Use TimePastPipe instead
*/
export const NgTimePastPipePipe = TimePastPipe;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1wYXN0LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10aW1lLXBhc3QtcGlwZS9zcmMvbGliL3RpbWUtcGFzdC5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxNQUFNLEVBRU4sSUFBSSxHQUVMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsbUJBQW1CLEdBRXBCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCx5QkFBeUIsR0FFMUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZUFBZSxFQUFXLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUU1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFPN0MsTUFBTSxPQUFPLFlBQVk7SUFhdkI7O09BRUc7SUFDSCxZQUNtQixpQkFBb0MsRUFDVixNQUEwQixFQUVwRCxpQkFBb0MsRUFFcEMsdUJBQWdEO1FBTGhELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDVixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUVwRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBRXBDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFoQjNELGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ1Qsa0JBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDL0MsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFDakQsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUN6QyxDQUFDO1FBY0EsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM1RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxTQUFTLENBQW9CLEtBQVEsRUFBRSxRQUFRLEdBQUcsSUFBSTtRQUNwRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQ3RDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGNBQWMsS0FBbkIsSUFBSSxDQUFDLGNBQWMsR0FBSyxPQUFPLEVBQUM7UUFFaEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2xHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUN4QjtRQUVELDJGQUEyRjtRQUMzRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFFM0IsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVwRSxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUQsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxZQUFZLENBQUMsS0FBYztRQUNqQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBELElBQUksZ0JBQWdCLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzFELE9BQU8sQ0FBQyxJQUFJLENBQ1Ysd0NBQXdDLE9BQU8sS0FBSyxLQUFLLEtBQUssSUFBSSxDQUNuRSxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV2QixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDekM7SUFDSCxDQUFDOzt5R0E5RlUsWUFBWSxtREFrQmIsZ0JBQWdCLGFBQ2hCLG1CQUFtQixhQUVuQix5QkFBeUI7dUdBckJ4QixZQUFZOzJGQUFaLFlBQVk7a0JBTHhCLElBQUk7bUJBQUM7b0JBQ0osVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRSxVQUFVO29CQUNoQixJQUFJLEVBQUUsS0FBSztpQkFDWjs7MEJBbUJJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDdkIsTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUUxQixNQUFNOzJCQUFDLHlCQUF5Qjs7QUE0RXJDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICBQaXBlLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNyZWF0ZVRpbWVEaWZmLFxuICBUSU1FX0RJRkZfR0VORVJBVE9SLFxuICBUaW1lRGlmZkdlbmVyYXRvcixcbn0gZnJvbSAnLi90aW1lLWRpZmYnO1xuaW1wb3J0IHtcbiAgVVBEQVRFX0lOVEVSVkFMX0dFTkVSQVRPUixcbiAgVXBkYXRlSW50ZXJ2YWxHZW5lcmF0b3IsXG59IGZyb20gJy4vdGltZS1pbnRlcnZhbCc7XG5pbXBvcnQgeyBwYXJzZUlucHV0VmFsdWUsIFRBSW5wdXQsIHZhbGlkYXRlVEFJbnB1dFR5cGUgfSBmcm9tICcuL3RpbWUtcGFzdCc7XG5pbXBvcnQgeyBUSU1FX1BBU1RfVElDS0VSIH0gZnJvbSAnLi90aWNrZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQFBpcGUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBuYW1lOiAndGltZVBhc3QnLFxuICBwdXJlOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgVGltZVBhc3RQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBpbml0aWFsU2Vjb25kczogYW55O1xuICBwcml2YXRlIGxhc3RJbnB1dDogYW55O1xuICBwcml2YXRlIGxhc3RTZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFJlc3VsdDogc3RyaW5nO1xuXG4gIHByaXZhdGUgY3VycmVudFBlcmlvZCA9IDE7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJ2YWxUaW1lciA9IHRoaXMudGlja2VyLnBpcGUoXG4gICAgZmlsdGVyKCh0aWNrKSA9PiB0aWNrICUgdGhpcy5jdXJyZW50UGVyaW9kID09PSAwKSxcbiAgICBtYXAoKHRpY2spID0+IHRpY2sgLyB0aGlzLmN1cnJlbnRQZXJpb2QpXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJ2YWxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogVGltZVBhc3RQaXBlIENsYXNzIENvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFRJTUVfUEFTVF9USUNLRVIpIHByaXZhdGUgcmVhZG9ubHkgdGlja2VyOiBPYnNlcnZhYmxlPG51bWJlcj4sXG4gICAgQEluamVjdChUSU1FX0RJRkZfR0VORVJBVE9SKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGltZURpZmZHZW5lcmF0b3I6IFRpbWVEaWZmR2VuZXJhdG9yLFxuICAgIEBJbmplY3QoVVBEQVRFX0lOVEVSVkFMX0dFTkVSQVRPUilcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZUludGVydmFsR2VuZXJhdG9yOiBVcGRhdGVJbnRlcnZhbEdlbmVyYXRvclxuICApIHtcbiAgICB0aGlzLmludGVydmFsU3Vic2NyaXB0aW9uID0gdGhpcy5pbnRlcnZhbFRpbWVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBhbnl0aGluZyB0aGF0IGNhbiBiZSBwYXJzZWQgdG8gYSBEYXRlIGluIHRoZSBwYXN0LCB0byBhIHN0cmluZyB0aGF0IHJlcHJlc2VudCB0aGUgcmVsYXRpdmVcbiAgICogIHRpbWUgdGhhdCBoYXMgYmVlbiBwYXNzZWQgYmV0d2VlbiBub3cgYW5kIHRoaXMgcG9pbnQgb2YgdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIEEgdmFsdWUgdGhhdCBjYW4gYmUgcGFyc2VkIHRvIGEgRGF0ZSBpbiB0aGUgcGFzdCBvciBmdXR1cmVcbiAgICogQHBhcmFtIG92ZXJmbG93IE92ZXJmbG93IHRvIHRpbWUgaW4gcGFzdCB3aGVuIGluaXRpYWwgZGF0ZSB3YXMgaW4gZnV0dXJlXG4gICAqIEByZXR1cm4gVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRpbWUgdGhhdCBoYXMgYmVlbiBwYXNzZWQgYmV0d2VlbiB0aGUgZ2l2ZW4gRGF0ZVxuICAgKiAgYW5kIHRoZSBjdXJyZW50LlxuICAgKi9cbiAgdHJhbnNmb3JtPFQgZXh0ZW5kcyBUQUlucHV0Pih2YWx1ZTogVCwgb3ZlcmZsb3cgPSB0cnVlKTogc3RyaW5nIHwgVCB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZElucHV0KHZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNvbmRzID0gcGFyc2VJbnB1dFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLmluaXRpYWxTZWNvbmRzIHx8PSBzZWNvbmRzO1xuXG4gICAgaWYgKHRoaXMubGFzdFNlY29uZHMgPT09IHNlY29uZHMgfHwgKG92ZXJmbG93ID09PSBmYWxzZSAmJiB0aGlzLmluaXRpYWxTZWNvbmRzIDwgMCAmJiBzZWNvbmRzID4gMCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhc3RSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIENoYW5nZURldGVjdG9yIHNob3VsZCBub3QgY2FsbCB0cmFuc2Zvcm0gYWdhaW4gd2hpbGUgdGhlIG5ldyB2YWx1ZSBpcyBiZWluZyByZXNvbHZlZFxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0YWNoKCk7XG5cbiAgICB0aGlzLmxhc3RTZWNvbmRzID0gc2Vjb25kcztcblxuICAgIGNvbnN0IHRpbWVEaWZmID0gY3JlYXRlVGltZURpZmYoc2Vjb25kcyk7XG4gICAgY29uc3QgcmVzdWx0ID0gKHRoaXMubGFzdFJlc3VsdCA9IHRoaXMudGltZURpZmZHZW5lcmF0b3IodGltZURpZmYpKTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXBkYXRlIGludGVydmFsIHJlZnJlc2hlZCBhcyB3ZWxsXG4gICAgdGhpcy5jdXJyZW50UGVyaW9kID0gdGhpcy51cGRhdGVJbnRlcnZhbEdlbmVyYXRvcih0aW1lRGlmZik7XG5cbiAgICAvLyBSZWF0dGFjaCB0aGUgQ2hhbmdlRGV0ZWN0b3Igc28gdGhhdCBmdXJ0aGVyIGNoYW5nZXMgYXJlIGJlaW5nIHRyYW5zZm9ybWVkXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5yZWF0dGFjaCgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgSW5wdXQgVmFsdWUgYW5kIGxvZyBhIHdhcm5pbmcgcGVyIHZhbHVlIHdoZW4gaXQgZmFpbHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGlzVmFsaWRJbnB1dCh2YWx1ZTogVEFJbnB1dCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZVRBSW5wdXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0ID09PSBmYWxzZSAmJiB0aGlzLmxhc3RJbnB1dCAhPT0gdmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtUaW1lUGFzdFBpcGVdIEludmFsaWQgSW5wdXQgb2YgdHlwZSAke3R5cGVvZiB2YWx1ZX0gKCR7dmFsdWV9KS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubGFzdElucHV0ID0gdmFsdWU7XG5cbiAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBpbnRlcnZhbCB0aWNrZXIgc3Vic2NyaXB0aW9uXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5pbnRlcnZhbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBUaW1lUGFzdFBpcGUgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgTmdUaW1lUGFzdFBpcGVQaXBlID0gVGltZVBhc3RQaXBlO1xuIl19