diff --git a/src/main/menu/application-menu-initializer.injectable.ts b/src/main/menu/application-menu-initializer.injectable.ts new file mode 100644 index 0000000000..cad96205f0 --- /dev/null +++ b/src/main/menu/application-menu-initializer.injectable.ts @@ -0,0 +1,30 @@ +/** + * 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 { autorun } from "mobx"; +import { buildMenu } from "./menu"; +import applicationMenuItemsInjectable from "./application-menu-items.injectable"; + +const applicationMenuInitializerInjectable = getInjectable({ + id: "application-menu-initializer", + + instantiate: (di) => { + let disposer: () => void; + + return { + start: () => { + const applicationMenuItems = di.inject(applicationMenuItemsInjectable); + + disposer = autorun(() => buildMenu(applicationMenuItems.get()), { + delay: 100, + }); + }, + + stop: () => disposer?.(), + }; + }, +}); + +export default applicationMenuInitializerInjectable; diff --git a/src/main/menu/application-menu-items.injectable.ts b/src/main/menu/application-menu-items.injectable.ts index 9cc2e26691..e566ad215c 100644 --- a/src/main/menu/application-menu-items.injectable.ts +++ b/src/main/menu/application-menu-items.injectable.ts @@ -5,7 +5,6 @@ import { getInjectable } from "@ogre-tools/injectable"; import { checkForUpdates } from "../app-updater"; import { docsUrl, productName, supportUrl } from "../../common/vars"; -import { exitApp } from "../exit-app"; import { broadcastMessage } from "../../common/ipc"; import { openBrowser } from "../../common/utils"; import { showAbout } from "./menu"; @@ -23,6 +22,7 @@ import navigateToExtensionsInjectable from "../../common/front-end-routing/route import navigateToCatalogInjectable from "../../common/front-end-routing/routes/catalog/navigate-to-catalog.injectable"; 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 stopServicesAndExitAppInjectable from "../stop-services-and-exit-app.injectable"; import isMacInjectable from "../../common/vars/is-mac.injectable"; import { computed } from "mobx"; @@ -49,6 +49,7 @@ const applicationMenuItemsInjectable = getInjectable({ // 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 stopServicesAndExitApp = di.inject(stopServicesAndExitAppInjectable); const navigateToPreferences = di.inject(navigateToPreferencesInjectable); const navigateToExtensions = di.inject(navigateToExtensionsInjectable); const navigateToCatalog = di.inject(navigateToCatalogInjectable); @@ -107,7 +108,7 @@ const applicationMenuItemsInjectable = getInjectable({ accelerator: "Cmd+Q", id: "quit", click() { - exitApp(); + stopServicesAndExitApp(); }, }, ], @@ -161,7 +162,7 @@ const applicationMenuItemsInjectable = getInjectable({ accelerator: "Alt+F4", id: "quit", click() { - exitApp(); + stopServicesAndExitApp(); }, }, ]), diff --git a/src/main/menu/cleanup-application-menu-when-application-is-quit.injectable.ts b/src/main/menu/cleanup-application-menu-when-application-is-quit.injectable.ts new file mode 100644 index 0000000000..2521860641 --- /dev/null +++ b/src/main/menu/cleanup-application-menu-when-application-is-quit.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 applicationMenuInitializerInjectable from "./application-menu-initializer.injectable"; +import { onApplicationQuitInjectionToken } from "../start-main-application/on-application-close/implementations/quit-application/on-application-quit/on-application-quit-injection-token"; + +const cleanupApplicationMenuWhenApplicationIsQuitInjectable = getInjectable({ + id: "cleanup-application-menu-when-application-is-quit", + + instantiate: (di) => { + const initializeApplicationMenu = di.inject( + applicationMenuInitializerInjectable, + ); + + return { + run: () => { + initializeApplicationMenu.stop(); + }, + }; + }, + + injectionToken: onApplicationQuitInjectionToken, +}); + +export default cleanupApplicationMenuWhenApplicationIsQuitInjectable; diff --git a/src/main/menu/menu.ts b/src/main/menu/menu.ts index 4936957b80..8765b150c0 100644 --- a/src/main/menu/menu.ts +++ b/src/main/menu/menu.ts @@ -3,22 +3,12 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { app, dialog, Menu } from "electron"; -import type { IComputedValue } from "mobx"; -import { autorun } from "mobx"; import { appName, isWindows, productName } from "../../common/vars"; import packageJson from "../../../package.json"; import type { MenuItemOpts } from "./application-menu-items.injectable"; export type MenuTopId = "mac" | "file" | "edit" | "view" | "help"; -export function initMenu( - applicationMenuItems: IComputedValue, -) { - return autorun(() => buildMenu(applicationMenuItems.get()), { - delay: 100, - }); -} - export function showAbout() { const appInfo = [ `${appName}: ${app.getVersion()}`, diff --git a/src/main/menu/setup-application-menu-when-application-is-ready.injectable.ts b/src/main/menu/setup-application-menu-when-application-is-ready.injectable.ts new file mode 100644 index 0000000000..fe96a9ce85 --- /dev/null +++ b/src/main/menu/setup-application-menu-when-application-is-ready.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 { onApplicationIsReadyInjectionToken } from "../start-main-application/on-application-is-ready/on-application-is-ready-injection-token"; +import applicationMenuInitializerInjectable from "./application-menu-initializer.injectable"; + +const setupApplicationMenuWhenApplicationIsReadyInjectable = getInjectable({ + id: "setup-application-menu-when-application-is-ready", + + instantiate: (di) => { + const initializeApplicationMenu = di.inject( + applicationMenuInitializerInjectable, + ); + + return { + run: () => { + initializeApplicationMenu.start(); + }, + }; + }, + + injectionToken: onApplicationIsReadyInjectionToken, +}); + +export default setupApplicationMenuWhenApplicationIsReadyInjectable;