From d2c5632fc11e989adc8fa083324c563119978966 Mon Sep 17 00:00:00 2001 From: Sami Tiilikainen <97873007+samitiilikainen@users.noreply.github.com> Date: Wed, 11 Jan 2023 15:29:17 +0200 Subject: [PATCH] Computed appMenus option (#6904) * Make `appMenus` optionally `IComputedValue` similarly as `trayMenus` already are (#6598) * Allows extensions to dynamically show/hide menu items Signed-off-by: Sami Tiilikainen <97873007+samitiilikainen@users.noreply.github.com> Signed-off-by: Sami Tiilikainen <97873007+samitiilikainen@users.noreply.github.com> --- src/extensions/common-api/registrations.ts | 1 + src/extensions/lens-main-extension.ts | 2 +- .../application-menu-item-registrator.injectable.ts | 13 +++++++++---- .../application-menu/main/menu-registration.ts | 6 ++++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/extensions/common-api/registrations.ts b/src/extensions/common-api/registrations.ts index 50a9262419..3592d7950e 100644 --- a/src/extensions/common-api/registrations.ts +++ b/src/extensions/common-api/registrations.ts @@ -14,3 +14,4 @@ export type { CustomCategoryViewProps, CustomCategoryViewComponents, CustomCateg export type { ShellEnvModifier, ShellEnvContext } from "../../main/shell-session/shell-env-modifier/shell-env-modifier-registration"; export type { KubeObjectContextMenuItem, KubeObjectOnContextMenuOpenContext, KubeObjectOnContextMenuOpen, KubeObjectHandlers, KubeObjectHandlerRegistration } from "../../renderer/kube-object/handler"; export type { TrayMenuRegistration } from "../../main/tray/tray-menu-registration"; +export type { MenuRegistration } from "../../features/application-menu/main/menu-registration"; diff --git a/src/extensions/lens-main-extension.ts b/src/extensions/lens-main-extension.ts index b97d8da834..63daab9ba4 100644 --- a/src/extensions/lens-main-extension.ts +++ b/src/extensions/lens-main-extension.ts @@ -12,7 +12,7 @@ import type { ShellEnvModifier } from "../main/shell-session/shell-env-modifier/ import type { LensMainExtensionDependencies } from "./lens-extension-set-dependencies"; export class LensMainExtension extends LensExtension { - appMenus: MenuRegistration[] = []; + appMenus: MenuRegistration[] | IComputedValue = []; trayMenus: TrayMenuRegistration[] | IComputedValue = []; /** diff --git a/src/features/application-menu/main/application-menu-item-registrator.injectable.ts b/src/features/application-menu/main/application-menu-item-registrator.injectable.ts index 8c3d635db0..b2e7367bbb 100644 --- a/src/features/application-menu/main/application-menu-item-registrator.injectable.ts +++ b/src/features/application-menu/main/application-menu-item-registrator.injectable.ts @@ -2,6 +2,7 @@ * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ +import { computed } from "mobx"; import type { Injectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable"; import { extensionRegistratorInjectionToken } from "../../../extensions/extension-loader/extension-registrator-injection-token"; @@ -25,11 +26,15 @@ const applicationMenuItemRegistratorInjectable = getInjectable({ const toRecursedInjectables = toRecursedInjectablesFor(logError); return (ext: LensExtension) => { - const extension = ext as LensMainExtension; + const mainExtension = ext as LensMainExtension; - return extension.appMenus.flatMap( - toRecursedInjectables([extension.sanitizedExtensionId]), - ); + return computed(() => { + const appMenus = Array.isArray(mainExtension.appMenus) ? mainExtension.appMenus : mainExtension.appMenus.get(); + + return appMenus.flatMap( + toRecursedInjectables([mainExtension.sanitizedExtensionId]), + ); + }); }; }, diff --git a/src/features/application-menu/main/menu-registration.ts b/src/features/application-menu/main/menu-registration.ts index 8f0ba5933f..3dc75ba077 100644 --- a/src/features/application-menu/main/menu-registration.ts +++ b/src/features/application-menu/main/menu-registration.ts @@ -3,7 +3,9 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { MenuItemConstructorOptions } from "electron"; +import type { IComputedValue } from "mobx"; -export interface MenuRegistration extends MenuItemConstructorOptions { +export type MenuRegistration = { parentId: string; -} + visible?: IComputedValue | boolean; +} & Omit;