mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-12-14 15:13:37 +08:00
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
|
export class EventManager {
|
||
|
protected listeners: Record<string, ((data: {}) => void)[]> = {};
|
||
|
protected stack: {name: string, data: {}}[] = [];
|
||
|
|
||
|
/**
|
||
|
* Emit a custom event for any handlers to pick-up.
|
||
|
*/
|
||
|
emit(eventName: string, eventData: {}): void {
|
||
|
this.stack.push({name: eventName, data: eventData});
|
||
|
|
||
|
const listenersToRun = this.listeners[eventName] || [];
|
||
|
for (const listener of listenersToRun) {
|
||
|
listener(eventData);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Listen to a custom event and run the given callback when that event occurs.
|
||
|
*/
|
||
|
listen(eventName: string, callback: (data: {}) => void): void {
|
||
|
if (typeof this.listeners[eventName] === 'undefined') this.listeners[eventName] = [];
|
||
|
this.listeners[eventName].push(callback);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emit an event for public use.
|
||
|
* Sends the event via the native DOM event handling system.
|
||
|
*/
|
||
|
emitPublic(targetElement: Element, eventName: string, eventData: {}): void {
|
||
|
const event = new CustomEvent(eventName, {
|
||
|
detail: eventData,
|
||
|
bubbles: true,
|
||
|
});
|
||
|
targetElement.dispatchEvent(event);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emit a success event with the provided message.
|
||
|
*/
|
||
|
success(message: string): void {
|
||
|
this.emit('success', message);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Emit an error event with the provided message.
|
||
|
*/
|
||
|
error(message: string): void {
|
||
|
this.emit('error', message);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Notify of standard server-provided validation errors.
|
||
|
*/
|
||
|
showValidationErrors(responseErr: {status?: number, data?: object}): void {
|
||
|
if (!responseErr.status) return;
|
||
|
if (responseErr.status === 422 && responseErr.data) {
|
||
|
const message = Object.values(responseErr.data).flat().join('\n');
|
||
|
this.error(message);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Notify standard server-provided error messages.
|
||
|
*/
|
||
|
showResponseError(responseErr: {status?: number, data?: {message?: string}}): void {
|
||
|
if (!responseErr.status) return;
|
||
|
if (responseErr.status >= 400 && responseErr.data && responseErr.data.message) {
|
||
|
this.error(responseErr.data.message);
|
||
|
}
|
||
|
}
|
||
|
}
|