diff --git a/src/ui/AppShell.tsx b/src/ui/AppShell.tsx index f20ecfaa3..8088b0f3b 100644 --- a/src/ui/AppShell.tsx +++ b/src/ui/AppShell.tsx @@ -383,7 +383,9 @@ export function AppShell({ setActiveTabId(id); } - function closeTab(id: string) { + const SESSION_TAB_TYPES: TabType[] = ["terminal", "rdp", "vnc", "telnet"]; + + function doCloseTab(id: string) { terminalRefs.current.delete(id); setTabs((prev) => { const next = prev.filter((t) => t.id !== id); @@ -392,6 +394,25 @@ export function AppShell({ }); } + function closeTab(id: string) { + const tab = tabs.find((t) => t.id === id); + if (tab && SESSION_TAB_TYPES.includes(tab.type)) { + toast(t("nav.confirmClose"), { + duration: 5000, + action: { + label: t("nav.close"), + onClick: () => doCloseTab(id), + }, + cancel: { + label: t("nav.cancel"), + onClick: () => {}, + }, + }); + return; + } + doCloseTab(id); + } + // ─── Rail / sidebar ────────────────────────────────────────────────────── function handleRailClick(view: RailView) { diff --git a/src/ui/locales/en.json b/src/ui/locales/en.json index 09855f4e6..69bc26269 100644 --- a/src/ui/locales/en.json +++ b/src/ui/locales/en.json @@ -385,6 +385,9 @@ "newTab": "New Tab", "splitScreen": "Split Screen", "closeTab": "Close Tab", + "confirmClose": "Close this active session?", + "close": "Close", + "cancel": "Cancel", "sshManager": "SSH Manager", "hostManager": "Host Manager", "cannotSplitTab": "Cannot split this tab", diff --git a/src/ui/locales/translated/zh_CN.json b/src/ui/locales/translated/zh_CN.json index 7177dada6..baa5e1bd9 100644 --- a/src/ui/locales/translated/zh_CN.json +++ b/src/ui/locales/translated/zh_CN.json @@ -555,6 +555,9 @@ "newTab": "新选项卡", "splitScreen": "分屏", "closeTab": "关闭选项卡", + "confirmClose": "确定关闭当前活跃会话?", + "close": "关闭", + "cancel": "取消", "sshManager": "SSH 管理器", "hostManager": "主机管理器", "cannotSplitTab": "无法拆分此选项卡",