Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions apps/desktop/src/renderer/stores/tabs/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -966,8 +966,13 @@ export const useTabsStore = create<TabsStore>()(

// If clicking the same file that's already in preview, just focus it
if (isSameFile) {
const nextViewMode =
options.viewMode ?? existingFileViewer.viewMode;
// Conflicted files must default to the conflict viewer even
// when callers do not pass an explicit viewMode.
const conflictFallbackViewMode =
options.diffCategory === "conflicted"
? "conflict"
: existingFileViewer.viewMode;
const nextViewMode = options.viewMode ?? conflictFallbackViewMode;
const shouldUpdateViewerState =
nextViewMode !== existingFileViewer.viewMode ||
options.line !== undefined ||
Expand Down
47 changes: 47 additions & 0 deletions apps/desktop/src/renderer/stores/tabs/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,53 @@ describe("applyFileViewerOpenOptionsToPane", () => {
initialColumn: 7,
});
});

it("forces conflict viewer for conflicted files when no explicit viewMode is provided", () => {
const pane: Pane = {
id: "pane-a",
tabId: "tab-a",
type: "file-viewer",
name: "file.ts",
fileViewer: {
filePath: "/repo/file.ts",
viewMode: "raw",
isPinned: false,
diffLayout: "inline",
diffCategory: "conflicted",
},
};

const result = applyFileViewerOpenOptionsToPane(pane, {
filePath: "/repo/file.ts",
diffCategory: "conflicted",
});

expect(result.fileViewer?.viewMode).toBe("conflict");
});

it("preserves explicit viewMode for conflicted files", () => {
const pane: Pane = {
id: "pane-a",
tabId: "tab-a",
type: "file-viewer",
name: "file.ts",
fileViewer: {
filePath: "/repo/file.ts",
viewMode: "raw",
isPinned: false,
diffLayout: "inline",
diffCategory: "conflicted",
},
};

const result = applyFileViewerOpenOptionsToPane(pane, {
filePath: "/repo/file.ts",
diffCategory: "conflicted",
viewMode: "raw",
});

expect(result.fileViewer?.viewMode).toBe("raw");
});
});

describe("activatePaneInWorkspace", () => {
Expand Down
10 changes: 9 additions & 1 deletion apps/desktop/src/renderer/stores/tabs/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -980,9 +980,17 @@ export const applyFileViewerOpenOptionsToPane = (
return pane;
}

// Conflicted files must render in the conflict viewer. If the reused pane
// has a stale non-conflict viewMode (e.g. was opened as raw before the
// merge marked the file as conflicted), force it back to "conflict" when
// no explicit override is provided.
const fallbackViewMode =
options.diffCategory === "conflicted"
? "conflict"
: pane.fileViewer.viewMode;
const nextFileViewer: FileViewerState = {
...pane.fileViewer,
viewMode: options.viewMode ?? pane.fileViewer.viewMode,
viewMode: options.viewMode ?? fallbackViewMode,
isPinned: pane.fileViewer.isPinned || (options.isPinned ?? false),
oldPath: options.oldPath ?? pane.fileViewer.oldPath,
initialLine: options.line ?? pane.fileViewer.initialLine,
Expand Down
Loading