diff --git a/packages/tui/src/feature-plugins/system/diff-viewer.tsx b/packages/tui/src/feature-plugins/system/diff-viewer.tsx index ff66c8319401..0e333fffcca3 100644 --- a/packages/tui/src/feature-plugins/system/diff-viewer.tsx +++ b/packages/tui/src/feature-plugins/system/diff-viewer.tsx @@ -355,6 +355,7 @@ export function DiffViewerContent(props: { const [expandedFileNodes, setExpandedFileNodes] = createSignal>(new Set()) const [selectedFileIndex, setSelectedFileIndex] = createSignal() const [reviewedFileNames, setReviewedFileNames] = createSignal>(new Set()) + const [exhaustedFileIndex, setExhaustedFileIndex] = createSignal() const [fileMenu, setFileMenu] = createSignal() const patchScrollAcceleration = createMemo(() => getScrollAcceleration(config.data)) const patchFileIndexes = createMemo(() => orderedPatchFileIndexes(flattenFileTree(fileTree()))) @@ -370,6 +371,7 @@ export function DiffViewerContent(props: { setSelectedFileIndex(undefined) setSelectedHunk(undefined) setReviewedFileNames(new Set()) + setExhaustedFileIndex(undefined) setFileMenu(undefined) }) @@ -404,6 +406,7 @@ export function DiffViewerContent(props: { const selectPatchFile = (fileIndex: number) => { setPendingPatchScrollFileIndex(undefined) + setExhaustedFileIndex(undefined) revealFileTreeFile(fileIndex) setSelectedFileIndex(fileIndex) } @@ -564,6 +567,7 @@ export function DiffViewerContent(props: { const nextFileIndex = singlePatch() && !reviewed ? (movePatchFileIndex(patchFileIndexes(), fileIndex, 1) ?? fileIndex) : fileIndex selectPatchFile(nextFileIndex) + if (singlePatch() && !reviewed && nextFileIndex === fileIndex) setExhaustedFileIndex(fileIndex) setSelectedHunk(undefined) scrollToPatchFileIndexAfterRender(nextFileIndex) } @@ -685,7 +689,9 @@ export function DiffViewerContent(props: { title: "Toggle selected diff file reviewed", group: "VCS", run() { - toggleFileReviewed(selectedFileIndex() ?? currentPatchFileIndex()) + const fileIndex = selectedFileIndex() ?? currentPatchFileIndex() + if (fileIndex !== undefined && fileIndex === exhaustedFileIndex()) return + toggleFileReviewed(fileIndex) }, }, { diff --git a/packages/tui/test/cli/tui/diff-viewer.test.tsx b/packages/tui/test/cli/tui/diff-viewer.test.tsx index 3203d36abdc3..86a58426119f 100644 --- a/packages/tui/test/cli/tui/diff-viewer.test.tsx +++ b/packages/tui/test/cli/tui/diff-viewer.test.tsx @@ -1496,6 +1496,9 @@ test.each([80, 160])( expect(viewer.app.renderer.root.findDescendantById("diff-file-header-2")).toBeDefined() expect(viewer.app.renderer.root.findDescendantById("diff-file-header-0")).toBeUndefined() expect(findDiffs(viewer.app.renderer.root)).toHaveLength(0) + viewer.app.mockInput.pressKey("m") + await viewer.app.flush() + expect(findDiffs(viewer.app.renderer.root)).toHaveLength(0) viewer.app.mockInput.pressKey("?") await viewer.app.waitForFrame((frame) => frame.includes("Review + next / reopen"))