diff --git a/src/main/exit-app.ts b/src/main/exit-app.ts new file mode 100644 index 0000000000..ad3adaa21a --- /dev/null +++ b/src/main/exit-app.ts @@ -0,0 +1,19 @@ +import { app } from "electron"; +import { WindowManager } from "./window-manager"; +import { appEventBus } from "../common/event-bus"; +import { ClusterManager } from "./cluster-manager"; +import logger from "./logger"; +import { closingURL } from "../renderer/components/+closing-page/closing-page.route"; + + +export function exitApp() { + const windowManager = WindowManager.getInstance() + const clusterManager = ClusterManager.getInstance() + appEventBus.emit({ name: "service", action: "close" }) + windowManager.navigate(closingURL()); + clusterManager?.stop(); + logger.info('SERVICE:QUIT'); + setTimeout(() => { + app.exit() + }, 1000) +} \ No newline at end of file diff --git a/src/main/index.ts b/src/main/index.ts index 21acda801b..b25aed5bb2 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -67,7 +67,7 @@ app.on("ready", async () => { } // create cluster manager - clusterManager = new ClusterManager(proxyPort); + clusterManager = ClusterManager.getInstance(proxyPort); // run proxy try { @@ -82,7 +82,7 @@ app.on("ready", async () => { extensionLoader.init(await extensionManager.load()); // call after windowManager to see splash earlier setTimeout(() => { - appEventBus.emit({ name: "app", action: "start" }) + appEventBus.emit({ name: "service", action: "start" }) }, 1000) }); @@ -96,6 +96,7 @@ app.on("activate", (event, hasVisibleWindows) => { // Quit app on Cmd+Q (MacOS) app.on("will-quit", (event) => { logger.info('APP:QUIT'); + appEventBus.emit({name: "app", action: "close"}) event.preventDefault(); // prevent app's default shutdown (e.g. required for telemetry, etc.) clusterManager?.stop(); // close cluster connections return; // skip exit to make tray work, to quit go to app's global menu or tray's menu diff --git a/src/main/menu.ts b/src/main/menu.ts index fbd6af8d3c..9865c5331d 100644 --- a/src/main/menu.ts +++ b/src/main/menu.ts @@ -9,6 +9,8 @@ import { clusterSettingsURL } from "../renderer/components/+cluster-settings/clu import { extensionsURL } from "../renderer/components/+extensions/extensions.route"; import { menuRegistry } from "../extensions/registries/menu-registry"; import logger from "./logger"; +import { appEventBus } from "../common/event-bus"; +import { exitApp } from "./exit-app"; export type MenuTopId = "mac" | "file" | "edit" | "view" | "help" @@ -89,7 +91,7 @@ export function buildMenu(windowManager: WindowManager) { label: 'Quit', accelerator: 'Cmd+Q', click() { - app.exit(); // force quit since might be blocked within app.on("will-quit") + exitApp() } } ] @@ -135,7 +137,13 @@ export function buildMenu(windowManager: WindowManager) { } }, { type: 'separator' }, - { role: 'quit' } + { + label: 'Quit', + accelerator: 'Alt+F4', + click() { + exitApp() + } + } ]), { type: 'separator' }, { role: 'close' } // close current window @@ -259,7 +267,7 @@ export function buildMenu(windowManager: WindowManager) { } menu = menuItem.submenu; } - + const menuPath: string = parentLabels.join(" -> ") if (!menuItem) { logger.info(`[MENU:test-menu-item-click] Cannot find menu item ${menuPath}`); diff --git a/src/main/tray.ts b/src/main/tray.ts index 5bc6ce7091..f170517e62 100644 --- a/src/main/tray.ts +++ b/src/main/tray.ts @@ -1,6 +1,6 @@ import path from "path" import packageInfo from "../../package.json" -import { app, dialog, Menu, NativeImage, nativeTheme, Tray } from "electron" +import { dialog, Menu, NativeImage, nativeTheme, Tray } from "electron" import { autorun } from "mobx"; import { showAbout } from "./menu"; import { AppUpdater } from "./app-updater"; @@ -11,6 +11,7 @@ import { preferencesURL } from "../renderer/components/+preferences/preferences. import { clusterViewURL } from "../renderer/components/cluster-manager/cluster-view.route"; import logger from "./logger"; import { isDevelopment } from "../common/vars"; +import { exitApp } from "./exit-app"; // note: instance of Tray should be saved somewhere, otherwise it disappears export let tray: Tray; @@ -119,7 +120,7 @@ export function createTrayMenu(windowManager: WindowManager): Menu { { label: 'Quit App', click() { - app.exit(); + exitApp() } } ]); diff --git a/src/main/window-manager.ts b/src/main/window-manager.ts index fc61ca8345..b5cb73b8b6 100644 --- a/src/main/window-manager.ts +++ b/src/main/window-manager.ts @@ -85,6 +85,7 @@ export class WindowManager extends Singleton { await this.mainWindow.loadURL(this.mainUrl); this.mainWindow.show(); this.splashWindow?.close(); + appEventBus.emit({ name: "app", action: "start" }) } catch (err) { dialog.showErrorBox("ERROR!", err.toString()) } diff --git a/src/renderer/components/+closing-page/closing-page.route.ts b/src/renderer/components/+closing-page/closing-page.route.ts new file mode 100644 index 0000000000..288212a1da --- /dev/null +++ b/src/renderer/components/+closing-page/closing-page.route.ts @@ -0,0 +1,8 @@ +import type { RouteProps } from "react-router"; +import { buildURL } from "../../../common/utils/buildUrl"; + +export const closingRoute: RouteProps = { + path: "/closing" +} + +export const closingURL = buildURL(closingRoute.path) diff --git a/src/renderer/components/+closing-page/closing-page.scss b/src/renderer/components/+closing-page/closing-page.scss new file mode 100644 index 0000000000..b8f45f000e --- /dev/null +++ b/src/renderer/components/+closing-page/closing-page.scss @@ -0,0 +1,6 @@ +.ClosingPage { + width: 100%; + height: 100%; + text-align: center; + z-index: 0; +} \ No newline at end of file diff --git a/src/renderer/components/+closing-page/closing-page.tsx b/src/renderer/components/+closing-page/closing-page.tsx new file mode 100644 index 0000000000..e113a45739 --- /dev/null +++ b/src/renderer/components/+closing-page/closing-page.tsx @@ -0,0 +1,24 @@ +import "./closing-page.scss" +import React from "react"; +import { observer } from "mobx-react"; +import { Trans } from "@lingui/macro"; +import { Icon } from "../icon" + +@observer +export class ClosingPage extends React.Component { + + render() { + return ( +
+ {( +
+ +

+ Bye bye, see you soon! +

+
+ )} +
+ ) + } +} diff --git a/src/renderer/components/+closing-page/index.tsx b/src/renderer/components/+closing-page/index.tsx new file mode 100644 index 0000000000..a40a79ac26 --- /dev/null +++ b/src/renderer/components/+closing-page/index.tsx @@ -0,0 +1,2 @@ +export * from "./closing-page.route" +export * from "./closing-page" \ No newline at end of file diff --git a/src/renderer/components/cluster-manager/cluster-manager.tsx b/src/renderer/components/cluster-manager/cluster-manager.tsx index 1522376c3e..4829b32491 100644 --- a/src/renderer/components/cluster-manager/cluster-manager.tsx +++ b/src/renderer/components/cluster-manager/cluster-manager.tsx @@ -18,6 +18,7 @@ import { hasLoadedView, initView, lensViews, refreshViews } from "./lens-views"; import { globalPageRegistry } from "../../../extensions/registries/page-registry"; import { Extensions, extensionsRoute } from "../+extensions"; import { getMatchedClusterId } from "../../navigation"; +import { ClosingPage, closingRoute } from "../+closing-page"; @observer export class ClusterManager extends React.Component { @@ -63,6 +64,7 @@ export class ClusterManager extends React.Component {
+