diff --git a/src/renderer/src/components/Terminal.tsx b/src/renderer/src/components/Terminal.tsx index d0318cb99..72eb5b692 100644 --- a/src/renderer/src/components/Terminal.tsx +++ b/src/renderer/src/components/Terminal.tsx @@ -896,6 +896,7 @@ function Terminal(): React.JSX.Element | null { layout={layout} worktreeId={worktree.id} focusedGroupId={activeGroupIdByWorktree[worktree.id]} + isWorktreeActive={isVisible} /> ) diff --git a/src/renderer/src/components/tab-group/TabGroupSplitLayout.test.ts b/src/renderer/src/components/tab-group/TabGroupSplitLayout.test.ts new file mode 100644 index 000000000..077133f13 --- /dev/null +++ b/src/renderer/src/components/tab-group/TabGroupSplitLayout.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, it, vi } from 'vitest' + +const setTabGroupSplitRatioMock = vi.fn() +const useAppStoreMock = vi.fn( + (selector: (state: { setTabGroupSplitRatio: () => void }) => unknown) => + selector({ setTabGroupSplitRatio: setTabGroupSplitRatioMock }) +) +vi.mock('../../store', () => ({ + useAppStore: (selector: (state: { setTabGroupSplitRatio: () => void }) => unknown) => + useAppStoreMock(selector) +})) + +vi.mock('./TabGroupPanel', () => ({ + default: (props: unknown) => ({ __mock: 'TabGroupPanel', props }) +})) + +import TabGroupSplitLayout from './TabGroupSplitLayout' + +describe('TabGroupSplitLayout', () => { + function getLeafPanelProps(isWorktreeActive: boolean) { + const element = TabGroupSplitLayout({ + layout: { type: 'leaf', groupId: 'group-1' }, + worktreeId: 'wt-1', + focusedGroupId: 'group-1', + isWorktreeActive + }) + + const splitNodeElement = element.props.children + const tabGroupPanelElement = splitNodeElement.type(splitNodeElement.props) + return tabGroupPanelElement.props as { + groupId: string + worktreeId: string + isFocused: boolean + hasSplitGroups: boolean + } + } + + it('does not mark an offscreen worktree group as focused', () => { + expect(getLeafPanelProps(false)).toEqual( + expect.objectContaining({ + groupId: 'group-1', + worktreeId: 'wt-1', + isFocused: false, + hasSplitGroups: false + }) + ) + }) + + it('keeps the visible worktree focused group active', () => { + expect(getLeafPanelProps(true)).toEqual( + expect.objectContaining({ + groupId: 'group-1', + worktreeId: 'wt-1', + isFocused: true, + hasSplitGroups: false + }) + ) + }) +}) diff --git a/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx b/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx index f19ed4300..9245f9ea1 100644 --- a/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx +++ b/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx @@ -84,12 +84,14 @@ function SplitNode({ nodePath, worktreeId, focusedGroupId, + isWorktreeActive, hasSplitGroups }: { node: TabGroupLayoutNode nodePath: string worktreeId: string focusedGroupId?: string + isWorktreeActive: boolean hasSplitGroups: boolean }): React.JSX.Element { const setTabGroupSplitRatio = useAppStore((state) => state.setTabGroupSplitRatio) @@ -99,7 +101,11 @@ function SplitNode({