UNPKG

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
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