From 53e018a1a6338fe40a676426266caff6e0a623bb Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Wed, 22 Jul 2026 13:46:05 -0700 Subject: [PATCH] fix(terminal): make SSH reconnect UI non-blocking (#9928) --- .../TerminalSshReconnectOverlay.test.tsx | 8 +- .../TerminalSshReconnectOverlay.tsx | 122 +++++++++--------- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.test.tsx b/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.test.tsx index 7f46a518153..f7673be13ba 100644 --- a/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.test.tsx +++ b/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.test.tsx @@ -69,12 +69,12 @@ describe('TerminalSshReconnectOverlay', () => { cleanup() }) - it('renders a direct Connect action for a disconnected SSH terminal', async () => { + it('renders a non-blocking Connect banner for a disconnected SSH terminal', async () => { const connect = vi.fn().mockResolvedValue(undefined) installSshConnect(connect) const user = userEvent.setup() - render( + const { container } = render( { expect(screen.getByText('SSH connection required')).toBeInTheDocument() expect(screen.getByText(/This terminal is waiting for devbox/)).toBeInTheDocument() + expect(screen.getByRole('status')).toBeInTheDocument() + const banner = container.querySelector('[data-terminal-ssh-reconnect-banner="disconnected"]') + expect(banner).toHaveClass('inset-x-3', 'bottom-3') + expect(banner).not.toHaveClass('inset-0', 'bg-background/75') await user.click(screen.getByRole('button', { name: 'Connect' })) expect(connect).toHaveBeenCalledWith({ targetId: 'ssh-target-1' }) diff --git a/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.tsx b/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.tsx index b3ee59833c5..a90e16c2a04 100644 --- a/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.tsx +++ b/src/renderer/src/components/terminal-pane/TerminalSshReconnectOverlay.tsx @@ -138,20 +138,24 @@ export function TerminalSshReconnectOverlay({ return (
-
-
-
- {isConnecting ? ( - - ) : ( - - )} -
-
-
+
+
+ {isConnecting ? ( + + ) : ( + + )} +
+
+
+
{targetRemoved ? translate( 'auto.components.terminal.pane.TerminalSshReconnectOverlay.removedTitle', @@ -162,56 +166,56 @@ export function TerminalSshReconnectOverlay({ 'SSH connection required' )}
-
- {targetRemoved - ? translate( - 'auto.components.terminal.pane.TerminalSshReconnectOverlay.removedBody', - 'The SSH host for this workspace was removed, so it can no longer connect. Remove the workspace to clear it — remote files are left untouched.' - ) - : messageForStatus(status, targetLabel)} +
+ + {targetLabel}
-
-
-
- - {targetLabel} -
- {targetRemoved ? ( - - ) : ( - - )} + : messageForStatus(status, targetLabel)} +
+ {targetRemoved ? ( + + ) : ( + + )}
)