X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/634b0aaa07097f4a413a85e7c172176dda8e42e1..refs/pull/5721/head:/resources/js/services/events.ts diff --git a/resources/js/services/events.ts b/resources/js/services/events.ts index c251ee21b..6045d51f8 100644 --- a/resources/js/services/events.ts +++ b/resources/js/services/events.ts @@ -1,11 +1,15 @@ +import {HttpError} from "./http"; + +type Listener = (data: any) => void; + export class EventManager { - protected listeners: Record void)[]> = {}; + protected listeners: Record = {}; protected stack: {name: string, data: {}}[] = []; /** * Emit a custom event for any handlers to pick-up. */ - emit(eventName: string, eventData: {}): void { + emit(eventName: string, eventData: {} = {}): void { this.stack.push({name: eventName, data: eventData}); const listenersToRun = this.listeners[eventName] || []; @@ -17,11 +21,22 @@ export class EventManager { /** * Listen to a custom event and run the given callback when that event occurs. */ - listen(eventName: string, callback: (data: {}) => void): void { + listen(eventName: string, callback: (data: T) => void): void { if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = []; this.listeners[eventName].push(callback); } + /** + * Remove an event listener which is using the given callback for the given event name. + */ + remove(eventName: string, callback: Listener): void { + const listeners = this.listeners[eventName] || []; + const index = listeners.indexOf(callback); + if (index !== -1) { + listeners.splice(index, 1); + } + } + /** * Emit an event for public use. * Sends the event via the native DOM event handling system. @@ -51,8 +66,7 @@ export class EventManager { /** * Notify of standard server-provided validation errors. */ - showValidationErrors(responseErr: {status?: number, data?: object}): void { - if (!responseErr.status) return; + showValidationErrors(responseErr: HttpError): void { if (responseErr.status === 422 && responseErr.data) { const message = Object.values(responseErr.data).flat().join('\n'); this.error(message); @@ -62,9 +76,9 @@ export class EventManager { /** * Notify standard server-provided error messages. */ - showResponseError(responseErr: {status?: number, data?: {message?: string}}): void { + showResponseError(responseErr: {status?: number, data?: Record}|HttpError): void { if (!responseErr.status) return; - if (responseErr.status >= 400 && responseErr.data && responseErr.data.message) { + if (responseErr.status >= 400 && typeof responseErr.data === 'object' && responseErr.data.message) { this.error(responseErr.data.message); } }