Commit 1e4736a4b83452ca9c07d919dfb3afb0f3c35bc0

Authored by Ábner Oliveira
1 parent f74c41d2

added events-hub service

src/app/events-hub-known-events.constants.ts 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +export const EVENTS_HUB_KNOWN_EVENTS_NAMES = {
  2 + IMAGE_PROFILE_UPDATED: 'IMAGE_PROFILE_UPDATED',
  3 + PROFILE_INFO_UPDATED: 'IMAGE_PROFILE_UPDATED',
  4 + ARTICLE_UPDATED: 'ARTICLE_UPDATED'
  5 +};
... ...
src/app/index.ts
1   -import {bootstrap} from "ng-forward";
  1 +import {bootstrap, provide} from "ng-forward";
2 2 import {noosferoModuleConfig} from "./index.config";
3 3 import {noosferoAngularRunBlock} from "./index.run";
4 4 import {MainComponent} from "./main/main.component";
... ... @@ -22,4 +22,13 @@ angular.module('noosfero.init', ['noosfero.templates.app', 'noosfero.templates.p
22 22 run(noosferoAngularRunBlock).
23 23 constant("moment", moment).
24 24 constant("AuthEvents", AuthEvents);
25   -bootstrap(MainComponent);
  25 +
  26 +
  27 +import { EVENTS_HUB_KNOWN_LIST } from './shared/services/events-hub.service';
  28 +import { EVENTS_HUB_KNOWN_EVENTS_NAMES } from './events-hub-known-events.constants';
  29 +
  30 +bootstrap(MainComponent,
  31 + [
  32 + provide(EVENTS_HUB_KNOWN_LIST, { useConstant: Object.getOwnPropertyNames(EVENTS_HUB_KNOWN_EVENTS_NAMES) })
  33 + ]
  34 +);
... ...
src/app/shared/services/events-hub.service.spec.ts 0 → 100644
... ... @@ -0,0 +1,52 @@
  1 +import { OpaqueToken } from 'ng-forward';
  2 +import { EventsHubService } from './events-hub.service';
  3 +
  4 +
  5 +describe("EventsHubService", () => {
  6 + let eventsHubService: EventsHubService;
  7 +
  8 + it("emits events for the known events", (done) => {
  9 + let event = "Event1";
  10 +
  11 + let eventListener = () => {
  12 + };
  13 + // creates the events hub service which known the event "Event1"
  14 + eventsHubService = new EventsHubService([
  15 + event
  16 + ]);
  17 + // subscribe to the event passing the done Function as the eventListener
  18 + // if the event emits works the done function is called and the
  19 + // test will pass
  20 + eventsHubService.subscribeToEvent<any>(event, done);
  21 + // emits the event
  22 + eventsHubService.emitEvent(event, null);
  23 + });
  24 +
  25 + it("throws error when trying to emit an unknow event", () => {
  26 + let eventListener = () => {
  27 + };
  28 + // creates the events hub service which known the event "Event1"
  29 + eventsHubService = new EventsHubService([
  30 + 'Event1'
  31 + ]);
  32 +
  33 + // emits the event
  34 + expect(
  35 + () => { eventsHubService.emitEvent('NotKnownEvent', null); }
  36 + ).toThrowError('Unknown event named NotKnownEvent');
  37 + });
  38 +
  39 + it("throws error when trying to subscribe to an unknow event", () => {
  40 + let eventListener = () => {
  41 + };
  42 + // creates the events hub service which known the event "Event1"
  43 + eventsHubService = new EventsHubService([
  44 + 'Event1'
  45 + ]);
  46 +
  47 + // emits the event
  48 + expect(
  49 + () => { eventsHubService.subscribeToEvent<void>('NotKnownEvent', () => {}); }
  50 + ).toThrowError('Unknown event named NotKnownEvent');
  51 + });
  52 +});
0 53 \ No newline at end of file
... ...
src/app/shared/services/events-hub.service.ts 0 → 100644
... ... @@ -0,0 +1,41 @@
  1 +import { Injectable, Inject, OpaqueToken, EventEmitter } from 'ng-forward';
  2 +
  3 +export const EVENTS_HUB_KNOWN_LIST = new OpaqueToken('EVENTS_HUB_KNOWN_LIST');
  4 +
  5 +@Injectable()
  6 +@Inject(EVENTS_HUB_KNOWN_LIST)
  7 +export class EventsHubService {
  8 +
  9 + private emitters: Map<string, EventEmitter<any>>;
  10 +
  11 + constructor(private knownEvents: string[]) {
  12 + this.emitters = new Map<string, EventEmitter<any>>();
  13 + this.setupEmitters();
  14 + }
  15 +
  16 + emitEvent(eventType: string, payload?: any) {
  17 + this.checkKnownEvent(eventType);
  18 + let event = this.emitters.get(eventType);
  19 + if ( event ) this.emitters.get(eventType).next(payload);
  20 + }
  21 +
  22 + subscribeToEvent<T>(eventType: string, generatorOrNext?: ((p?: T) => void), error?: any, complete?: any) {
  23 + this.checkKnownEvent(eventType);
  24 + let event = this.emitters.get(eventType);
  25 + if (event) event.subscribe(generatorOrNext, error, complete);
  26 + }
  27 +
  28 + private setupEmitters() {
  29 + for (let i: number = 0; i < this.knownEvents.length; i++) {
  30 + this.emitters.set(this.knownEvents[i], new EventEmitter<any>());
  31 + }
  32 + }
  33 +
  34 + private checkKnownEvent(eventType: string) {
  35 + if (!this.emitters.has(eventType)) {
  36 + throw new Error('Unknown event named ' + eventType.toString());
  37 + }
  38 + }
  39 +
  40 +
  41 +}
0 42 \ No newline at end of file
... ...