]> BookStack Code Mirror - bookstack/blob - resources/js/services/events.js
Added tests and translations for dark-mode components
[bookstack] / resources / js / services / events.js
1 /**
2  * Simple global events manager
3  */
4 class Events {
5     constructor() {
6         this.listeners = {};
7         this.stack = [];
8     }
9
10     /**
11      * Emit a custom event for any handlers to pick-up.
12      * @param {String} eventName
13      * @param {*} eventData
14      * @returns {Events}
15      */
16     emit(eventName, eventData) {
17         this.stack.push({name: eventName, data: eventData});
18         if (typeof this.listeners[eventName] === 'undefined') return this;
19         let eventsToStart = this.listeners[eventName];
20         for (let i = 0; i < eventsToStart.length; i++) {
21             let event = eventsToStart[i];
22             event(eventData);
23         }
24         return this;
25     }
26
27     /**
28      * Listen to a custom event and run the given callback when that event occurs.
29      * @param {String} eventName
30      * @param {Function} callback
31      * @returns {Events}
32      */
33     listen(eventName, callback) {
34         if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = [];
35         this.listeners[eventName].push(callback);
36         return this;
37     }
38
39     /**
40      * Emit an event for public use.
41      * Sends the event via the native DOM event handling system.
42      * @param {Element} targetElement
43      * @param {String} eventName
44      * @param {Object} eventData
45      */
46     emitPublic(targetElement, eventName, eventData) {
47         const event = new CustomEvent(eventName, {
48             detail: eventData,
49             bubbles: true
50         });
51         targetElement.dispatchEvent(event);
52     }
53 }
54
55 export default Events;