diff --git a/package.json b/package.json index 05b6457357..5405643f03 100644 --- a/package.json +++ b/package.json @@ -354,6 +354,7 @@ "ts-loader": "^7.0.5", "ts-node": "^8.10.2", "type-fest": "^1.0.2", + "typed-emitter": "^1.3.1", "typedoc": "0.17.0-3", "typedoc-plugin-markdown": "^2.4.0", "typeface-roboto": "^0.0.75", diff --git a/src/common/catalog-entities/kubernetes-cluster.ts b/src/common/catalog-entities/kubernetes-cluster.ts index 43fee50eaf..9014c71aa1 100644 --- a/src/common/catalog-entities/kubernetes-cluster.ts +++ b/src/common/catalog-entities/kubernetes-cluster.ts @@ -139,7 +139,7 @@ export class KubernetesCluster extends CatalogEntity(this); - if (category) category.emit("contextMenuOpen", this, context); + if (category) category.emit("onContextMenuOpen", this, context); } } diff --git a/src/common/catalog/catalog-entity.ts b/src/common/catalog/catalog-entity.ts index 51660a3d3d..6262e3df54 100644 --- a/src/common/catalog/catalog-entity.ts +++ b/src/common/catalog/catalog-entity.ts @@ -19,7 +19,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { EventEmitter } from "events"; +import EventEmitter from "events"; +import TypedEmitter from "typed-emitter"; import { observable } from "mobx"; type ExtractEntityMetadataType = Entity extends CatalogEntity ? Metadata : never; @@ -47,7 +48,13 @@ export interface CatalogCategorySpec { }; } -export abstract class CatalogCategory extends EventEmitter { +export interface CatalogCategoryEvents { + onLoad: () => void; + onCatalogAddMenu: (context: CatalogEntityAddMenuContext) => void; + onContextMenuOpen: (entity: CatalogEntity, context: CatalogEntityContextMenuContext) => void; +} + +export abstract class CatalogCategory extends (EventEmitter as new () => TypedEmitter) { abstract readonly apiVersion: string; abstract readonly kind: string; abstract metadata: { @@ -59,6 +66,18 @@ export abstract class CatalogCategory extends EventEmitter { public getId(): string { return `${this.spec.group}/${this.spec.names.kind}`; } + + public async onLoad(): Promise { + for( const listener of this.listeners("onLoad")) { + await listener(); + } + } + + public async onCatalogAddMenu(context: CatalogEntityAddMenuContext): Promise { + for( const listener of this.listeners("onCatalogAddMenu")) { + await listener(context); + } + } } export interface CatalogEntityMetadata { diff --git a/src/renderer/components/+catalog/catalog-add-button.tsx b/src/renderer/components/+catalog/catalog-add-button.tsx index 5329702832..0f2248a9f5 100644 --- a/src/renderer/components/+catalog/catalog-add-button.tsx +++ b/src/renderer/components/+catalog/catalog-add-button.tsx @@ -50,7 +50,7 @@ export class CatalogAddButton extends React.Component { menuItems: this.menuItems }; - category.emit("onCatalogAddMenu", context); + category.onCatalogAddMenu(context); } }, { fireImmediately: true }) ]); diff --git a/src/renderer/components/+catalog/catalog-entity.store.ts b/src/renderer/components/+catalog/catalog-entity.store.ts index f53515efca..50e10b772b 100644 --- a/src/renderer/components/+catalog/catalog-entity.store.ts +++ b/src/renderer/components/+catalog/catalog-entity.store.ts @@ -24,7 +24,7 @@ import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; import { CatalogEntity, CatalogEntityActionContext } from "../../api/catalog-entity"; import { ItemObject, ItemStore } from "../../item.store"; import { autobind } from "../../utils"; -import { CatalogCategory } from "../../../common/catalog"; +import { CatalogCategory, catalogCategoryRegistry } from "../../../common/catalog"; export class CatalogEntityItem implements ItemObject { constructor(public entity: CatalogEntity) {} @@ -98,14 +98,22 @@ export class CatalogEntityStore extends ItemStore { watch() { const disposers: IReactionDisposer[] = [ - reaction(() => this.entities, () => this.loadAll()), + reaction(() => this.entities, async () => await this.loadAll()), reaction(() => this.activeCategory, () => this.loadAll(), { delay: 100}) ]; return () => disposers.forEach((dispose) => dispose()); } - loadAll() { + async loadAll() { + if (this.activeCategory) { + await this.activeCategory.onLoad(); + } else { + for (const category of catalogCategoryRegistry.items) { + await category.onLoad(); + } + } + return this.loadItems(() => this.entities); } } diff --git a/yarn.lock b/yarn.lock index 2be3cbfbcb..964ae48b40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13807,6 +13807,11 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-emitter@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/typed-emitter/-/typed-emitter-1.3.1.tgz#c98d71551a99d5f08ba9085ee44b8fc9b2357502" + integrity sha512-2h7utWyXgd2R2u2IuL8B4yu1gqMxbgUj2VS/MGVbFhEVQNJKXoQQoS5CBMh+eW31zFeSmDfEQ3qQf4xy5SlPVQ== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"