diff --git a/src/main/index.ts b/src/main/index.ts index 8ec2e07c27..5927bb3769 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -55,11 +55,11 @@ import shellApiRequestInjectable from "./proxy-functions/shell-api-request/shell import userStoreInjectable from "../common/user-store/user-store.injectable"; import trayMenuItemsInjectable from "./tray/tray-menu-items.injectable"; import { broadcastNativeThemeOnUpdate } from "./native-theme"; -import getAppMenuItemsInjectable from "./menu/get-app-menu-items.injectable"; import windowManagerInjectable from "./window-manager.injectable"; import navigateToPreferencesInjectable from "../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable"; import syncGeneralCatalogEntitiesInjectable from "./catalog-sources/sync-general-catalog-entities.injectable"; import hotbarStoreInjectable from "../common/hotbar-store.injectable"; +import applicationMenuItemsInjectable from "./menu/application-menu-items.injectable"; const di = getDi(); @@ -298,12 +298,12 @@ app.on("ready", async () => { logger.info("🖥️ Starting WindowManager"); const windowManager = di.inject(windowManagerInjectable); - const getAppMenuItems = di.inject(getAppMenuItemsInjectable); + const applicationMenuItems = di.inject(applicationMenuItemsInjectable); const trayMenuItems = di.inject(trayMenuItemsInjectable); const navigateToPreferences = di.inject(navigateToPreferencesInjectable); onQuitCleanup.push( - initMenu(getAppMenuItems), + initMenu(applicationMenuItems), initTray(windowManager, trayMenuItems, navigateToPreferences), () => ShellSession.cleanup(), ); diff --git a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts index b8c84136cd..d92897bb50 100644 --- a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts +++ b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.injectable.ts @@ -5,15 +5,14 @@ import { getInjectable } from "@ogre-tools/injectable"; import directoryForLensLocalStorageInjectable from "../../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable"; import { initIpcMainHandlers } from "./init-ipc-main-handlers"; -import getAppMenuItemsInjectable from "../../menu/get-app-menu-items.injectable"; import getAbsolutePathInjectable from "../../../common/path/get-absolute-path.injectable"; +import applicationMenuItemsInjectable from "../../menu/application-menu-items.injectable"; const initIpcMainHandlersInjectable = getInjectable({ id: "init-ipc-main-handlers", instantiate: (di) => initIpcMainHandlers({ - // TODO: Remove requirement for postponing inject - getAppMenuItems: () => di.inject(getAppMenuItemsInjectable)(), + applicationMenuItems: di.inject(applicationMenuItemsInjectable), directoryForLensLocalStorage: di.inject(directoryForLensLocalStorageInjectable), getAbsolutePath: di.inject(getAbsolutePathInjectable), }), diff --git a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts index 24b6c89c9b..56aa16c3e6 100644 --- a/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts +++ b/src/main/initializers/init-ipc-main-handlers/init-ipc-main-handlers.ts @@ -21,16 +21,17 @@ import { showOpenDialog } from "../../ipc/dialog"; import { windowActionHandleChannel, windowLocationChangedChannel, windowOpenAppMenuAsContextMenuChannel } from "../../../common/ipc/window"; import { getNativeColorTheme } from "../../native-theme"; import { getNativeThemeChannel } from "../../../common/ipc/native-theme"; -import type { MenuItemsOpts } from "../../menu/get-app-menu-items.injectable"; import type { GetAbsolutePath } from "../../../common/path/get-absolute-path.injectable"; +import type { IComputedValue } from "mobx"; +import type { MenuItemsOpts } from "../../menu/application-menu-items.injectable"; interface Dependencies { - getAppMenuItems: () => MenuItemsOpts[]; directoryForLensLocalStorage: string; getAbsolutePath: GetAbsolutePath; + applicationMenuItems: IComputedValue; } -export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStorage, getAbsolutePath }: Dependencies) => () => { +export const initIpcMainHandlers = ({ applicationMenuItems, directoryForLensLocalStorage, getAbsolutePath }: Dependencies) => () => { ipcMainHandle(clusterActivateHandler, (event, clusterId: ClusterId, force = false) => { return ClusterStore.getInstance() .getById(clusterId) @@ -149,7 +150,7 @@ export const initIpcMainHandlers = ({ getAppMenuItems, directoryForLensLocalStor ipcMainHandle(broadcastMainChannel, (event, channel, ...args) => broadcastMessage(channel, ...args)); ipcMainOn(windowOpenAppMenuAsContextMenuChannel, async (event) => { - const appMenu = getAppMenuItems(); + const appMenu = applicationMenuItems.get(); const menu = Menu.buildFromTemplate(appMenu); diff --git a/src/main/menu/get-app-menu-items.injectable.ts b/src/main/menu/application-menu-items.injectable.ts similarity index 92% rename from src/main/menu/get-app-menu-items.injectable.ts rename to src/main/menu/application-menu-items.injectable.ts index 9cac0fa106..c0370285b8 100644 --- a/src/main/menu/get-app-menu-items.injectable.ts +++ b/src/main/menu/application-menu-items.injectable.ts @@ -26,6 +26,7 @@ import navigateToCatalogInjectable from "../../common/front-end-routing/routes/c import navigateToWelcomeInjectable from "../../common/front-end-routing/routes/welcome/navigate-to-welcome.injectable"; import navigateToAddClusterInjectable from "../../common/front-end-routing/routes/add-cluster/navigate-to-add-cluster.injectable"; import isMacInjectable from "../../common/vars/is-mac.injectable"; +import { computed } from "mobx"; function ignoreIf(check: boolean, menuItems: MenuItemConstructorOptions[]) { return check ? [] : menuItems; @@ -35,24 +36,27 @@ export interface MenuItemsOpts extends MenuItemConstructorOptions { submenu?: MenuItemConstructorOptions[]; } -const getAppMenuItemsInjectable = getInjectable({ - id: "get-app-menu-items", +const applicationMenuItemsInjectable = getInjectable({ + id: "application-menu-items", instantiate: (di) => { - const windowManager = di.inject(windowManagerInjectable); const logger = di.inject(loggerInjectable); const appName = di.inject(appNameInjectable); - const electronMenuItems = di.inject(electronMenuItemsInjectable); - const isAutoUpdateEnabled = di.inject(isAutoUpdateEnabledInjectable); - - const navigateToPreferences = di.inject(navigateToPreferencesInjectable); - const navigateToExtensions = di.inject(navigateToExtensionsInjectable); - const navigateToCatalog = di.inject(navigateToCatalogInjectable); - const navigateToWelcome = di.inject(navigateToWelcomeInjectable); - const navigateToAddCluster = di.inject(navigateToAddClusterInjectable); const isMac = di.inject(isMacInjectable); + const isAutoUpdateEnabled = di.inject(isAutoUpdateEnabledInjectable); + const electronMenuItems = di.inject(electronMenuItemsInjectable); + + return computed((): MenuItemsOpts[] => { + + // TODO: These injects should happen outside of the computed. + // TODO: Remove temporal dependencies in WindowManager to make sure timing is correct. + const windowManager = di.inject(windowManagerInjectable); + const navigateToPreferences = di.inject(navigateToPreferencesInjectable); + const navigateToExtensions = di.inject(navigateToExtensionsInjectable); + const navigateToCatalog = di.inject(navigateToCatalogInjectable); + const navigateToWelcome = di.inject(navigateToWelcomeInjectable); + const navigateToAddCluster = di.inject(navigateToAddClusterInjectable); - return (): MenuItemsOpts[] => { const autoUpdateDisabled = !isAutoUpdateEnabled(); logger.info(`[MENU]: autoUpdateDisabled=${autoUpdateDisabled}`); @@ -326,8 +330,8 @@ const getAppMenuItemsInjectable = getInjectable({ } return [...appMenu.values()]; - }; + }); }, }); -export default getAppMenuItemsInjectable; +export default applicationMenuItemsInjectable; diff --git a/src/main/menu/menu.ts b/src/main/menu/menu.ts index 540e19d1d9..e0c408dfb5 100644 --- a/src/main/menu/menu.ts +++ b/src/main/menu/menu.ts @@ -3,17 +3,17 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { app, BrowserWindow, dialog, Menu } from "electron"; -import { autorun } from "mobx"; +import { autorun, IComputedValue } from "mobx"; import { appName, isWindows, productName } from "../../common/vars"; import packageJson from "../../../package.json"; -import type { MenuItemsOpts } from "./get-app-menu-items.injectable"; +import type { MenuItemsOpts } from "./application-menu-items.injectable"; export type MenuTopId = "mac" | "file" | "edit" | "view" | "help"; export function initMenu( - getAppMenuItems: () => MenuItemsOpts[], + applicationMenuItems: IComputedValue, ) { - return autorun(() => buildMenu(getAppMenuItems), { + return autorun(() => buildMenu(applicationMenuItems.get()), { delay: 100, }); } @@ -37,11 +37,9 @@ export function showAbout(browserWindow: BrowserWindow) { } export function buildMenu( - getAppMenuItems: () => MenuItemsOpts[], + applicationMenuItems: MenuItemsOpts[], ) { - const menuItems = getAppMenuItems(); - Menu.setApplicationMenu( - Menu.buildFromTemplate(menuItems), + Menu.buildFromTemplate(applicationMenuItems), ); } diff --git a/src/renderer/components/test-utils/get-application-builder.tsx b/src/renderer/components/test-utils/get-application-builder.tsx index 4d4604159e..bcc4b2338b 100644 --- a/src/renderer/components/test-utils/get-application-builder.tsx +++ b/src/renderer/components/test-utils/get-application-builder.tsx @@ -25,11 +25,11 @@ import type { ClusterStore } from "../../../common/cluster-store/cluster-store"; import mainExtensionsInjectable from "../../../extensions/main-extensions.injectable"; import type { LensMainExtension } from "../../../extensions/lens-main-extension"; import currentRouteComponentInjectable from "../../routes/current-route-component.injectable"; -import getAppMenuItemsInjectable, { MenuItemsOpts } from "../../../main/menu/get-app-menu-items.injectable"; import { pipeline } from "@ogre-tools/fp"; import { flatMap, compact, join, get, filter } from "lodash/fp"; import preferenceNavigationItemsInjectable from "../+preferences/preferences-navigation/preference-navigation-items.injectable"; import navigateToPreferencesInjectable from "../../../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable"; +import applicationMenuItemsInjectable, { MenuItemsOpts } from "../../../main/menu/application-menu-items.injectable"; type Callback = (dis: DiContainers) => void | Promise; @@ -126,14 +126,12 @@ export const getApplicationBuilder = () => { applicationMenu: { click: (path: string) => { - const getApplicationMenuItems = mainDi.inject( - getAppMenuItemsInjectable, + const applicationMenuItems = mainDi.inject( + applicationMenuItemsInjectable, ); - const applicationMenuItems = getApplicationMenuItems(); - const menuItems = pipeline( - applicationMenuItems, + applicationMenuItems.get(), flatMap(toFlatChildren(null)), filter((menuItem) => !!menuItem.click), );