]> BookStack Code Mirror - bookstack/blob - resources/js/services/events.ts
Lexical: Started converting drawio to TS
[bookstack] / resources / js / services / events.ts
1 export class EventManager {
2     protected listeners: Record<string, ((data: {}) => void)[]> = {};
3     protected stack: {name: string, data: {}}[] = [];
4
5     /**
6      * Emit a custom event for any handlers to pick-up.
7      */
8     emit(eventName: string, eventData: {}): void {
9         this.stack.push({name: eventName, data: eventData});
10
11         const listenersToRun = this.listeners[eventName] || [];
12         for (const listener of listenersToRun) {
13             listener(eventData);
14         }
15     }
16
17     /**
18      * Listen to a custom event and run the given callback when that event occurs.
19      */
20     listen(eventName: string, callback: (data: {}) => void): void {
21         if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = [];
22         this.listeners[eventName].push(callback);
23     }
24
25     /**
26      * Emit an event for public use.
27      * Sends the event via the native DOM event handling system.
28      */
29     emitPublic(targetElement: Element, eventName: string, eventData: {}): void {
30         const event = new CustomEvent(eventName, {
31             detail: eventData,
32             bubbles: true,
33         });
34         targetElement.dispatchEvent(event);
35     }
36
37     /**
38      * Emit a success event with the provided message.
39      */
40     success(message: string): void {
41         this.emit('success', message);
42     }
43
44     /**
45      * Emit an error event with the provided message.
46      */
47     error(message: string): void {
48         this.emit('error', message);
49     }
50
51     /**
52      * Notify of standard server-provided validation errors.
53      */
54     showValidationErrors(responseErr: {status?: number, data?: object}): void {
55         if (!responseErr.status) return;
56         if (responseErr.status === 422 && responseErr.data) {
57             const message = Object.values(responseErr.data).flat().join('\n');
58             this.error(message);
59         }
60     }
61
62     /**
63      * Notify standard server-provided error messages.
64      */
65     showResponseError(responseErr: {status?: number, data?: {message?: string}}): void {
66         if (!responseErr.status) return;
67         if (responseErr.status >= 400 && responseErr.data && responseErr.data.message) {
68             this.error(responseErr.data.message);
69         }
70     }
71 }