From e8547252023606aee76fa1c10467aed3cce8e950 Mon Sep 17 00:00:00 2001 From: Isaac Wismer <10574297+iwismer@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:13:12 -0400 Subject: [PATCH] Add a setting for the quit confirmation dialog (#2901) --- .../settings/app/AppSettingsSection.tsx | 29 +++++++++++++++++++ ui/desktop/src/main.ts | 29 +++++++++++++++++++ ui/desktop/src/preload.ts | 4 +++ ui/desktop/src/utils/settings.ts | 2 ++ 4 files changed, 64 insertions(+) diff --git a/ui/desktop/src/components/settings/app/AppSettingsSection.tsx b/ui/desktop/src/components/settings/app/AppSettingsSection.tsx index 0940aab0..1a69d965 100644 --- a/ui/desktop/src/components/settings/app/AppSettingsSection.tsx +++ b/ui/desktop/src/components/settings/app/AppSettingsSection.tsx @@ -13,6 +13,7 @@ interface AppSettingsSectionProps { export default function AppSettingsSection({ scrollToSection }: AppSettingsSectionProps) { const [menuBarIconEnabled, setMenuBarIconEnabled] = useState(true); const [dockIconEnabled, setDockIconEnabled] = useState(true); + const [quitConfirmationEnabled, setQuitConfirmationEnabled] = useState(true); const [isMacOS, setIsMacOS] = useState(false); const [isDockSwitchDisabled, setIsDockSwitchDisabled] = useState(false); const [showNotificationModal, setShowNotificationModal] = useState(false); @@ -39,6 +40,10 @@ export default function AppSettingsSection({ scrollToSection }: AppSettingsSecti setMenuBarIconEnabled(enabled); }); + window.electron.getQuitConfirmationState().then((enabled) => { + setQuitConfirmationEnabled(enabled); + }); + if (isMacOS) { window.electron.getDockIconState().then((enabled) => { setDockIconEnabled(enabled); @@ -86,6 +91,14 @@ export default function AppSettingsSection({ scrollToSection }: AppSettingsSecti } }; + const handleQuitConfirmationToggle = async () => { + const newState = !quitConfirmationEnabled; + const success = await window.electron.setQuitConfirmation(newState); + if (success) { + setQuitConfirmationEnabled(newState); + } + }; + return (
@@ -159,6 +172,22 @@ export default function AppSettingsSection({ scrollToSection }: AppSettingsSecti
)} + +
+
+

Quit Confirmation

+

+ Show confirmation dialog when quitting the app +

+
+
+ +
+
{/* Help & Feedback Section */} diff --git a/ui/desktop/src/main.ts b/ui/desktop/src/main.ts index b8a2069e..385e92de 100644 --- a/ui/desktop/src/main.ts +++ b/ui/desktop/src/main.ts @@ -872,6 +872,29 @@ ipcMain.handle('open-notifications-settings', async () => { } }); +// Handle quit confirmation setting +ipcMain.handle('set-quit-confirmation', async (_event, show: boolean) => { + try { + const settings = loadSettings(); + settings.showQuitConfirmation = show; + saveSettings(settings); + return true; + } catch (error) { + console.error('Error setting quit confirmation:', error); + return false; + } +}); + +ipcMain.handle('get-quit-confirmation-state', () => { + try { + const settings = loadSettings(); + return settings.showQuitConfirmation ?? true; + } catch (error) { + console.error('Error getting quit confirmation state:', error); + return true; + } +}); + // Add file/directory selection handler ipcMain.handle('select-file-or-directory', async () => { const result = (await dialog.showOpenDialog({ @@ -1822,6 +1845,12 @@ app.on('before-quit', async (event) => { return; // Allow normal quit behavior in dev mode } + // Check if quit confirmation is enabled in settings + const settings = loadSettings(); + if (!settings.showQuitConfirmation) { + return; // Allow normal quit behavior if confirmation is disabled + } + // Prevent the default quit behavior event.preventDefault(); diff --git a/ui/desktop/src/preload.ts b/ui/desktop/src/preload.ts index a9321c2b..f012b3b8 100644 --- a/ui/desktop/src/preload.ts +++ b/ui/desktop/src/preload.ts @@ -67,6 +67,8 @@ type ElectronAPI = { getMenuBarIconState: () => Promise; setDockIcon: (show: boolean) => Promise; getDockIconState: () => Promise; + setQuitConfirmation: (show: boolean) => Promise; + getQuitConfirmationState: () => Promise; openNotificationsSettings: () => Promise; on: ( channel: string, @@ -139,6 +141,8 @@ const electronAPI: ElectronAPI = { getMenuBarIconState: () => ipcRenderer.invoke('get-menu-bar-icon-state'), setDockIcon: (show: boolean) => ipcRenderer.invoke('set-dock-icon', show), getDockIconState: () => ipcRenderer.invoke('get-dock-icon-state'), + setQuitConfirmation: (show: boolean) => ipcRenderer.invoke('set-quit-confirmation', show), + getQuitConfirmationState: () => ipcRenderer.invoke('get-quit-confirmation-state'), openNotificationsSettings: () => ipcRenderer.invoke('open-notifications-settings'), on: ( channel: string, diff --git a/ui/desktop/src/utils/settings.ts b/ui/desktop/src/utils/settings.ts index 1dddb275..6cee744c 100644 --- a/ui/desktop/src/utils/settings.ts +++ b/ui/desktop/src/utils/settings.ts @@ -12,6 +12,7 @@ export interface Settings { envToggles: EnvToggles; showMenuBarIcon: boolean; showDockIcon: boolean; + showQuitConfirmation: boolean; } // Constants @@ -24,6 +25,7 @@ const defaultSettings: Settings = { }, showMenuBarIcon: true, showDockIcon: true, + showQuitConfirmation: true, }; // Settings management