diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue index 6428fed..f66ad5b 100644 --- a/src/layouts/MainLayout.vue +++ b/src/layouts/MainLayout.vue @@ -450,15 +450,28 @@ onMounted(async () => { } catch {} }, 500); - // Save workspace on window close (non-fatal) + // Confirm close + save workspace on window close try { const { getCurrentWindow } = await import("@tauri-apps/api/window"); const appWindow = getCurrentWindow(); - appWindow.onCloseRequested(async () => { - const tabs = sessionStore.sessions - .filter(s => s.protocol === "ssh" || s.protocol === "rdp") - .map((s, i) => ({ connectionId: s.connectionId, protocol: s.protocol, position: i })); - await invoke("save_workspace", { tabs }).catch(() => {}); + appWindow.onCloseRequested(async (event) => { + // Ask for confirmation if there are active sessions + if (sessionStore.sessions.length > 0) { + if (!confirm("Are you sure you want to close Wraith?")) { + event.preventDefault(); + return; + } + } + // Save workspace before closing (with timeout to prevent hang) + try { + const tabs = sessionStore.sessions + .filter(s => s.protocol === "ssh" || s.protocol === "rdp") + .map((s, i) => ({ connectionId: s.connectionId, protocol: s.protocol, position: i })); + await Promise.race([ + invoke("save_workspace", { tabs }), + new Promise(resolve => setTimeout(resolve, 2000)), + ]); + } catch {} }); } catch {}