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;
     });
   }

Reply via email to