This is an automated email from the ASF dual-hosted git repository. robin0716 pushed a commit to branch dev in repository https://gitbox.apache.org/repos/asf/incubator-answer.git
commit 49033820568b81fdb1d860fa631417f451b0ff4c Author: Ourai Lin <[email protected]> AuthorDate: Sun Oct 20 11:40:47 2024 +0800 refactor(ui): extract event logic of plugin kit out --- ui/src/utils/pluginKit/emitter.ts | 34 ++++++++++++++++++++++++++++++++++ ui/src/utils/pluginKit/index.ts | 37 ++++--------------------------------- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/ui/src/utils/pluginKit/emitter.ts b/ui/src/utils/pluginKit/emitter.ts new file mode 100644 index 00000000..eee427b6 --- /dev/null +++ b/ui/src/utils/pluginKit/emitter.ts @@ -0,0 +1,34 @@ +type EventName = string; +type EventHandler = () => void; + +class SimpleEventEmitter { + events: Record<EventName, EventHandler[]> = {}; + + on(name: EventName, handler: EventHandler) { + if (!this.events[name]) { + this.events[name] = []; + } + + this.events[name].push(handler); + } + + off(name: EventName, handler?: EventHandler) { + const handlers = this.events[name]; + + if (!handlers || handlers.length === 0) { + return; + } + + if (handler) { + this.events[name] = handlers.filter((func) => func !== handler); + } else { + delete this.events[name]; + } + } + + emit(name: EventName) { + (this.events[name] || []).forEach((handler) => handler()); + } +} + +export default SimpleEventEmitter; diff --git a/ui/src/utils/pluginKit/index.ts b/ui/src/utils/pluginKit/index.ts index 43b0d691..39d1edb5 100644 --- a/ui/src/utils/pluginKit/index.ts +++ b/ui/src/utils/pluginKit/index.ts @@ -29,6 +29,7 @@ import request from '@/utils/request'; import { initI18nResource } from './utils'; import { Plugin, PluginInfo, PluginType } from './interface'; +import SimpleEventEmitter from './emitter'; /** * This information is to be defined for all components. @@ -42,46 +43,16 @@ import { Plugin, PluginInfo, PluginType } from './interface'; * @field description: Plugin description, optionally configurable. Usually read from the `i18n` file */ -type EventName = string; -type EventHandler = () => void; - -class Plugins { +class Plugins extends SimpleEventEmitter { plugins: Plugin[] = []; registeredPlugins: Type.ActivatedPlugin[] = []; - events: Record<EventName, EventHandler[]> = {}; - constructor() { + super(); this.init(); } - on(name: EventName, handler: EventHandler) { - if (!this.events[name]) { - this.events[name] = []; - } - - this.events[name].push(handler); - } - - off(name: EventName, handler?: EventHandler) { - const handlers = this.events[name]; - - if (!handlers || handlers.length === 0) { - return; - } - - if (handler) { - this.events[name] = handlers.filter((func) => func !== handler); - } else { - delete this.events[name]; - } - } - - trigger(name: EventName) { - (this.events[name] || []).forEach((handler) => handler()); - } - init() { this.registerBuiltin(); @@ -134,7 +105,7 @@ class Plugins { .filter((p) => p); return Promise.all(plugins.map((p) => p())).then((resolvedPlugins) => { resolvedPlugins.forEach((plugin) => this.register(plugin)); - this.trigger('registered'); + this.emit('registered'); return true; }); }
