X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/ddb7f33868ea499ab8f48a7062f145e8c0fbe02f..refs/pull/4467/head:/resources/js/services/events.js diff --git a/resources/js/services/events.js b/resources/js/services/events.js index fa3ed7fdf..761305793 100644 --- a/resources/js/services/events.js +++ b/resources/js/services/events.js @@ -1,55 +1,81 @@ +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 = []; - } +export function emit(eventName, eventData) { + stack.push({name: eventName, data: 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; + const listenersToRun = listeners[eventName] || []; + for (const listener of listenersToRun) { + listener(eventData); } +} - /** - * 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; - } +/** + * Listen to a custom event and run the given callback when that event occurs. + * @param {String} eventName + * @param {Function} callback + * @returns {Events} + */ +export function listen(eventName, callback) { + if (typeof listeners[eventName] === 'undefined') listeners[eventName] = []; + listeners[eventName].push(callback); +} - /** - * 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); +/** + * 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 + */ +export function emitPublic(targetElement, eventName, eventData) { + const event = new CustomEvent(eventName, { + detail: eventData, + bubbles: true, + }); + targetElement.dispatchEvent(event); +} + +/** + * Emit a success event with the provided message. + * @param {String} message + */ +export function success(message) { + emit('success', message); +} + +/** + * Emit an error event with the provided message. + * @param {String} message + */ +export function error(message) { + emit('error', message); +} + +/** + * Notify of standard server-provided validation errors. + * @param {Object} responseErr + */ +export function showValidationErrors(responseErr) { + if (!responseErr.status) return; + if (responseErr.status === 422 && responseErr.data) { + const message = Object.values(responseErr.data).flat().join('\n'); + error(message); } } -export default Events; \ No newline at end of file +/** + * Notify standard server-provided error messages. + * @param {Object} responseErr + */ +export function showResponseError(responseErr) { + if (!responseErr.status) return; + if (responseErr.status >= 400 && responseErr.data && responseErr.data.message) { + error(responseErr.data.message); + } +}