ngx-timeago
Version:
Live updating timestamps in Angular 6+.
94 lines • 10.8 kB
JavaScript
import { Directive, Input, Optional } from '@angular/core';
import { Subject } from 'rxjs';
import { filter } from 'rxjs/operators';
import { isDefined, coerceBooleanProperty, dateParser } from './util';
import * as i0 from "@angular/core";
import * as i1 from "./timeago.intl";
import * as i2 from "./timeago.formatter";
import * as i3 from "./timeago.clock";
class TimeagoDirective {
/** The Date to display. An actual Date object or something that can be fed to new Date. */
get date() {
return this._date;
}
set date(date) {
this._date = dateParser(date).valueOf();
if (this._date) {
if (this.clockSubscription) {
this.clockSubscription.unsubscribe();
this.clockSubscription = undefined;
}
this.clockSubscription = this.clock.tick(this.date)
.pipe(filter(() => this.live, this))
.subscribe(() => this.stateChanges.next());
}
else {
throw new SyntaxError(`Wrong parameter in TimeagoDirective. Expected a valid date, received: ${date}`);
}
}
/** If the directive should update itself over time */
get live() {
return this._live;
}
set live(live) {
this._live = coerceBooleanProperty(live);
}
constructor(intl, cd, formatter, element, clock) {
this.cd = cd;
this.clock = clock;
/**
* Emits on:
* - Input change
* - Intl change
* - Clock tick
*/
this.stateChanges = new Subject();
this._live = true;
if (intl) {
this.intlSubscription = intl.changes.subscribe(() => this.stateChanges.next());
}
this.stateChanges.subscribe(() => {
this.setContent(element.nativeElement, formatter.format(this.date));
this.cd.markForCheck();
});
}
ngOnChanges() {
this.stateChanges.next();
}
setContent(node, content) {
if (isDefined(node.textContent)) {
node.textContent = content;
}
else {
node.data = content;
}
}
ngOnDestroy() {
if (this.intlSubscription) {
this.intlSubscription.unsubscribe();
this.intlSubscription = undefined;
}
if (this.clockSubscription) {
this.clockSubscription.unsubscribe();
this.clockSubscription = undefined;
}
this.stateChanges.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoDirective, deps: [{ token: i1.TimeagoIntl, optional: true }, { token: i0.ChangeDetectorRef }, { token: i2.TimeagoFormatter }, { token: i0.ElementRef }, { token: i3.TimeagoClock }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.1", type: TimeagoDirective, selector: "[timeago]", inputs: { date: "date", live: "live" }, exportAs: ["timeago"], usesOnChanges: true, ngImport: i0 }); }
}
export { TimeagoDirective };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: TimeagoDirective, decorators: [{
type: Directive,
args: [{
selector: '[timeago]',
exportAs: 'timeago',
}]
}], ctorParameters: function () { return [{ type: i1.TimeagoIntl, decorators: [{
type: Optional
}] }, { type: i0.ChangeDetectorRef }, { type: i2.TimeagoFormatter }, { type: i0.ElementRef }, { type: i3.TimeagoClock }]; }, propDecorators: { date: [{
type: Input
}], live: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWFnby5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvc3JjL3RpbWVhZ28uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFjLFFBQVEsRUFBMkMsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFnQixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXhDLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7OztBQUV0RSxNQUlhLGdCQUFnQjtJQVkzQiwyRkFBMkY7SUFDM0YsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxJQUFTO1FBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7YUFDcEM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDTCxNQUFNLElBQUksV0FBVyxDQUFDLHlFQUF5RSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3hHO0lBQ0gsQ0FBQztJQUdELHNEQUFzRDtJQUN0RCxJQUNJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQWE7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBR0QsWUFBd0IsSUFBaUIsRUFDckIsRUFBcUIsRUFDN0IsU0FBMkIsRUFDM0IsT0FBbUIsRUFDWCxLQUFtQjtRQUhuQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUdyQixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBM0N2Qzs7Ozs7VUFLRTtRQUNGLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQStCM0IsVUFBSyxHQUFHLElBQUksQ0FBQztRQU9uQixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDaEY7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVMsRUFBRSxPQUFlO1FBQ25DLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztTQUM1QjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7OEdBL0VVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCOztTQUFoQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsV0FBVztvQkFDckIsUUFBUSxFQUFFLFNBQVM7aUJBQ3BCOzswQkE0Q2MsUUFBUTsrSkE3QmpCLElBQUk7c0JBRFAsS0FBSztnQkFzQkYsSUFBSTtzQkFEUCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgRWxlbWVudFJlZiwgT3B0aW9uYWwsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUaW1lYWdvQ2xvY2sgfSBmcm9tICcuL3RpbWVhZ28uY2xvY2snO1xuaW1wb3J0IHsgVGltZWFnb0Zvcm1hdHRlciB9IGZyb20gJy4vdGltZWFnby5mb3JtYXR0ZXInO1xuaW1wb3J0IHsgVGltZWFnb0ludGwgfSBmcm9tICcuL3RpbWVhZ28uaW50bCc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgZGF0ZVBhcnNlciB9IGZyb20gJy4vdXRpbCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t0aW1lYWdvXScsXG4gIGV4cG9ydEFzOiAndGltZWFnbycsXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVhZ29EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgaW50bFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGNsb2NrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIEVtaXRzIG9uOlxuICAgKiAtIElucHV0IGNoYW5nZVxuICAgKiAtIEludGwgY2hhbmdlXG4gICAqIC0gQ2xvY2sgdGlja1xuICAqL1xuICBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBUaGUgRGF0ZSB0byBkaXNwbGF5LiBBbiBhY3R1YWwgRGF0ZSBvYmplY3Qgb3Igc29tZXRoaW5nIHRoYXQgY2FuIGJlIGZlZCB0byBuZXcgRGF0ZS4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGRhdGUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZTtcbiAgfVxuICBzZXQgZGF0ZShkYXRlOiBhbnkpIHtcbiAgICB0aGlzLl9kYXRlID0gZGF0ZVBhcnNlcihkYXRlKS52YWx1ZU9mKCk7XG4gICAgaWYgKHRoaXMuX2RhdGUpIHtcbiAgICAgIGlmICh0aGlzLmNsb2NrU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuY2xvY2tTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5jbG9ja1N1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xvY2tTdWJzY3JpcHRpb24gPSB0aGlzLmNsb2NrLnRpY2sodGhpcy5kYXRlKVxuICAgICAgICAucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5saXZlLCB0aGlzKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFdyb25nIHBhcmFtZXRlciBpbiBUaW1lYWdvRGlyZWN0aXZlLiBFeHBlY3RlZCBhIHZhbGlkIGRhdGUsIHJlY2VpdmVkOiAke2RhdGV9YCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2RhdGU6IG51bWJlcjtcblxuICAvKiogSWYgdGhlIGRpcmVjdGl2ZSBzaG91bGQgdXBkYXRlIGl0c2VsZiBvdmVyIHRpbWUgKi9cbiAgQElucHV0KClcbiAgZ2V0IGxpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpdmU7XG4gIH1cbiAgc2V0IGxpdmUobGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2xpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkobGl2ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfbGl2ZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgaW50bDogVGltZWFnb0ludGwsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICBmb3JtYXR0ZXI6IFRpbWVhZ29Gb3JtYXR0ZXIsXG4gICAgICAgICAgICAgIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY2xvY2s6IFRpbWVhZ29DbG9jaykge1xuICAgIGlmIChpbnRsKSB7XG4gICAgICB0aGlzLmludGxTdWJzY3JpcHRpb24gPSBpbnRsLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSk7XG4gICAgfVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldENvbnRlbnQoZWxlbWVudC5uYXRpdmVFbGVtZW50LCBmb3JtYXR0ZXIuZm9ybWF0KHRoaXMuZGF0ZSkpO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIHNldENvbnRlbnQobm9kZTogYW55LCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoaXNEZWZpbmVkKG5vZGUudGV4dENvbnRlbnQpKSB7XG4gICAgICBub2RlLnRleHRDb250ZW50ID0gY29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5kYXRhID0gY29udGVudDtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5pbnRsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmludGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuaW50bFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvY2tTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuY2xvY2tTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuY2xvY2tTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==