64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
import { Observable, Observer, Subscription } from 'rxjs';
|
|
import { filter, share } from 'rxjs/operators';
|
|
|
|
export class EventWithContent<T> {
|
|
constructor(public name: string, public content: T) {}
|
|
}
|
|
|
|
/**
|
|
* An utility class to manage RX events
|
|
*/
|
|
@Injectable({
|
|
providedIn: 'root',
|
|
})
|
|
export class EventManager {
|
|
observable: Observable<EventWithContent<unknown> | string>;
|
|
observer?: Observer<EventWithContent<unknown> | string>;
|
|
|
|
constructor() {
|
|
this.observable = new Observable((observer: Observer<EventWithContent<unknown> | string>) => {
|
|
this.observer = observer;
|
|
}).pipe(share());
|
|
}
|
|
|
|
/**
|
|
* Method to broadcast the event to observer
|
|
*/
|
|
broadcast(event: EventWithContent<unknown> | string): void {
|
|
if (this.observer) {
|
|
this.observer.next(event);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Method to subscribe to an event with callback
|
|
* @param eventNames Single event name or array of event names to what subscribe
|
|
* @param callback Callback to run when the event occurs
|
|
*/
|
|
subscribe(eventNames: string | string[], callback: (event: EventWithContent<unknown> | string) => void): Subscription {
|
|
if (typeof eventNames === 'string') {
|
|
eventNames = [eventNames];
|
|
}
|
|
return this.observable
|
|
.pipe(
|
|
filter((event: EventWithContent<unknown> | string) => {
|
|
for (const eventName of eventNames) {
|
|
if ((typeof event === 'string' && event === eventName) || (typeof event !== 'string' && event.name === eventName)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
})
|
|
)
|
|
.subscribe(callback);
|
|
}
|
|
|
|
/**
|
|
* Method to unsubscribe the subscription
|
|
*/
|
|
destroy(subscriber: Subscription): void {
|
|
subscriber.unsubscribe();
|
|
}
|
|
}
|