diff --git a/src/behaviours/tray/extension-adding-tray-items.test.tsx b/src/behaviours/tray/extension-adding-tray-items.test.tsx new file mode 100644 index 0000000000..dc29f900f1 --- /dev/null +++ b/src/behaviours/tray/extension-adding-tray-items.test.tsx @@ -0,0 +1,78 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { IObservableValue } from "mobx"; +import { computed, runInAction, observable } from "mobx"; +import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; +import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; +import { getExtensionFakeFor } from "../../renderer/components/test-utils/get-extension-fake"; + +describe("preferences: extension adding tray items", () => { + describe("when extension with tray items is enabled", () => { + let builder: ApplicationBuilder; + let someObservable: IObservableValue; + + beforeEach(async () => { + builder = getApplicationBuilder(); + + await builder.render(); + + builder.preferences.navigate(); + + const getExtensionFake = getExtensionFakeFor(builder); + + someObservable = observable.box(false); + + const testExtension = getExtensionFake({ + id: "some-extension-id", + name: "some-extension", + + mainOptions: { + trayMenus: [ + { + label: "some-controlled-visibility", + click: () => {}, + visible: computed(() => someObservable.get()), + }, + + { + label: "some-uncontrolled-visibility", + click: () => {}, + }, + ], + }, + }); + + builder.extensions.enable(testExtension); + }); + + it("shows item which doesn't control the visibility", () => { + expect( + builder.tray.get( + "some-uncontrolled-visibility-tray-menu-item-for-extension-some-extension", + ), + ).not.toBeNull(); + }); + + it("does not show hidden item", () => { + expect( + builder.tray.get( + "some-controlled-visibility-tray-menu-item-for-extension-some-extension", + ), + ).toBeNull(); + }); + + it("when item becomes visible, shows the item", () => { + runInAction(() => { + someObservable.set(true); + }); + + expect( + builder.tray.get( + "some-controlled-visibility-tray-menu-item-for-extension-some-extension", + ), + ).not.toBeNull(); + }); + }); +}); diff --git a/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts b/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts index 152c4ea8d1..5d6125e021 100644 --- a/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts +++ b/src/main/tray/tray-menu-item/tray-menu-item-registrator.injectable.ts @@ -71,7 +71,14 @@ const toItemInjectablesFor = (extension: LensMainExtension, withErrorLoggingFor: }, enabled: computed(() => registration.enabled ?? true), - visible: computed(() => true), + + visible: computed(() => { + if (!registration.visible) { + return true; + } + + return registration.visible.get(); + }), }), injectionToken: trayMenuItemInjectionToken, diff --git a/src/main/tray/tray-menu-registration.ts b/src/main/tray/tray-menu-registration.ts index dcd7796c51..669c99638f 100644 --- a/src/main/tray/tray-menu-registration.ts +++ b/src/main/tray/tray-menu-registration.ts @@ -3,6 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ +import type { IComputedValue } from "mobx"; + export interface TrayMenuRegistration { label?: string; click?: (menuItem: TrayMenuRegistration) => void; @@ -11,4 +13,5 @@ export interface TrayMenuRegistration { toolTip?: string; enabled?: boolean; submenu?: TrayMenuRegistration[]; + visible?: IComputedValue; }