Browse Source

add a service for getting navigation events stream

pull/7537/head
Arman Ozak 6 years ago
parent
commit
5866a59ed9
  1. 1
      npm/ng-packs/packages/core/src/lib/services/index.ts
  2. 36
      npm/ng-packs/packages/core/src/lib/services/navigation-events.service.ts
  3. 75
      npm/ng-packs/packages/core/src/lib/tests/navigation-events.service.spec.ts

1
npm/ng-packs/packages/core/src/lib/services/index.ts

@ -9,6 +9,7 @@ export * from './lazy-load.service';
export * from './list.service';
export * from './localization.service';
export * from './multi-tenancy.service';
export * from './navigation-events.service';
export * from './permission.service';
export * from './profile-state.service';
export * from './profile.service';

36
npm/ng-packs/packages/core/src/lib/services/navigation-events.service.ts

@ -0,0 +1,36 @@
import { Injectable, Type } from '@angular/core';
import {
NavigationCancel,
NavigationEnd,
NavigationError,
NavigationStart,
Router,
RouterEvent,
} from '@angular/router';
import { filter } from 'rxjs/operators';
export type NavigationEventType = 'Cancel' | 'End' | 'Error' | 'Start';
@Injectable({ providedIn: 'root' })
export class NavigationEvents {
private eventTypes = new Map<NavigationEventType, Type<RouterEvent>>([
['Cancel', NavigationCancel],
['End', NavigationEnd],
['Error', NavigationError],
['Start', NavigationStart],
]);
constructor(private router: Router) {}
getOneOf(...eventTypes: NavigationEventType[]) {
return this.router.events.pipe(
filter((event: RouterEvent) =>
eventTypes.some(type => event instanceof this.eventTypes.get(type)),
),
);
}
getAny() {
return this.getOneOf(...this.eventTypes.keys());
}
}

75
npm/ng-packs/packages/core/src/lib/tests/navigation-events.service.spec.ts

@ -0,0 +1,75 @@
import {
NavigationCancel,
NavigationEnd,
NavigationError,
NavigationStart,
Router,
RouterEvent,
} from '@angular/router';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest';
import { Subject } from 'rxjs';
import { take } from 'rxjs/operators';
import { NavigationEvents } from '../services/navigation-events.service';
describe('NavigationEvents', () => {
let spectator: SpectatorService<NavigationEvents>;
let service: NavigationEvents;
const events = new Subject<RouterEvent>();
const createService = createServiceFactory({
service: NavigationEvents,
providers: [
{
provide: Router,
useValue: { events },
},
],
});
beforeEach(() => {
spectator = createService();
service = spectator.service;
});
describe('getOneOf', () => {
test.each`
filtered | expected
${['Start', 'Cancel']} | ${[0, 3]}
${['Error', 'Cancel']} | ${[0, 1]}
${['Start', 'End']} | ${[2, 3]}
${['Error', 'End']} | ${[1, 2]}
`('should return a stream of given navigation events', ({ filtered, expected }) => {
const stream = service.getOneOf(...filtered);
const collected: number[] = [];
stream.pipe(take(2)).subscribe(event => collected.push(event.id));
events.next(new NavigationCancel(0, null, null));
events.next(new NavigationError(1, null, null));
events.next(new NavigationEnd(2, null, null));
events.next(new NavigationStart(3, null, null));
expect(collected).toEqual(expected);
});
});
describe('getAny', () => {
it('should return a stream of any navigation event', () => {
const stream = service.getAny();
const collected: number[] = [];
stream.pipe(take(4)).subscribe(event => collected.push(event.id));
events.next(new RouterEvent(0, null));
events.next(new NavigationStart(1, null, null));
events.next(new RouterEvent(2, null));
events.next(new RouterEvent(3, null));
events.next(new NavigationError(4, null, null));
events.next(new NavigationEnd(5, null, null));
events.next(new RouterEvent(6, null));
events.next(new NavigationCancel(7, null, null));
expect(collected).toEqual([1, 4, 5, 7]);
});
});
});
Loading…
Cancel
Save