diff --git a/apps/web/src/components/pr/pr-diff-viewer.tsx b/apps/web/src/components/pr/pr-diff-viewer.tsx index 854fb1a..76bf47d 100644 --- a/apps/web/src/components/pr/pr-diff-viewer.tsx +++ b/apps/web/src/components/pr/pr-diff-viewer.tsx @@ -61,6 +61,7 @@ import { ClientMarkdown } from "@/components/shared/client-markdown"; import { CheckStatusBadge } from "@/components/pr/check-status-badge"; import { useMutationEvents } from "@/components/shared/mutation-event-provider"; import { UserTooltip } from "@/components/shared/user-tooltip"; +import { getDiffPreferences, setSplitView, setWordWrap } from "@/lib/diff-preferences"; interface DiffFile { filename: string; @@ -158,8 +159,8 @@ export function PRDiffViewer({ } return 0; }); - const [wordWrap, setWordWrap] = useState(true); - const [splitView, setSplitView] = useState(false); + const [wordWrap, setWordWrapState] = useState(() => getDiffPreferences().wordWrap); + const [splitView, setSplitViewState] = useState(() => getDiffPreferences().splitView); const [sidebarWidth, setSidebarWidth] = useState(220); const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const [isDragging, setIsDragging] = useState(false); @@ -543,8 +544,18 @@ export function PRDiffViewer({ total={files.length} wordWrap={wordWrap} splitView={splitView} - onToggleWrap={() => setWordWrap((w) => !w)} - onToggleSplit={() => setSplitView((s) => !s)} + onToggleWrap={() => { + setWordWrapState((w) => { + setWordWrap(!w); + return !w; + }); + }} + onToggleSplit={() => { + setSplitViewState((s) => { + setSplitView(!s); + return !s; + }); + }} sidebarCollapsed={sidebarCollapsed} onToggleSidebar={() => setSidebarCollapsed((c) => !c) diff --git a/apps/web/src/lib/diff-preferences.ts b/apps/web/src/lib/diff-preferences.ts new file mode 100644 index 0000000..3ee9ef6 --- /dev/null +++ b/apps/web/src/lib/diff-preferences.ts @@ -0,0 +1,43 @@ +const STORAGE_KEY = "better-github-diff-preferences"; + +export interface DiffPreferences { + splitView: boolean; + wordWrap: boolean; +} + +const DEFAULT_PREFERENCES: DiffPreferences = { + splitView: false, + wordWrap: true, +}; + +export function getDiffPreferences(): DiffPreferences { + if (typeof window === "undefined") return DEFAULT_PREFERENCES; + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return DEFAULT_PREFERENCES; + const parsed = JSON.parse(raw) as Partial; + return { ...DEFAULT_PREFERENCES, ...parsed }; + } catch { + return DEFAULT_PREFERENCES; + } +} + +export function setDiffPreferences(prefs: Partial): DiffPreferences { + if (typeof window === "undefined") return DEFAULT_PREFERENCES; + try { + const current = getDiffPreferences(); + const updated = { ...current, ...prefs }; + localStorage.setItem(STORAGE_KEY, JSON.stringify(updated)); + return updated; + } catch { + return getDiffPreferences(); + } +} + +export function setSplitView(splitView: boolean): void { + setDiffPreferences({ splitView }); +} + +export function setWordWrap(wordWrap: boolean): void { + setDiffPreferences({ wordWrap }); +}