1 import {HttpError} from "./http";
3 export class EventManager {
4 protected listeners: Record<string, ((data: any) => void)[]> = {};
5 protected stack: {name: string, data: {}}[] = [];
8 * Emit a custom event for any handlers to pick-up.
10 emit(eventName: string, eventData: {} = {}): void {
11 this.stack.push({name: eventName, data: eventData});
13 const listenersToRun = this.listeners[eventName] || [];
14 for (const listener of listenersToRun) {
20 * Listen to a custom event and run the given callback when that event occurs.
22 listen<T>(eventName: string, callback: (data: T) => void): void {
23 if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = [];
24 this.listeners[eventName].push(callback);
28 * Remove an event listener which is using the given callback for the given event name.
30 remove(eventName: string, callback: Function): void {
31 const listeners = this.listeners[eventName] || [];
32 const index = listeners.indexOf(callback);
34 listeners.splice(index, 1);
39 * Emit an event for public use.
40 * Sends the event via the native DOM event handling system.
42 emitPublic(targetElement: Element, eventName: string, eventData: {}): void {
43 const event = new CustomEvent(eventName, {
47 targetElement.dispatchEvent(event);
51 * Emit a success event with the provided message.
53 success(message: string): void {
54 this.emit('success', message);
58 * Emit an error event with the provided message.
60 error(message: string): void {
61 this.emit('error', message);
65 * Notify of standard server-provided validation errors.
67 showValidationErrors(responseErr: {status?: number, data?: object}): void {
68 if (!responseErr.status) return;
69 if (responseErr.status === 422 && responseErr.data) {
70 const message = Object.values(responseErr.data).flat().join('\n');
76 * Notify standard server-provided error messages.
78 showResponseError(responseErr: {status?: number, data?: Record<any, any>}|HttpError): void {
79 if (!responseErr.status) return;
80 if (responseErr.status >= 400 && typeof responseErr.data === 'object' && responseErr.data.message) {
81 this.error(responseErr.data.message);