From ce7cdba0bc2a25133e982b1af2d98dde1c3c17cb Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Wed, 12 May 2021 12:27:16 -0400 Subject: [PATCH] feat: Prompt for quitting session on desktop quit --- ui/desktop/electron-app/src/index.js | 27 ++++++++++++++++++- .../electron-app/src/session/manager.js | 11 +++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/ui/desktop/electron-app/src/index.js b/ui/desktop/electron-app/src/index.js index 3ff94bf64..e4db2c671 100644 --- a/ui/desktop/electron-app/src/index.js +++ b/ui/desktop/electron-app/src/index.js @@ -7,9 +7,9 @@ const { const { session, app, + dialog, protocol, BrowserWindow, - ipcMain, Menu, MenuItem, } = require('electron'); @@ -17,6 +17,7 @@ require('./ipc/handlers.js'); const origin = require('./origin/index.js'); const { generateCSPHeader } = require('./config/content-security-policy.js'); +const sessionManager = require('./session/manager.js'); const menu = require('./config/menu.js'); const appUpdater = require('./helpers/app-updater.js'); @@ -183,6 +184,30 @@ app.on('ready', async () => { }); }); +/** + * Prompt for closing spawned processes + */ +app.on('before-quit', (event) => { + if (sessionManager.hasActiveSessions) { + const dialogOpts = { + type: 'question', + buttons: ['Close & Quit', 'Ignore & Quit', 'Cancel'], + detail: 'Close sessions before quitting?', + }; + + dialog.showMessageBox(dialogOpts).then((returnValue) => { + switch (returnValue.response) { + case 0: + sessionManager.stopAll(); + break; + case 2: + event.preventDefault(); + break; + } + }); + } +}); + // Handle an unhandled error in the main thread // // Note that 'uncaughtException' is a crude mechanism for exception handling intended to diff --git a/ui/desktop/electron-app/src/session/manager.js b/ui/desktop/electron-app/src/session/manager.js index cb25bef93..63b3a8943 100644 --- a/ui/desktop/electron-app/src/session/manager.js +++ b/ui/desktop/electron-app/src/session/manager.js @@ -7,6 +7,14 @@ class SessionManager { this.#sessions = []; } + /** + * Checks for active sessions + * @returns {boolean} + */ + get hasActiveSessions() { + return Boolean(this.#sessions.find((session) => session.isActive)); + } + /** * Start a session and track it. * Returns session proxy details if successfully started. @@ -27,10 +35,11 @@ class SessionManager { */ async stopById(session_id) { const session = this.#sessions.find((session) => session.id === session_id); - return session.stop(); + return session && session.stop(); } stopAll() { + this.#sessions.forEach((session) => session.stop()); } }