import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, UrlTree } from '@angular/router'; import { Injectable, InjectionToken, Injector } from '@angular/core'; import { firstValueFrom, from, of } from 'rxjs'; import { LoadingService } from '../loading'; @Injectable({ providedIn: 'root', }) export class CompositeRouteGuard implements CanActivate { constructor(protected readonly _injector: Injector, private readonly _loadingService: LoadingService) {} async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { this._loadingService.start(); const routeGuards = []>route.data['routeGuards']; if (routeGuards) { for (let i = 0; i < routeGuards.length; i++) { const routeGuard = this._injector.get(routeGuards[i]); let canActivateResult = routeGuard.canActivate(route, state); if (canActivateResult instanceof Promise) { canActivateResult = from(canActivateResult); } if (typeof canActivateResult === 'boolean' || canActivateResult instanceof UrlTree) { canActivateResult = of(canActivateResult); } const result = await firstValueFrom(canActivateResult); if (!result) { this._loadingService.stop(); return false; } } } this._loadingService.stop(); return true; } }