diff --git a/src/main/tray/cleanup-tray-when-application-is-quit.injectable.ts b/src/main/tray/cleanup-tray-when-application-is-quit.injectable.ts new file mode 100644 index 0000000000..1be9362855 --- /dev/null +++ b/src/main/tray/cleanup-tray-when-application-is-quit.injectable.ts @@ -0,0 +1,25 @@ +/** + * 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 trayInitializerInjectable from "./tray-initializer.injectable"; +import { onApplicationQuitInjectionToken } from "../start-main-application/on-application-close/implementations/quit-application/on-application-quit/on-application-quit-injection-token"; + +const setupTrayWhenApplicationIsQuitInjectable = getInjectable({ + id: "setup-tray-when-application-is-quit", + + instantiate: (di) => { + const trayInitializer = di.inject(trayInitializerInjectable); + + return { + run: () => { + trayInitializer.stop(); + }, + }; + }, + + injectionToken: onApplicationQuitInjectionToken, +}); + +export default setupTrayWhenApplicationIsQuitInjectable; diff --git a/src/main/tray/setup-tray-when-application-is-ready.injectable.ts b/src/main/tray/setup-tray-when-application-is-ready.injectable.ts new file mode 100644 index 0000000000..f6260e4e8e --- /dev/null +++ b/src/main/tray/setup-tray-when-application-is-ready.injectable.ts @@ -0,0 +1,25 @@ +/** + * 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 trayInitializerInjectable from "./tray-initializer.injectable"; + +const setupTrayWhenApplicationIsReadyInjectable = getInjectable({ + id: "setup-tray-when-application-is-ready", + + instantiate: (di) => { + const trayInitializer = di.inject(trayInitializerInjectable); + + return { + run: () => { + trayInitializer.start(); + }, + }; + }, + + injectionToken: onApplicationIsReadyInjectionToken, +}); + +export default setupTrayWhenApplicationIsReadyInjectable; diff --git a/src/main/tray/tray-initializer.injectable.ts b/src/main/tray/tray-initializer.injectable.ts new file mode 100644 index 0000000000..aeff32b2b4 --- /dev/null +++ b/src/main/tray/tray-initializer.injectable.ts @@ -0,0 +1,33 @@ +/** + * 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 { initTray } from "./tray"; +import windowManagerInjectable from "../window-manager.injectable"; +import trayMenuItemsInjectable from "./tray-menu-items.injectable"; +import navigateToPreferencesInjectable from "../../common/front-end-routing/routes/preferences/navigate-to-preferences.injectable"; +import stopServicesAndExitAppInjectable from "../stop-services-and-exit-app.injectable"; + +const trayInitializerInjectable = getInjectable({ + id: "tray-initializer", + + instantiate: (di) => { + let disposer: () => void; + + return ({ + start: () => { + const windowManager = di.inject(windowManagerInjectable); + const trayMenuItems = di.inject(trayMenuItemsInjectable); + const navigateToPreferences = di.inject(navigateToPreferencesInjectable); + const stopServicesAndExitApp = di.inject(stopServicesAndExitAppInjectable); + + disposer = initTray(windowManager, trayMenuItems, navigateToPreferences, stopServicesAndExitApp); + }, + + stop: () => disposer?.(), + }); + }, +}); + +export default trayInitializerInjectable; diff --git a/src/main/tray/tray.ts b/src/main/tray/tray.ts index e2c4425f42..6638c82cdc 100644 --- a/src/main/tray/tray.ts +++ b/src/main/tray/tray.ts @@ -12,13 +12,11 @@ import { checkForUpdates, isAutoUpdateEnabled } from "../app-updater"; import type { WindowManager } from "../window-manager"; import logger from "../logger"; import { isDevelopment, isWindows, productName, staticFilesDirectory } from "../../common/vars"; -import { exitApp } from "../exit-app"; import type { Disposer } from "../../common/utils"; import { disposer, toJS } from "../../common/utils"; import type { TrayMenuRegistration } from "./tray-menu-registration"; import path from "path"; - const TRAY_LOG_PREFIX = "[TRAY]"; // note: instance of Tray should be saved somewhere, otherwise it disappears @@ -36,6 +34,7 @@ export function initTray( windowManager: WindowManager, trayMenuItems: IComputedValue, navigateToPreferences: () => void, + stopServicesAndExitApp: () => void, ): Disposer { const icon = getTrayIconPath(); @@ -54,7 +53,7 @@ export function initTray( return disposer( autorun(() => { try { - const menu = createTrayMenu(windowManager, toJS(trayMenuItems.get()), navigateToPreferences); + const menu = createTrayMenu(windowManager, toJS(trayMenuItems.get()), navigateToPreferences, stopServicesAndExitApp); tray.setContextMenu(menu); } catch (error) { @@ -82,6 +81,7 @@ function createTrayMenu( windowManager: WindowManager, extensionTrayItems: TrayMenuRegistration[], navigateToPreferences: () => void, + stopServicesAndExitApp: () => void, ): Menu { let template: Electron.MenuItemConstructorOptions[] = [ { @@ -125,7 +125,7 @@ function createTrayMenu( { label: "Quit App", click() { - exitApp(); + stopServicesAndExitApp(); }, }, ]));