import { Injectable } from '@angular/core'; import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, } from '@angular/router'; import { BehaviorSubject, Observable } from 'rxjs'; import { filter } from 'rxjs/operators'; @Injectable({ providedIn: 'root', }) export class MwProgressBarService { private localBufferValue: BehaviorSubject; private localMode: BehaviorSubject; private localValue: BehaviorSubject; private localVisible: BehaviorSubject; constructor(private router: Router) { this.localBufferValue = new BehaviorSubject(0); this.localMode = new BehaviorSubject('indeterminate'); this.localValue = new BehaviorSubject(0); this.localVisible = new BehaviorSubject(false); this._init(); } get bufferValue(): Observable { return this.localBufferValue.asObservable(); } setBufferValue(value: number): void { this.localBufferValue.next(value); } get mode(): Observable { return this.localMode.asObservable(); } setMode(value: 'determinate' | 'indeterminate' | 'buffer' | 'query'): void { this.localMode.next(value); } get value(): Observable { return this.localValue.asObservable(); } setValue(value: number): void { this.localValue.next(value); } get visible(): Observable { return this.localVisible.asObservable(); } private _init(): void { // Subscribe to the router events to show/hide the loading bar this.router.events .pipe(filter((event) => event instanceof NavigationStart)) .subscribe(() => { this.show(); }); this.router.events .pipe( filter( (event) => event instanceof NavigationEnd || event instanceof NavigationError || event instanceof NavigationCancel ) ) .subscribe(() => { this.hide(); }); } show(): void { this.localVisible.next(true); } hide(): void { this.localVisible.next(false); } }