diff --git a/src/common/catalog/catalog-category-registry.ts b/src/common/catalog/catalog-category-registry.ts deleted file mode 100644 index d456f38f06..0000000000 --- a/src/common/catalog/catalog-category-registry.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { asLegacyGlobalForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; -import catalogCategoryRegistryInjectable from "./category-registry.injectable"; - -/** - * @deprecated use `di.inject(catalogCategoryRegistryInjectable)` instead - */ -export const catalogCategoryRegistry = asLegacyGlobalForExtensionApi(catalogCategoryRegistryInjectable); diff --git a/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts b/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts new file mode 100644 index 0000000000..9524c84e26 --- /dev/null +++ b/src/renderer/before-frame-starts/runnables/setup-kubernetes-cluster-context-menu-open.injectable.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import catalogCategoryRegistryInjectable from "../../../common/catalog/category-registry.injectable"; +import getClusterByIdInjectable from "../../../common/cluster-store/get-by-id.injectable"; +import readFileInjectable from "../../../common/fs/read-file.injectable"; +import { loadConfigFromString } from "../../../common/kube-helpers"; +import loggerInjectable from "../../../common/logger.injectable"; +import openDeleteClusterDialogInjectable from "../../components/delete-cluster-dialog/open.injectable"; +import { beforeFrameStartsInjectionToken } from "../tokens"; + +const setupKubernetesClusterContextMenuOpenInjectable = getInjectable({ + id: "setup-kubernetes-cluster-context-menu-open", + instantiate: (di) => { + const catalogCategoryRegistry = di.inject(catalogCategoryRegistryInjectable); + const openDeleteClusterDialog = di.inject(openDeleteClusterDialogInjectable); + const readFile = di.inject(readFileInjectable); + const getClusterById = di.inject(getClusterByIdInjectable); + const logger = di.inject(loggerInjectable); + + return { + id: "setup-kubernetes-cluster-context-menu-open", + run: () => { + catalogCategoryRegistry + .getForGroupKind("entity.k8slens.dev", "KubernetesCluster") + ?.on("contextMenuOpen", (entity, context) => { + if (entity.metadata?.source == "local") { + context.menuItems.push({ + title: "Remove", + icon: "delete", + onClick: async () => { + const clusterId = entity.getId(); + const cluster = getClusterById(entity.getId()); + + if (!cluster) { + return logger.warn("[KUBERNETES-CLUSTER]: cannot delete cluster, does not exist in store", { clusterId }); + } + + const result = loadConfigFromString(await readFile(cluster.kubeConfigPath)); + + if (result.error) { + logger.error("[KUBERNETES-CLUSTER]: failed to parse kubeconfig file", result.error); + } else { + openDeleteClusterDialog({ cluster, config: result.config }); + } + }, + }); + } + }); + }, + }; + }, + injectionToken: beforeFrameStartsInjectionToken, +}); + +export default setupKubernetesClusterContextMenuOpenInjectable; diff --git a/src/renderer/before-frame-starts/runnables/setup-weblink-context-menu-open.injectable.tsx b/src/renderer/before-frame-starts/runnables/setup-weblink-context-menu-open.injectable.tsx new file mode 100644 index 0000000000..5d7e0f5f12 --- /dev/null +++ b/src/renderer/before-frame-starts/runnables/setup-weblink-context-menu-open.injectable.tsx @@ -0,0 +1,36 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import React from "react"; +import catalogCategoryRegistryInjectable from "../../../common/catalog/category-registry.injectable"; +import { WeblinkAddCommand } from "../../components/catalog-entities/weblink-add-command"; +import commandOverlayInjectable from "../../components/command-palette/command-overlay.injectable"; +import { beforeFrameStartsInjectionToken } from "../tokens"; + +const setupWeblickContextMenuOpenInjectable = getInjectable({ + id: "setup-weblick-context-menu-open", + instantiate: (di) => { + const catalogCategoryRegistry = di.inject(catalogCategoryRegistryInjectable); + const commandOverlay = di.inject(commandOverlayInjectable); + + return { + id: "setup-weblick-context-menu-open", + run: () => { + catalogCategoryRegistry + .getForGroupKind("entity.k8slens.dev", "WebLink") + ?.on("catalogAddMenu", ctx => { + ctx.menuItems.push({ + title: "Add web link", + icon: "public", + onClick: () => commandOverlay.open(), + }); + }); + }, + }; + }, + injectionToken: beforeFrameStartsInjectionToken, +}); + +export default setupWeblickContextMenuOpenInjectable; diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index 7962a37e1c..a86143385c 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -24,12 +24,10 @@ import extensionInstallationStateStoreInjectable from "../extensions/extension-i import clusterStoreInjectable from "../common/cluster-store/cluster-store.injectable"; import initRootFrameInjectable from "./frames/root-frame/init-root-frame/init-root-frame.injectable"; import initClusterFrameInjectable from "./frames/cluster-frame/init-cluster-frame/init-cluster-frame.injectable"; -import commandOverlayInjectable from "./components/command-palette/command-overlay.injectable"; import { Router } from "react-router"; import historyInjectable from "./navigation/history.injectable"; import themeStoreInjectable from "./themes/store.injectable"; import hotbarStoreInjectable from "../common/hotbars/store.injectable"; -import openDeleteClusterDialogInjectable from "./components/delete-cluster-dialog/open.injectable"; import assert from "assert"; import startFrameInjectable from "./start-frame/start-frame.injectable"; import loggerInjectable from "../common/logger.injectable"; @@ -45,12 +43,6 @@ export async function bootstrap(di: DiContainer) { assert(rootElem, "#app MUST exist"); - logger.info(`${logPrefix} initializing Catalog`); - initializers.initCatalog({ - openCommandDialog: di.inject(commandOverlayInjectable).open, - openDeleteClusterDialog: di.inject(openDeleteClusterDialogInjectable), - }); - const extensionLoader = di.inject(extensionLoaderInjectable); logger.info(`${logPrefix} initializing IpcRendererListeners`); diff --git a/src/renderer/initializers/catalog.tsx b/src/renderer/initializers/catalog.tsx deleted file mode 100644 index 908c65a976..0000000000 --- a/src/renderer/initializers/catalog.tsx +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import React from "react"; -import fs from "fs"; -import "../../common/catalog-entities/kubernetes-cluster"; -import { catalogCategoryRegistry } from "../api/catalog-category-registry"; -import { WeblinkAddCommand } from "../components/catalog-entities/weblink-add-command"; -import { loadConfigFromString } from "../../common/kube-helpers"; -import type { OpenDeleteClusterDialog } from "../components/delete-cluster-dialog/open.injectable"; -import { asLegacyGlobalFunctionForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api"; -import getClusterByIdInjectable from "../../common/cluster-store/get-by-id.injectable"; - -const getClusterById = asLegacyGlobalFunctionForExtensionApi(getClusterByIdInjectable); - -async function onClusterDelete(clusterId: string, openDeleteClusterDialog: OpenDeleteClusterDialog) { - const cluster = getClusterById(clusterId); - - if (!cluster) { - return console.warn("[KUBERNETES-CLUSTER]: cannot delete cluster, does not exist in store", { clusterId }); - } - - const result = loadConfigFromString(await fs.promises.readFile(cluster.kubeConfigPath, "utf-8")); - - if (result.error) { - throw result.error; - } - - openDeleteClusterDialog({ cluster, config: result.config }); -} - -interface Dependencies { - openCommandDialog: (component: React.ReactElement) => void; - openDeleteClusterDialog: OpenDeleteClusterDialog; -} - -export function initCatalog({ openCommandDialog, openDeleteClusterDialog }: Dependencies) { - catalogCategoryRegistry - .getForGroupKind("entity.k8slens.dev", "WebLink") - ?.on("catalogAddMenu", ctx => { - ctx.menuItems.push({ - title: "Add web link", - icon: "public", - onClick: () => openCommandDialog(), - }); - }); - - catalogCategoryRegistry - .getForGroupKind("entity.k8slens.dev", "KubernetesCluster") - ?.on("contextMenuOpen", (entity, context) => { - if (entity.metadata?.source == "local") { - context.menuItems.push({ - title: "Remove", - icon: "delete", - onClick: () => onClusterDelete(entity.getId(), openDeleteClusterDialog), - }); - } - }); -} diff --git a/src/renderer/initializers/index.ts b/src/renderer/initializers/index.ts index e7b846550c..62bba2e24f 100644 --- a/src/renderer/initializers/index.ts +++ b/src/renderer/initializers/index.ts @@ -3,5 +3,4 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -export * from "./catalog"; export * from "./ipc";