From 6cc419ed8e5de42c83efa91b184f732924181155 Mon Sep 17 00:00:00 2001 From: Manuele Conti Date: Tue, 24 Mar 2026 18:06:55 +0100 Subject: [PATCH 1/2] Guard system info requests during window teardown Fix a race where the renderer could request system:get-system-info while the Electron BrowserWindow was already being destroyed. The IPC handler previously called isMaximized() on a stale BrowserWindow reference, which raised "Object has been destroyed" and surfaced as an unhandled promise rejection in development logs. This change guards the main-process handler with isDestroyed() before reading window state, and wraps the renderer initialization request in try/catch so startup or teardown races do not produce unhandled rejections. --- src/main/modules/ipc/main.ts | 4 ++- .../components/_templates/app-layout.tsx | 28 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/modules/ipc/main.ts b/src/main/modules/ipc/main.ts index ae73dde85..709edc3d2 100644 --- a/src/main/modules/ipc/main.ts +++ b/src/main/modules/ipc/main.ts @@ -751,11 +751,13 @@ class MainProcessBridge implements MainIpcModule { nativeTheme.themeSource = savedTheme } + const isWindowMaximized = this.mainWindow && !this.mainWindow.isDestroyed() ? this.mainWindow.isMaximized() : false + return { OS: platform, architecture: 'x64', prefersDarkMode: nativeTheme.shouldUseDarkColors, - isWindowMaximized: this.mainWindow?.isMaximized(), + isWindowMaximized, } } handleStoreRetrieveRecent = async () => { diff --git a/src/renderer/components/_templates/app-layout.tsx b/src/renderer/components/_templates/app-layout.tsx index 9bff6771b..0febce45c 100644 --- a/src/renderer/components/_templates/app-layout.tsx +++ b/src/renderer/components/_templates/app-layout.tsx @@ -28,22 +28,26 @@ const AppLayout = ({ children, ...rest }: AppLayoutProps): ReactNode => { useEffect(() => { const getUserSystemProps = async () => { - const { OS, architecture, prefersDarkMode, isWindowMaximized } = await window.bridge.getSystemInfo() - const recent = await window.bridge.retrieveRecent() + try { + const { OS, architecture, prefersDarkMode, isWindowMaximized } = await window.bridge.getSystemInfo() + const recent = await window.bridge.retrieveRecent() - setRecent(recent) - setSystemConfigs({ - OS, - arch: architecture, - shouldUseDarkMode: prefersDarkMode, - isWindowMaximized, - }) - if (OS === 'darwin' || OS === 'win32') { - setIsLinux(false) + setRecent(recent) + setSystemConfigs({ + OS, + arch: architecture, + shouldUseDarkMode: prefersDarkMode, + isWindowMaximized, + }) + if (OS === 'darwin' || OS === 'win32') { + setIsLinux(false) + } + } catch (error) { + console.error('Failed to read system info during app layout initialization:', error) } } void getUserSystemProps() - }, [setSystemConfigs]) + }, [setRecent, setSystemConfigs]) return ( <> From 33a8b2fc0b61f55649e396a7efa9f0f9aa7389eb Mon Sep 17 00:00:00 2001 From: Manuele Conti Date: Mon, 6 Apr 2026 20:46:26 +0200 Subject: [PATCH 2/2] decouple app layout init reads --- src/renderer/components/_templates/app-layout.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/renderer/components/_templates/app-layout.tsx b/src/renderer/components/_templates/app-layout.tsx index 0febce45c..802e80a16 100644 --- a/src/renderer/components/_templates/app-layout.tsx +++ b/src/renderer/components/_templates/app-layout.tsx @@ -30,9 +30,6 @@ const AppLayout = ({ children, ...rest }: AppLayoutProps): ReactNode => { const getUserSystemProps = async () => { try { const { OS, architecture, prefersDarkMode, isWindowMaximized } = await window.bridge.getSystemInfo() - const recent = await window.bridge.retrieveRecent() - - setRecent(recent) setSystemConfigs({ OS, arch: architecture, @@ -45,6 +42,13 @@ const AppLayout = ({ children, ...rest }: AppLayoutProps): ReactNode => { } catch (error) { console.error('Failed to read system info during app layout initialization:', error) } + + try { + const recent = await window.bridge.retrieveRecent() + setRecent(recent) + } catch (error) { + console.error('Failed to read recent projects during app layout initialization:', error) + } } void getUserSystemProps() }, [setRecent, setSystemConfigs])