ngx-moment
Version:
Moment.JS pipes for Angular (timeago and more)
86 lines • 11.3 kB
JavaScript
/* ngx-moment (c) 2015, 2016 Uri Shaked / MIT Licence */
import { Pipe, EventEmitter, } from '@angular/core';
import moment from 'moment';
import * as i0 from "@angular/core";
export class CalendarPipe {
constructor(cdRef, ngZone) {
this.cdRef = cdRef;
this.ngZone = ngZone;
// using a single static timer for all instances of this pipe for performance reasons
CalendarPipe.initTimer(ngZone);
CalendarPipe.refs++;
// values such as Today will need to be replaced with Yesterday after midnight,
// so make sure we subscribe to an EventEmitter that we set up to emit at midnight
this.midnightSub = CalendarPipe.midnight.subscribe(() => {
this.ngZone.run(() => this.cdRef.markForCheck());
});
}
transform(value, ...args) {
let formats = null;
let referenceTime = null;
for (let i = 0, len = args.length; i < len; i++) {
if (args[i] !== null) {
if (typeof args[i] === 'object' && !moment.isMoment(args[i])) {
formats = args[i];
}
else {
referenceTime = moment(args[i]);
}
}
}
return moment(value).calendar(referenceTime, formats);
}
ngOnDestroy() {
if (CalendarPipe.refs > 0) {
CalendarPipe.refs--;
}
if (CalendarPipe.refs === 0) {
CalendarPipe.removeTimer();
}
this.midnightSub.unsubscribe();
}
static initTimer(ngZone) {
// initialize the timer
if (!CalendarPipe.midnight) {
CalendarPipe.midnight = new EventEmitter();
if (typeof window !== 'undefined') {
const timeToUpdate = CalendarPipe._getMillisecondsUntilUpdate();
CalendarPipe.timer = ngZone.runOutsideAngular(() => {
return window.setTimeout(() => {
// emit the current date
CalendarPipe.midnight.emit(new Date());
// refresh the timer
CalendarPipe.removeTimer();
CalendarPipe.initTimer(ngZone);
}, timeToUpdate);
});
}
}
}
static removeTimer() {
if (CalendarPipe.timer) {
window.clearTimeout(CalendarPipe.timer);
CalendarPipe.timer = null;
CalendarPipe.midnight = null;
}
}
static _getMillisecondsUntilUpdate() {
const now = moment();
const tomorrow = moment().startOf('day').add(1, 'days');
const timeToMidnight = tomorrow.valueOf() - now.valueOf();
return timeToMidnight + 1000; // 1 second after midnight
}
}
/**
* Internal reference counter, so we can clean up when no instances are in use
*/
CalendarPipe.refs = 0;
CalendarPipe.timer = null;
CalendarPipe.midnight = null;
CalendarPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CalendarPipe, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Pipe });
CalendarPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CalendarPipe, name: "amCalendar", pure: false });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: CalendarPipe, decorators: [{
type: Pipe,
args: [{ name: 'amCalendar', pure: false }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYWxlbmRhci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdEQUF3RDtBQUV4RCxPQUFPLEVBQ0wsSUFBSSxFQUdKLFlBQVksR0FHYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7O0FBSTVCLE1BQU0sT0FBTyxZQUFZO0lBV3ZCLFlBQW9CLEtBQXdCLEVBQVUsTUFBYztRQUFoRCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDbEUscUZBQXFGO1FBQ3JGLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0IsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXBCLCtFQUErRTtRQUMvRSxrRkFBa0Y7UUFDbEYsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUF5QixFQUFFLEdBQUcsSUFBVztRQUNqRCxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUM7UUFDeEIsSUFBSSxhQUFhLEdBQVEsSUFBSSxDQUFDO1FBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNwQixJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzVELE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ25CO3FCQUFNO29CQUNMLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7U0FDRjtRQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNyQjtRQUVELElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDM0IsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzVCO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFjO1FBQ3JDLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUMxQixZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7WUFDakQsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7Z0JBQ2pDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUNoRSxZQUFZLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7b0JBQ2pELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQzVCLHdCQUF3Qjt3QkFDeEIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUV2QyxvQkFBb0I7d0JBQ3BCLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDM0IsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDakMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVc7UUFDeEIsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQzFCLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQywyQkFBMkI7UUFDeEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxRCxPQUFPLGNBQWMsR0FBRyxJQUFJLENBQUMsQ0FBQywwQkFBMEI7SUFDMUQsQ0FBQzs7QUFyRkQ7O0dBRUc7QUFDWSxpQkFBSSxHQUFHLENBQUUsQ0FBQTtBQUVULGtCQUFLLEdBQWtCLElBQUssQ0FBQTtBQUM1QixxQkFBUSxHQUE4QixJQUFLLENBQUE7eUdBUC9DLFlBQVk7dUdBQVosWUFBWTsyRkFBWixZQUFZO2tCQUR4QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogbmd4LW1vbWVudCAoYykgMjAxNSwgMjAxNiBVcmkgU2hha2VkIC8gTUlUIExpY2VuY2UgKi9cblxuaW1wb3J0IHtcbiAgUGlwZSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFBpcGVUcmFuc2Zvcm0sXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBQaXBlKHsgbmFtZTogJ2FtQ2FsZW5kYXInLCBwdXJlOiBmYWxzZSB9KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0sIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZWZlcmVuY2UgY291bnRlciwgc28gd2UgY2FuIGNsZWFuIHVwIHdoZW4gbm8gaW5zdGFuY2VzIGFyZSBpbiB1c2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZnMgPSAwO1xuXG4gIHByaXZhdGUgc3RhdGljIHRpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgbWlkbmlnaHQ6IEV2ZW50RW1pdHRlcjxEYXRlPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbWlkbmlnaHRTdWI6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xuICAgIC8vIHVzaW5nIGEgc2luZ2xlIHN0YXRpYyB0aW1lciBmb3IgYWxsIGluc3RhbmNlcyBvZiB0aGlzIHBpcGUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnNcbiAgICBDYWxlbmRhclBpcGUuaW5pdFRpbWVyKG5nWm9uZSk7XG5cbiAgICBDYWxlbmRhclBpcGUucmVmcysrO1xuXG4gICAgLy8gdmFsdWVzIHN1Y2ggYXMgVG9kYXkgd2lsbCBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggWWVzdGVyZGF5IGFmdGVyIG1pZG5pZ2h0LFxuICAgIC8vIHNvIG1ha2Ugc3VyZSB3ZSBzdWJzY3JpYmUgdG8gYW4gRXZlbnRFbWl0dGVyIHRoYXQgd2Ugc2V0IHVwIHRvIGVtaXQgYXQgbWlkbmlnaHRcbiAgICB0aGlzLm1pZG5pZ2h0U3ViID0gQ2FsZW5kYXJQaXBlLm1pZG5pZ2h0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKSk7XG4gICAgfSk7XG4gIH1cblxuICB0cmFuc2Zvcm0odmFsdWU6IG1vbWVudC5Nb21lbnRJbnB1dCwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIGxldCBmb3JtYXRzOiBhbnkgPSBudWxsO1xuICAgIGxldCByZWZlcmVuY2VUaW1lOiBhbnkgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFyZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChhcmdzW2ldICE9PSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1tpXSA9PT0gJ29iamVjdCcgJiYgIW1vbWVudC5pc01vbWVudChhcmdzW2ldKSkge1xuICAgICAgICAgIGZvcm1hdHMgPSBhcmdzW2ldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZmVyZW5jZVRpbWUgPSBtb21lbnQoYXJnc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9tZW50KHZhbHVlKS5jYWxlbmRhcihyZWZlcmVuY2VUaW1lLCBmb3JtYXRzKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmIChDYWxlbmRhclBpcGUucmVmcyA+IDApIHtcbiAgICAgIENhbGVuZGFyUGlwZS5yZWZzLS07XG4gICAgfVxuXG4gICAgaWYgKENhbGVuZGFyUGlwZS5yZWZzID09PSAwKSB7XG4gICAgICBDYWxlbmRhclBpcGUucmVtb3ZlVGltZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLm1pZG5pZ2h0U3ViLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpbml0VGltZXIobmdab25lOiBOZ1pvbmUpIHtcbiAgICAvLyBpbml0aWFsaXplIHRoZSB0aW1lclxuICAgIGlmICghQ2FsZW5kYXJQaXBlLm1pZG5pZ2h0KSB7XG4gICAgICBDYWxlbmRhclBpcGUubWlkbmlnaHQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgdGltZVRvVXBkYXRlID0gQ2FsZW5kYXJQaXBlLl9nZXRNaWxsaXNlY29uZHNVbnRpbFVwZGF0ZSgpO1xuICAgICAgICBDYWxlbmRhclBpcGUudGltZXIgPSBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBlbWl0IHRoZSBjdXJyZW50IGRhdGVcbiAgICAgICAgICAgIENhbGVuZGFyUGlwZS5taWRuaWdodC5lbWl0KG5ldyBEYXRlKCkpO1xuXG4gICAgICAgICAgICAvLyByZWZyZXNoIHRoZSB0aW1lclxuICAgICAgICAgICAgQ2FsZW5kYXJQaXBlLnJlbW92ZVRpbWVyKCk7XG4gICAgICAgICAgICBDYWxlbmRhclBpcGUuaW5pdFRpbWVyKG5nWm9uZSk7XG4gICAgICAgICAgfSwgdGltZVRvVXBkYXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVtb3ZlVGltZXIoKSB7XG4gICAgaWYgKENhbGVuZGFyUGlwZS50aW1lcikge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dChDYWxlbmRhclBpcGUudGltZXIpO1xuICAgICAgQ2FsZW5kYXJQaXBlLnRpbWVyID0gbnVsbDtcbiAgICAgIENhbGVuZGFyUGlwZS5taWRuaWdodCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2dldE1pbGxpc2Vjb25kc1VudGlsVXBkYXRlKCkge1xuICAgIGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuICAgIGNvbnN0IHRvbW9ycm93ID0gbW9tZW50KCkuc3RhcnRPZignZGF5JykuYWRkKDEsICdkYXlzJyk7XG4gICAgY29uc3QgdGltZVRvTWlkbmlnaHQgPSB0b21vcnJvdy52YWx1ZU9mKCkgLSBub3cudmFsdWVPZigpO1xuICAgIHJldHVybiB0aW1lVG9NaWRuaWdodCArIDEwMDA7IC8vIDEgc2Vjb25kIGFmdGVyIG1pZG5pZ2h0XG4gIH1cbn1cbiJdfQ==