From 1e4736a4b83452ca9c07d919dfb3afb0f3c35bc0 Mon Sep 17 00:00:00 2001 From: Abner Oliveira Date: Thu, 14 Jul 2016 10:44:24 -0300 Subject: [PATCH] added events-hub service --- src/app/events-hub-known-events.constants.ts | 5 +++++ src/app/index.ts | 13 +++++++++++-- src/app/shared/services/events-hub.service.spec.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/app/shared/services/events-hub.service.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 src/app/events-hub-known-events.constants.ts create mode 100644 src/app/shared/services/events-hub.service.spec.ts create mode 100644 src/app/shared/services/events-hub.service.ts diff --git a/src/app/events-hub-known-events.constants.ts b/src/app/events-hub-known-events.constants.ts new file mode 100644 index 0000000..dc694e0 --- /dev/null +++ b/src/app/events-hub-known-events.constants.ts @@ -0,0 +1,5 @@ +export const EVENTS_HUB_KNOWN_EVENTS_NAMES = { + IMAGE_PROFILE_UPDATED: 'IMAGE_PROFILE_UPDATED', + PROFILE_INFO_UPDATED: 'IMAGE_PROFILE_UPDATED', + ARTICLE_UPDATED: 'ARTICLE_UPDATED' +}; diff --git a/src/app/index.ts b/src/app/index.ts index ec50e06..27f7211 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -1,4 +1,4 @@ -import {bootstrap} from "ng-forward"; +import {bootstrap, provide} from "ng-forward"; import {noosferoModuleConfig} from "./index.config"; import {noosferoAngularRunBlock} from "./index.run"; import {MainComponent} from "./main/main.component"; @@ -22,4 +22,13 @@ angular.module('noosfero.init', ['noosfero.templates.app', 'noosfero.templates.p run(noosferoAngularRunBlock). constant("moment", moment). constant("AuthEvents", AuthEvents); -bootstrap(MainComponent); + + +import { EVENTS_HUB_KNOWN_LIST } from './shared/services/events-hub.service'; +import { EVENTS_HUB_KNOWN_EVENTS_NAMES } from './events-hub-known-events.constants'; + +bootstrap(MainComponent, + [ + provide(EVENTS_HUB_KNOWN_LIST, { useConstant: Object.getOwnPropertyNames(EVENTS_HUB_KNOWN_EVENTS_NAMES) }) + ] +); diff --git a/src/app/shared/services/events-hub.service.spec.ts b/src/app/shared/services/events-hub.service.spec.ts new file mode 100644 index 0000000..f33564b --- /dev/null +++ b/src/app/shared/services/events-hub.service.spec.ts @@ -0,0 +1,52 @@ +import { OpaqueToken } from 'ng-forward'; +import { EventsHubService } from './events-hub.service'; + + +describe("EventsHubService", () => { + let eventsHubService: EventsHubService; + + it("emits events for the known events", (done) => { + let event = "Event1"; + + let eventListener = () => { + }; + // creates the events hub service which known the event "Event1" + eventsHubService = new EventsHubService([ + event + ]); + // subscribe to the event passing the done Function as the eventListener + // if the event emits works the done function is called and the + // test will pass + eventsHubService.subscribeToEvent(event, done); + // emits the event + eventsHubService.emitEvent(event, null); + }); + + it("throws error when trying to emit an unknow event", () => { + let eventListener = () => { + }; + // creates the events hub service which known the event "Event1" + eventsHubService = new EventsHubService([ + 'Event1' + ]); + + // emits the event + expect( + () => { eventsHubService.emitEvent('NotKnownEvent', null); } + ).toThrowError('Unknown event named NotKnownEvent'); + }); + + it("throws error when trying to subscribe to an unknow event", () => { + let eventListener = () => { + }; + // creates the events hub service which known the event "Event1" + eventsHubService = new EventsHubService([ + 'Event1' + ]); + + // emits the event + expect( + () => { eventsHubService.subscribeToEvent('NotKnownEvent', () => {}); } + ).toThrowError('Unknown event named NotKnownEvent'); + }); +}); \ No newline at end of file diff --git a/src/app/shared/services/events-hub.service.ts b/src/app/shared/services/events-hub.service.ts new file mode 100644 index 0000000..179020a --- /dev/null +++ b/src/app/shared/services/events-hub.service.ts @@ -0,0 +1,41 @@ +import { Injectable, Inject, OpaqueToken, EventEmitter } from 'ng-forward'; + +export const EVENTS_HUB_KNOWN_LIST = new OpaqueToken('EVENTS_HUB_KNOWN_LIST'); + +@Injectable() +@Inject(EVENTS_HUB_KNOWN_LIST) +export class EventsHubService { + + private emitters: Map>; + + constructor(private knownEvents: string[]) { + this.emitters = new Map>(); + this.setupEmitters(); + } + + emitEvent(eventType: string, payload?: any) { + this.checkKnownEvent(eventType); + let event = this.emitters.get(eventType); + if ( event ) this.emitters.get(eventType).next(payload); + } + + subscribeToEvent(eventType: string, generatorOrNext?: ((p?: T) => void), error?: any, complete?: any) { + this.checkKnownEvent(eventType); + let event = this.emitters.get(eventType); + if (event) event.subscribe(generatorOrNext, error, complete); + } + + private setupEmitters() { + for (let i: number = 0; i < this.knownEvents.length; i++) { + this.emitters.set(this.knownEvents[i], new EventEmitter()); + } + } + + private checkKnownEvent(eventType: string) { + if (!this.emitters.has(eventType)) { + throw new Error('Unknown event named ' + eventType.toString()); + } + } + + +} \ No newline at end of file -- libgit2 0.21.2