All files / lib/services/http-progress http-progress.service.ts

100% Statements 14/14
75% Branches 3/4
100% Functions 10/10
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63                            3x 28x         6x 7x   2x   1x     1x             28x               6x       5x       6x 6x         7x 5x        
import { Overlay, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { inject, Injectable } from '@angular/core';
import { tap } from 'rxjs/operators';
 
import { AppGlobalProgressBarComponent } from '../../components/global-progress-bar/global-progress-bar.component';
import { IHttpProgressHandler } from '../../http-progress.interface';
 
/**
 * Http progress service controls the global progress indicator visibility.
 */
@Injectable({
  providedIn: 'root',
})
export class AppHttpProgressService {
  private readonly overlay = inject(Overlay);
 
  public readonly progressRef: OverlayRef;
 
  public readonly globalProgressHandler: IHttpProgressHandler = {
    start: () => this.startProgress(),
    stop: () => this.stopProgress(),
    tapStopperObservable: <T>() => {
      return tap<T>({
        next: () => {
          this.globalProgressHandler.stop();
        },
        error: () => {
          this.globalProgressHandler.stop();
        },
      });
    },
  };
 
  constructor() {
    this.progressRef = this.overlay.create({
      hasBackdrop: true,
      backdropClass: '',
      positionStrategy: this.overlay.position().global().top(),
    });
  }
 
  private attachIndicator(): void {
    this.progressRef.attach(new ComponentPortal<AppGlobalProgressBarComponent>(AppGlobalProgressBarComponent));
  }
 
  public detachIndicator(): void {
    this.progressRef.detach();
  }
 
  private startProgress(): void {
    Eif (!this.progressRef.hasAttached()) {
      this.attachIndicator();
    }
  }
 
  private stopProgress(): void {
    if (this.progressRef.hasAttached()) {
      this.detachIndicator();
    }
  }
}