+const listeners = {};
+const stack = [];
+
/**
- * Simple global events manager
+ * Emit a custom event for any handlers to pick-up.
+ * @param {String} eventName
+ * @param {*} eventData
*/
-class Events {
- constructor() {
- this.listeners = {};
- this.stack = [];
+function emit(eventName, eventData) {
+ stack.push({name: eventName, data: eventData});
+ if (typeof listeners[eventName] === 'undefined') return this;
+ let eventsToStart = listeners[eventName];
+ for (let i = 0; i < eventsToStart.length; i++) {
+ let event = eventsToStart[i];
+ event(eventData);
}
+}
- emit(eventName, eventData) {
- this.stack.push({name: eventName, data: eventData});
- if (typeof this.listeners[eventName] === 'undefined') return this;
- let eventsToStart = this.listeners[eventName];
- for (let i = 0; i < eventsToStart.length; i++) {
- let event = eventsToStart[i];
- event(eventData);
- }
- return this;
- }
+/**
+ * Listen to a custom event and run the given callback when that event occurs.
+ * @param {String} eventName
+ * @param {Function} callback
+ * @returns {Events}
+ */
+function listen(eventName, callback) {
+ if (typeof listeners[eventName] === 'undefined') listeners[eventName] = [];
+ listeners[eventName].push(callback);
+}
- listen(eventName, callback) {
- if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = [];
- this.listeners[eventName].push(callback);
- return this;
+/**
+ * Emit an event for public use.
+ * Sends the event via the native DOM event handling system.
+ * @param {Element} targetElement
+ * @param {String} eventName
+ * @param {Object} eventData
+ */
+function emitPublic(targetElement, eventName, eventData) {
+ const event = new CustomEvent(eventName, {
+ detail: eventData,
+ bubbles: true
+ });
+ targetElement.dispatchEvent(event);
+}
+
+/**
+ * Notify of a http error.
+ * Check for standard scenarios such as validation errors and
+ * formats an error notification accordingly.
+ * @param {Error} error
+ */
+function showValidationErrors(error) {
+ if (!error.status) return;
+ if (error.status === 422 && error.data) {
+ const message = Object.values(error.data).flat().join('\n');
+ emit('error', message);
}
}
-export default Events;
\ No newline at end of file
+export default {
+ emit,
+ emitPublic,
+ listen,
+ success: (msg) => emit('success', msg),
+ error: (msg) => emit('error', msg),
+ showValidationErrors,
+}
\ No newline at end of file