X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/ddb7f33868ea499ab8f48a7062f145e8c0fbe02f..refs/pull/2227/head:/resources/js/services/events.js diff --git a/resources/js/services/events.js b/resources/js/services/events.js index fa3ed7fdf..6668014e7 100644 --- a/resources/js/services/events.js +++ b/resources/js/services/events.js @@ -1,55 +1,66 @@ +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 a custom event for any handlers to pick-up. - * @param {String} eventName - * @param {*} eventData - * @returns {Events} - */ - 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 to a custom event and run the given callback when that event occurs. - * @param {String} eventName - * @param {Function} callback - * @returns {Events} - */ - 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); +} - /** - * 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 - */ - 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