UNPKG

angular2-toaster-2

Version:

An Angular Toaster Notification library based on AngularJS-Toaster

191 lines 24.5 kB
import { Component, Input, Output, ViewChild, ViewContainerRef, EventEmitter, HostListener } from '@angular/core'; import { BodyOutputType } from './bodyOutputType'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "./trust-html.pipe"; export class ToastComponent { componentFactoryResolver; changeDetectorRef; ngZone; element; renderer2; toasterconfig; toast; titleClass; messageClass; componentBody; progressBarWidth = -1; bodyOutputType = BodyOutputType; clickEvent = new EventEmitter(); removeToastEvent = new EventEmitter(); timeoutId = null; timeout = 0; progressBarIntervalId = null; removeToastTick; removeMouseOverListener; constructor(componentFactoryResolver, changeDetectorRef, ngZone, element, renderer2) { this.componentFactoryResolver = componentFactoryResolver; this.changeDetectorRef = changeDetectorRef; this.ngZone = ngZone; this.element = element; this.renderer2 = renderer2; } ngOnInit() { if (this.toast.progressBar) { this.toast.progressBarDirection = this.toast.progressBarDirection || 'decreasing'; } let timeout = (typeof this.toast.timeout === 'number') ? this.toast.timeout : this.toasterconfig.timeout; if (typeof timeout === 'object') { timeout = timeout[this.toast.type]; } ; this.timeout = timeout; } ngAfterViewInit() { if (this.toast.bodyOutputType === this.bodyOutputType.Component) { const component = this.componentFactoryResolver.resolveComponentFactory(this.toast.body); const componentInstance = this.componentBody.createComponent(component, undefined, this.componentBody.injector); componentInstance.instance.toast = this.toast; this.changeDetectorRef.detectChanges(); } if (this.toasterconfig.mouseoverTimerStop) { // only apply a mouseenter event when necessary to avoid // unnecessary event and change detection cycles. this.removeMouseOverListener = this.renderer2.listen(this.element.nativeElement, 'mouseenter', () => this.stopTimer()); } this.configureTimer(); } click(event, toast) { event.stopPropagation(); this.clickEvent.emit({ value: { toast: toast, isCloseButton: true } }); } stopTimer() { this.progressBarWidth = 0; this.clearTimers(); } restartTimer() { if (this.toasterconfig.mouseoverTimerStop) { if (!this.timeoutId) { this.configureTimer(); } } else if (this.timeout && !this.timeoutId) { this.removeToast(); } } ngOnDestroy() { if (this.removeMouseOverListener) { this.removeMouseOverListener(); } this.clearTimers(); } configureTimer() { if (!this.timeout || this.timeout < 1) { return; } if (this.toast.progressBar) { this.removeToastTick = new Date().getTime() + this.timeout; this.progressBarWidth = -1; } this.ngZone.runOutsideAngular(() => { this.timeoutId = window.setTimeout(() => { this.ngZone.run(() => { this.changeDetectorRef.markForCheck(); this.removeToast(); }); }, this.timeout); if (this.toast.progressBar) { this.progressBarIntervalId = window.setInterval(() => { this.ngZone.run(() => { this.updateProgressBar(); }); }, 10); } }); } updateProgressBar() { if (this.progressBarWidth === 0 || this.progressBarWidth === 100) { return; } this.progressBarWidth = ((this.removeToastTick - new Date().getTime()) / this.timeout) * 100; if (this.toast.progressBarDirection === 'increasing') { this.progressBarWidth = 100 - this.progressBarWidth; } if (this.progressBarWidth < 0) { this.progressBarWidth = 0; } if (this.progressBarWidth > 100) { this.progressBarWidth = 100; } } clearTimers() { if (this.timeoutId) { window.clearTimeout(this.timeoutId); } if (this.progressBarIntervalId) { window.clearInterval(this.progressBarIntervalId); } this.timeoutId = null; this.progressBarIntervalId = null; } removeToast() { this.removeToastEvent.emit(this.toast); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: ToastComponent, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.3", type: ToastComponent, selector: "[toastComp]", inputs: { toasterconfig: "toasterconfig", toast: "toast", titleClass: "titleClass", messageClass: "messageClass" }, outputs: { clickEvent: "clickEvent", removeToastEvent: "removeToastEvent" }, host: { listeners: { "mouseleave": "restartTimer()" } }, viewQueries: [{ propertyName: "componentBody", first: true, predicate: ["componentBody"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: ` <div class="toast-content"> <div [ngClass]="titleClass">{{toast.title}}</div> <div [ngClass]="messageClass" [ngSwitch]="toast.bodyOutputType"> <div *ngSwitchCase="bodyOutputType.Component" #componentBody></div> <div *ngSwitchCase="bodyOutputType.TrustedHtml" [innerHTML]="(toast.body ?? '') | trustHtml"></div> <div *ngSwitchCase="bodyOutputType.Default">{{toast.body ?? ''}}</div> </div> </div> <button class="toast-close-button" *ngIf="toast.showCloseButton" (click)="click($event, toast)" [innerHTML]="(toast.closeHtml ?? '') | trustHtml"> </button> <div *ngIf="toast.progressBar"> <div class="toast-progress-bar" [style.width]="progressBarWidth + '%'"></div> </div>`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.TrustHtmlPipe, name: "trustHtml" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: ToastComponent, decorators: [{ type: Component, args: [{ selector: '[toastComp]', template: ` <div class="toast-content"> <div [ngClass]="titleClass">{{toast.title}}</div> <div [ngClass]="messageClass" [ngSwitch]="toast.bodyOutputType"> <div *ngSwitchCase="bodyOutputType.Component" #componentBody></div> <div *ngSwitchCase="bodyOutputType.TrustedHtml" [innerHTML]="(toast.body ?? '') | trustHtml"></div> <div *ngSwitchCase="bodyOutputType.Default">{{toast.body ?? ''}}</div> </div> </div> <button class="toast-close-button" *ngIf="toast.showCloseButton" (click)="click($event, toast)" [innerHTML]="(toast.closeHtml ?? '') | trustHtml"> </button> <div *ngIf="toast.progressBar"> <div class="toast-progress-bar" [style.width]="progressBarWidth + '%'"></div> </div>` }] }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { toasterconfig: [{ type: Input }], toast: [{ type: Input }], titleClass: [{ type: Input }], messageClass: [{ type: Input }], componentBody: [{ type: ViewChild, args: ['componentBody', { read: ViewContainerRef, static: false }] }], clickEvent: [{ type: Output }], removeToastEvent: [{ type: Output }], restartTimer: [{ type: HostListener, args: ['mouseleave'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FuZ3VsYXIyLXRvYXN0ZXIvc3JjL2xpYi90b2FzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsWUFBWSxFQU1aLFlBQVksRUFJZixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFxQmxELE1BQU0sT0FBTyxjQUFjO0lBdUJiO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUExQkQsYUFBYSxDQUFnQjtJQUM3QixLQUFLLENBQVE7SUFDYixVQUFVLENBQVM7SUFDbkIsWUFBWSxDQUFTO0lBQ3lDLGFBQWEsQ0FBbUI7SUFFaEcsZ0JBQWdCLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDOUIsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUdoQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVoQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBRTVDLFNBQVMsR0FBWSxJQUFJLENBQUM7SUFDMUIsT0FBTyxHQUFXLENBQUMsQ0FBQztJQUNwQixxQkFBcUIsR0FBWSxJQUFJLENBQUM7SUFDdEMsZUFBZSxDQUFTO0lBRXhCLHVCQUF1QixDQUFhO0lBRTVDLFlBQ1Usd0JBQWtELEVBQ2xELGlCQUFvQyxFQUNwQyxNQUFjLEVBQ2QsT0FBbUIsRUFDbkIsU0FBb0I7UUFKcEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGNBQVMsR0FBVCxTQUFTLENBQVc7SUFDM0IsQ0FBQztJQUVK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ckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNpRSxhQUFhO3NCQUFuRixTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU05RCxVQUFVO3NCQURoQixNQUFNO2dCQUdBLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFpRVAsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LCBcclxuICAgIElucHV0LCBcclxuICAgIE91dHB1dCwgXHJcbiAgICBWaWV3Q2hpbGQsIFxyXG4gICAgVmlld0NvbnRhaW5lclJlZiwgXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsIFxyXG4gICAgT25Jbml0LCBcclxuICAgIEFmdGVyVmlld0luaXQsIFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgTmdab25lLCBcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBSZW5kZXJlcjJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVG9hc3QgfSBmcm9tICcuL3RvYXN0JztcclxuaW1wb3J0IHsgQm9keU91dHB1dFR5cGUgfSBmcm9tICcuL2JvZHlPdXRwdXRUeXBlJztcclxuaW1wb3J0IHsgVG9hc3RlckNvbmZpZyB9IGZyb20gJy4vdG9hc3Rlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ1t0b2FzdENvbXBdJyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvYXN0LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ0aXRsZUNsYXNzXCI+e3t0b2FzdC50aXRsZX19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwibWVzc2FnZUNsYXNzXCIgW25nU3dpdGNoXT1cInRvYXN0LmJvZHlPdXRwdXRUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJib2R5T3V0cHV0VHlwZS5Db21wb25lbnRcIiAjY29tcG9uZW50Qm9keT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImJvZHlPdXRwdXRUeXBlLlRydXN0ZWRIdG1sXCIgW2lubmVySFRNTF09XCIodG9hc3QuYm9keSA/PyAnJykgfCB0cnVzdEh0bWxcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cImJvZHlPdXRwdXRUeXBlLkRlZmF1bHRcIj57e3RvYXN0LmJvZHkgPz8gJyd9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidG9hc3QtY2xvc2UtYnV0dG9uXCIgKm5nSWY9XCJ0b2FzdC5zaG93Q2xvc2VCdXR0b25cIiAoY2xpY2spPVwiY2xpY2soJGV2ZW50LCB0b2FzdClcIlxyXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIih0b2FzdC5jbG9zZUh0bWwgPz8gJycpIHwgdHJ1c3RIdG1sXCI+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInRvYXN0LnByb2dyZXNzQmFyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2FzdC1wcm9ncmVzcy1iYXJcIiBbc3R5bGUud2lkdGhdPVwicHJvZ3Jlc3NCYXJXaWR0aCArICclJ1wiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PmBcclxufSlcclxuZXhwb3J0IGNsYXNzIFRvYXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQElucHV0KCkgdG9hc3RlcmNvbmZpZzogVG9hc3RlckNvbmZpZztcclxuICAgIEBJbnB1dCgpIHRvYXN0OiBUb2FzdDtcclxuICAgIEBJbnB1dCgpIHRpdGxlQ2xhc3M6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIG1lc3NhZ2VDbGFzczogc3RyaW5nO1xyXG4gICAgQFZpZXdDaGlsZCgnY29tcG9uZW50Qm9keScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiBmYWxzZSB9KSBjb21wb25lbnRCb2R5OiBWaWV3Q29udGFpbmVyUmVmO1xyXG5cclxuICAgIHB1YmxpYyBwcm9ncmVzc0JhcldpZHRoOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBib2R5T3V0cHV0VHlwZSA9IEJvZHlPdXRwdXRUeXBlO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyByZW1vdmVUb2FzdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxUb2FzdD4oKTtcclxuXHJcbiAgICBwcml2YXRlIHRpbWVvdXRJZD86IG51bWJlciA9IG51bGw7XHJcbiAgICBwcml2YXRlIHRpbWVvdXQ6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHByb2dyZXNzQmFySW50ZXJ2YWxJZD86IG51bWJlciA9IG51bGw7XHJcbiAgICBwcml2YXRlIHJlbW92ZVRvYXN0VGljazogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlTW91c2VPdmVyTGlzdGVuZXI6ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcbiAgICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjJcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAodGhpcy50b2FzdC5wcm9ncmVzc0Jhcikge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LnByb2dyZXNzQmFyRGlyZWN0aW9uID0gdGhpcy50b2FzdC5wcm9ncmVzc0JhckRpcmVjdGlvbiB8fCAnZGVjcmVhc2luZyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGltZW91dCA9ICh0eXBlb2YgdGhpcy50b2FzdC50aW1lb3V0ID09PSAnbnVtYmVyJylcclxuICAgICAgICAgICAgPyB0aGlzLnRvYXN0LnRpbWVvdXQgOiB0aGlzLnRvYXN0ZXJjb25maWcudGltZW91dDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aW1lb3V0ID09PSAnb2JqZWN0JykgeyBcclxuICAgICAgICAgICAgdGltZW91dCA9IHRpbWVvdXRbdGhpcy50b2FzdC50eXBlXTsgXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudG9hc3QuYm9keU91dHB1dFR5cGUgPT09IHRoaXMuYm9keU91dHB1dFR5cGUuQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMudG9hc3QuYm9keSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlOiBhbnkgPSB0aGlzLmNvbXBvbmVudEJvZHkuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwgdW5kZWZpbmVkLCB0aGlzLmNvbXBvbmVudEJvZHkuaW5qZWN0b3IpO1xyXG4gICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZS50b2FzdCA9IHRoaXMudG9hc3Q7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9hc3RlcmNvbmZpZy5tb3VzZW92ZXJUaW1lclN0b3ApIHtcclxuICAgICAgICAgICAgLy8gb25seSBhcHBseSBhIG1vdXNlZW50ZXIgZXZlbnQgd2hlbiBuZWNlc3NhcnkgdG8gYXZvaWRcclxuICAgICAgICAgICAgLy8gdW5uZWNlc3NhcnkgZXZlbnQgYW5kIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLlxyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZU1vdXNlT3Zlckxpc3RlbmVyID0gdGhpcy5yZW5kZXJlcjIubGlzdGVuKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIFxyXG4gICAgICAgICAgICAgICAgJ21vdXNlZW50ZXInLCBcclxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuc3RvcFRpbWVyKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlndXJlVGltZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGljayhldmVudDogTW91c2VFdmVudCwgdG9hc3Q6IFRvYXN0KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoeyB2YWx1ZSA6IHsgdG9hc3Q6IHRvYXN0LCBpc0Nsb3NlQnV0dG9uOiB0cnVlIH0gfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcFRpbWVyKCkge1xyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJXaWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5jbGVhclRpbWVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKSBcclxuICAgIHJlc3RhcnRUaW1lcigpIHtcclxuICAgICAgICBpZiAodGhpcy50b2FzdGVyY29uZmlnLm1vdXNlb3ZlclRpbWVyU3RvcCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMudGltZW91dElkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZVRpbWVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGltZW91dCAmJiAhdGhpcy50aW1lb3V0SWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUb2FzdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBpZiAodGhpcy5yZW1vdmVNb3VzZU92ZXJMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZU1vdXNlT3Zlckxpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2xlYXJUaW1lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbmZpZ3VyZVRpbWVyKCkge1xyXG4gICAgICAgIGlmICghdGhpcy50aW1lb3V0IHx8IHRoaXMudGltZW91dCA8IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9hc3QucHJvZ3Jlc3NCYXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUb2FzdFRpY2sgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHRoaXMudGltZW91dDtcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0JhcldpZHRoID0gLTE7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVG9hc3QoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCB0aGlzLnRpbWVvdXQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudG9hc3QucHJvZ3Jlc3NCYXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJJbnRlcnZhbElkID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzQmFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVByb2dyZXNzQmFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzQmFyV2lkdGggPT09IDAgfHwgdGhpcy5wcm9ncmVzc0JhcldpZHRoID09PSAxMDApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJXaWR0aCA9ICgodGhpcy5yZW1vdmVUb2FzdFRpY2sgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgLyB0aGlzLnRpbWVvdXQpICogMTAwO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLnRvYXN0LnByb2dyZXNzQmFyRGlyZWN0aW9uID09PSAnaW5jcmVhc2luZycpIHtcclxuICAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJXaWR0aCA9IDEwMCAtIHRoaXMucHJvZ3Jlc3NCYXJXaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJXaWR0aCA8IDApIHtcclxuICAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJXaWR0aCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzQmFyV2lkdGggPiAxMDApIHtcclxuICAgICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJXaWR0aCA9IDEwMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGVhclRpbWVycygpIHtcclxuICAgICAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcclxuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb2dyZXNzQmFySW50ZXJ2YWxJZCkge1xyXG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnByb2dyZXNzQmFySW50ZXJ2YWxJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzc0JhckludGVydmFsSWQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlVG9hc3QoKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVUb2FzdEV2ZW50LmVtaXQodGhpcy50b2FzdCk7XHJcbiAgICB9XHJcbn1cclxuIl19