66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| const listeners = {};
 | |
| const stack = [];
 | |
| 
 | |
| /**
 | |
|  * Emit a custom event for any handlers to pick-up.
 | |
|  * @param {String} eventName
 | |
|  * @param {*} eventData
 | |
|  */
 | |
| 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);
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 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);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 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 {
 | |
|     emit,
 | |
|     emitPublic,
 | |
|     listen,
 | |
|     success: (msg) => emit('success', msg),
 | |
|     error: (msg) => emit('error', msg),
 | |
|     showValidationErrors,
 | |
| } |