From 94349658038e2bfb769f85975fbc210059594670 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Wed, 18 Mar 2026 19:49:50 +0200 Subject: [PATCH] feat(desktop): add error dialog and global exception handlers --- surfsense_desktop/src/main.ts | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/surfsense_desktop/src/main.ts b/surfsense_desktop/src/main.ts index fa5999ee9..941c00ee7 100644 --- a/surfsense_desktop/src/main.ts +++ b/surfsense_desktop/src/main.ts @@ -1,7 +1,37 @@ -import { app, BrowserWindow, shell, ipcMain, session } from 'electron'; +import { app, BrowserWindow, shell, ipcMain, session, dialog, clipboard } from 'electron'; import path from 'path'; import { getPort } from 'get-port-please'; +function showErrorDialog(title: string, error: unknown): void { + const err = error instanceof Error ? error : new Error(String(error)); + console.error(`${title}:`, err); + + if (app.isReady()) { + const detail = err.stack || err.message; + const buttonIndex = dialog.showMessageBoxSync({ + type: 'error', + buttons: ['OK', process.platform === 'darwin' ? 'Copy Error' : 'Copy error'], + defaultId: 0, + noLink: true, + message: title, + detail, + }); + if (buttonIndex === 1) { + clipboard.writeText(`${title}\n${detail}`); + } + } else { + dialog.showErrorBox(title, err.stack || err.message); + } +} + +process.on('uncaughtException', (error) => { + showErrorDialog('Unhandled Error', error); +}); + +process.on('unhandledRejection', (reason) => { + showErrorDialog('Unhandled Promise Rejection', reason); +}); + const isDev = !app.isPackaged; let mainWindow: BrowserWindow | null = null; let deepLinkUrl: string | null = null;