diff --git a/desktop/src/components/layout/TabBar.test.tsx b/desktop/src/components/layout/TabBar.test.tsx index 01a6b6e1..79984964 100644 --- a/desktop/src/components/layout/TabBar.test.tsx +++ b/desktop/src/components/layout/TabBar.test.tsx @@ -295,4 +295,42 @@ describe('TabBar', () => { expect(useTabStore.getState().tabs.map((tab) => tab.sessionId)).toEqual(['tab-1', 'tab-2']) expect(useTabStore.getState().activeTabId).toBe('tab-1') }) + + it('closes a tab from the close button without activating drag behavior', async () => { + const { TabBar } = await import('./TabBar') + const { useTabStore } = await import('../../stores/tabStore') + const { useChatStore } = await import('../../stores/chatStore') + + const disconnectSession = vi.fn() + + useTabStore.setState({ + tabs: [ + { sessionId: 'tab-1', title: 'First Session', type: 'session', status: 'idle' }, + { sessionId: 'tab-2', title: 'Second Session', type: 'session', status: 'idle' }, + ], + activeTabId: 'tab-2', + }) + useChatStore.setState({ + sessions: {}, + disconnectSession, + } as Partial>) + + await act(async () => { + render() + }) + + const firstTab = screen.getByText('First Session').closest('.tab-bar-hit-area') + const closeButton = screen.getByLabelText('Close First Session') + + expect(firstTab).toHaveClass('group') + + fireEvent.mouseDown(closeButton, { button: 0, clientX: 20, clientY: 10 }) + fireEvent.click(closeButton) + fireEvent.mouseMove(window, { clientX: 260, clientY: 10 }) + fireEvent.mouseUp(window) + + expect(disconnectSession).toHaveBeenCalledWith('tab-1') + expect(useTabStore.getState().tabs.map((tab) => tab.sessionId)).toEqual(['tab-2']) + expect(useTabStore.getState().activeTabId).toBe('tab-2') + }) }) diff --git a/desktop/src/components/layout/TabBar.tsx b/desktop/src/components/layout/TabBar.tsx index f9fc3a96..87cb0e8f 100644 --- a/desktop/src/components/layout/TabBar.tsx +++ b/desktop/src/components/layout/TabBar.tsx @@ -374,7 +374,7 @@ const TabItem = forwardRef )