diff --git a/apps/desktop/src/db/app-settings.ts b/apps/desktop/src/db/app-settings.ts index 0441ffc..b00a667 100644 --- a/apps/desktop/src/db/app-settings.ts +++ b/apps/desktop/src/db/app-settings.ts @@ -49,6 +49,11 @@ const defaultSettings: AppSettingsData = { ui: { theme: "system", }, + preferences: { + launchAtLogin: true, + showWidgetWhileInactive: true, + showInDock: true, + }, transcription: { language: "en", autoTranscribe: true, diff --git a/apps/desktop/src/db/schema.ts b/apps/desktop/src/db/schema.ts index a1a3b21..f1664d6 100644 --- a/apps/desktop/src/db/schema.ts +++ b/apps/desktop/src/db/schema.ts @@ -158,6 +158,7 @@ export interface AppSettingsData { launchAtLogin?: boolean; minimizeToTray?: boolean; showWidgetWhileInactive?: boolean; + showInDock?: boolean; }; telemetry?: { enabled?: boolean; diff --git a/apps/desktop/src/main/core/app-manager.ts b/apps/desktop/src/main/core/app-manager.ts index cc456d3..c9e179a 100644 --- a/apps/desktop/src/main/core/app-manager.ts +++ b/apps/desktop/src/main/core/app-manager.ts @@ -183,13 +183,15 @@ export class AppManager { } private setupSettingsEventListeners(settingsService: SettingsService): void { - // Handle preference changes (widget visibility) + // Handle preference changes (widget visibility, dock visibility) settingsService.on( "preferences-changed", async ({ showWidgetWhileInactiveChanged, + showInDockChanged, }: { showWidgetWhileInactiveChanged: boolean; + showInDockChanged: boolean; }) => { if (showWidgetWhileInactiveChanged) { const recordingManager = @@ -197,6 +199,9 @@ export class AppManager { const isIdle = recordingManager.getState() === "idle"; await this.updateWidgetVisibility(isIdle); } + if (showInDockChanged) { + settingsService.syncDockVisibility(); + } }, ); @@ -231,17 +236,21 @@ export class AppManager { this.windowManager.createOrShowMainWindow(); + // Apply dock visibility based on user preference (macOS only) if (app.dock) { - app.dock - .show() - .then(() => { - logger.main.info("Explicitly showing app in dock"); - }) - .catch((error) => { - logger.main.error("Error showing app in dock", error); - }); - } else { - logger.main.warn("app.dock is not available"); + if (preferences.showInDock) { + app.dock + .show() + .then(() => { + logger.main.info("Showing app in dock based on preference"); + }) + .catch((error) => { + logger.main.error("Error showing app in dock", error); + }); + } else { + app.dock.hide(); + logger.main.info("Hiding app from dock based on preference"); + } } } diff --git a/apps/desktop/src/renderer/main/pages/settings/preferences/index.tsx b/apps/desktop/src/renderer/main/pages/settings/preferences/index.tsx index cd9d9c3..2d0dc38 100644 --- a/apps/desktop/src/renderer/main/pages/settings/preferences/index.tsx +++ b/apps/desktop/src/renderer/main/pages/settings/preferences/index.tsx @@ -40,10 +40,18 @@ export default function PreferencesSettingsPage() { }); }; + const handleShowInDockChange = (checked: boolean) => { + updatePreferencesMutation.mutate({ + showInDock: checked, + }); + }; + const showWidgetWhileInactive = preferencesQuery.data?.showWidgetWhileInactive ?? true; const minimizeToTray = preferencesQuery.data?.minimizeToTray ?? false; const launchAtLogin = preferencesQuery.data?.launchAtLogin ?? true; + const showInDock = preferencesQuery.data?.showInDock ?? true; + const isMac = window.electronAPI.platform === "darwin"; return (
@@ -115,6 +123,29 @@ export default function PreferencesSettingsPage() { + {/* Show in Dock Section (macOS only) */} + {isMac && ( + <> +
+
+ +

+ Display the application icon in the macOS dock +

+
+ +
+ + + + )} + {/* Theme Section */}
diff --git a/apps/desktop/src/services/settings-service.ts b/apps/desktop/src/services/settings-service.ts index 4368eb2..48da0b1 100644 --- a/apps/desktop/src/services/settings-service.ts +++ b/apps/desktop/src/services/settings-service.ts @@ -22,6 +22,7 @@ export interface AppPreferences { launchAtLogin: boolean; minimizeToTray: boolean; showWidgetWhileInactive: boolean; + showInDock: boolean; } export class SettingsService extends EventEmitter { @@ -289,6 +290,7 @@ export class SettingsService extends EventEmitter { launchAtLogin: preferences?.launchAtLogin ?? true, minimizeToTray: preferences?.minimizeToTray ?? true, showWidgetWhileInactive: preferences?.showWidgetWhileInactive ?? true, + showInDock: preferences?.showInDock ?? true, }; } @@ -315,6 +317,7 @@ export class SettingsService extends EventEmitter { changes: preferences, showWidgetWhileInactiveChanged: preferences.showWidgetWhileInactive !== undefined, + showInDockChanged: preferences.showInDock !== undefined, }); } @@ -332,6 +335,26 @@ export class SettingsService extends EventEmitter { }); } + /** + * Sync the dock visibility setting with macOS + * This ensures the dock visibility matches our stored preference + */ + syncDockVisibility(): void { + // Only applicable on macOS where app.dock exists + if (!app.dock) { + return; + } + + // Get the current preference asynchronously and apply it + this.getPreferences().then((preferences) => { + if (preferences.showInDock) { + app.dock?.show(); + } else { + app.dock?.hide(); + } + }); + } + /** * Get telemetry settings */ diff --git a/apps/desktop/src/trpc/routers/settings.ts b/apps/desktop/src/trpc/routers/settings.ts index 20b70f0..21b3252 100644 --- a/apps/desktop/src/trpc/routers/settings.ts +++ b/apps/desktop/src/trpc/routers/settings.ts @@ -41,6 +41,7 @@ const AppPreferencesSchema = z.object({ launchAtLogin: z.boolean().optional(), minimizeToTray: z.boolean().optional(), showWidgetWhileInactive: z.boolean().optional(), + showInDock: z.boolean().optional(), }); const UIThemeSchema = z.object({