@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
51 lines (50 loc) • 1.26 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
export class EventDispatcher {
constructor() {
_defineProperty(this, "listeners", {});
}
on(event, cb) {
if (!this.listeners[event]) {
this.listeners[event] = new Set();
}
this.listeners[event].add(cb);
}
has(event, cb) {
if (!this.listeners[event]) {
return false;
}
return this.listeners[event].has(cb);
}
off(event, cb) {
if (!this.listeners[event]) {
return;
}
if (this.listeners[event].has(cb)) {
this.listeners[event].delete(cb);
}
}
emit(event, data) {
if (!this.listeners[event]) {
return;
}
this.listeners[event].forEach(cb => cb(data));
}
destroy() {
this.listeners = {};
}
}
function getEventFromEventName(eventName) {
return typeof eventName === 'string' ? eventName : eventName.key;
}
/**
* Creates a dispatch function that can be called inside ProseMirror Plugin
* to notify listeners about that plugin's state change.
*/
export function createDispatch(eventDispatcher) {
return (eventName, data) => {
if (!eventName) {
throw new Error('event name is required!');
}
eventDispatcher.emit(getEventFromEventName(eventName), data);
};
}