base-entity-resolver.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { ActivatedRouteSnapshot, Resolve, ResolveData, RouterStateSnapshot } from '@angular/router';
  2. import { Observable, of } from 'rxjs';
  3. import { filter, map, shareReplay, take } from 'rxjs/operators';
  4. import { Type } from 'shared/shared-types';
  5. import { notNullOrUndefined } from 'shared/shared-utils';
  6. export interface EntityResolveData<R> extends ResolveData {
  7. entity: Type<BaseEntityResolver<R>>;
  8. }
  9. export function createResolveData<T extends BaseEntityResolver<R>, R>(
  10. resolver: Type<T>,
  11. ): EntityResolveData<R> {
  12. return {
  13. entity: resolver,
  14. };
  15. }
  16. /**
  17. * A base resolver for an entity detail route. Resolves to an observable of the given entity, or a "blank"
  18. * version if the route id equals "create".
  19. */
  20. export class BaseEntityResolver<T> implements Resolve<Observable<T>> {
  21. constructor(
  22. private readonly emptyEntity: T,
  23. private entityStream: (id: string) => Observable<T | null>,
  24. ) {}
  25. resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Observable<T>> {
  26. const id = route.paramMap.get('id');
  27. if (id === 'create') {
  28. return of(of(this.emptyEntity));
  29. } else if (id) {
  30. const stream = this.entityStream(id).pipe(
  31. filter(notNullOrUndefined),
  32. shareReplay(1),
  33. );
  34. return stream.pipe(
  35. take(1),
  36. map(() => stream),
  37. );
  38. } else {
  39. return {} as any;
  40. }
  41. }
  42. }