diff --git a/electron/main.js b/electron/main.js index 6f9a69b..a853766 100644 --- a/electron/main.js +++ b/electron/main.js @@ -106,25 +106,22 @@ function createWindow() { } }); + // Track streaming status from renderer (synchronous — no async race) + let isStreaming = false; + ipcMain.on('streaming-status', (_event, active) => { isStreaming = active; }); + // Warn before closing if a stream is active - let forceClose = false; mainWindow.on('close', (event) => { - if (forceClose) return; - event.preventDefault(); - mainWindow.webContents.executeJavaScript( - `Array.from(document.querySelectorAll('video')).some(v => v.srcObject?.active)` - ).then((isStreaming) => { - if (!isStreaming) { forceClose = true; mainWindow.close(); return; } - const result = dialog.showMessageBoxSync(mainWindow, { - type: 'warning', - buttons: ['Beenden', 'Abbrechen'], - defaultId: 1, - cancelId: 1, - title: 'Stream laeuft noch!', - message: 'Ein Stream ist noch aktiv.\nBeim Beenden wird der Stream gestoppt.', - }); - if (result === 0) { forceClose = true; mainWindow.close(); } - }).catch(() => { forceClose = true; mainWindow.close(); }); + if (!isStreaming) return; + const result = dialog.showMessageBoxSync(mainWindow, { + type: 'warning', + buttons: ['Beenden', 'Abbrechen'], + defaultId: 1, + cancelId: 1, + title: 'Stream laeuft noch!', + message: 'Ein Stream ist noch aktiv.\nBeim Beenden wird der Stream gestoppt.', + }); + if (result !== 0) event.preventDefault(); }); } diff --git a/electron/preload.js b/electron/preload.js index fedd04e..4c37118 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -6,4 +6,5 @@ contextBridge.exposeInMainWorld('electronAPI', { onUpdateAvailable: (callback) => ipcRenderer.on('update-available', callback), onUpdateReady: (callback) => ipcRenderer.on('update-ready', callback), installUpdate: () => ipcRenderer.send('install-update'), + setStreaming: (active) => ipcRenderer.send('streaming-status', active), }); diff --git a/web/src/plugins/streaming/StreamingTab.tsx b/web/src/plugins/streaming/StreamingTab.tsx index 97735be..3abaeb6 100644 --- a/web/src/plugins/streaming/StreamingTab.tsx +++ b/web/src/plugins/streaming/StreamingTab.tsx @@ -79,6 +79,11 @@ export default function StreamingTab({ data }: { data: any }) { useEffect(() => { isBroadcastingRef.current = isBroadcasting; }, [isBroadcasting]); useEffect(() => { viewingRef.current = viewing; }, [viewing]); + // Notify Electron about streaming status for close-warning + useEffect(() => { + (window as any).electronAPI?.setStreaming(isBroadcasting || viewing !== null); + }, [isBroadcasting, viewing]); + // ── Elapsed time ticker ── useEffect(() => { const hasActive = streams.length > 0 || isBroadcasting;