UNPKG

ngx-moment

Version:

Moment.JS pipes for Angular (timeago and more)

86 lines 11.3 kB
/* 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==