summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src/components/session-review.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-31 09:23:24 -0600
committerAdam <[email protected]>2025-12-31 09:23:24 -0600
commit2ec6a21cc0018be6677e4cbad6bf48dbf8b37786 (patch)
tree6ad3f27288f660b4bba43772075c5138764f25b3 /packages/ui/src/components/session-review.tsx
parentebf5ad25c5f5cdf42bcb93199d9913f260ebe767 (diff)
downloadopencode-2ec6a21cc0018be6677e4cbad6bf48dbf8b37786.tar.gz
opencode-2ec6a21cc0018be6677e4cbad6bf48dbf8b37786.zip
feat(desktop): unified diff toggle
Diffstat (limited to 'packages/ui/src/components/session-review.tsx')
-rw-r--r--packages/ui/src/components/session-review.tsx18
1 files changed, 17 insertions, 1 deletions
diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx
index 9162b5216..9e6c633f4 100644
--- a/packages/ui/src/components/session-review.tsx
+++ b/packages/ui/src/components/session-review.tsx
@@ -1,5 +1,6 @@
import { Accordion } from "./accordion"
import { Button } from "./button"
+import { RadioGroup } from "./radio-group"
import { DiffChanges } from "./diff-changes"
import { FileIcon } from "./file-icon"
import { Icon } from "./icon"
@@ -13,8 +14,12 @@ import { PreloadMultiFileDiffResult } from "@pierre/diffs/ssr"
import { Dynamic } from "solid-js/web"
import { checksum } from "@opencode-ai/util/encode"
+export type SessionReviewDiffStyle = "unified" | "split"
+
export interface SessionReviewProps {
split?: boolean
+ diffStyle?: SessionReviewDiffStyle
+ onDiffStyleChange?: (diffStyle: SessionReviewDiffStyle) => void
class?: string
classList?: Record<string, boolean | undefined>
classes?: { root?: string; header?: string; container?: string }
@@ -28,6 +33,8 @@ export const SessionReview = (props: SessionReviewProps) => {
open: props.diffs.length > 10 ? [] : props.diffs.map((d) => d.file),
})
+ const diffStyle = () => props.diffStyle ?? (props.split ? "split" : "unified")
+
const handleChange = (open: string[]) => {
setStore("open", open)
}
@@ -60,6 +67,15 @@ export const SessionReview = (props: SessionReviewProps) => {
>
<div data-slot="session-review-title">Session changes</div>
<div data-slot="session-review-actions">
+ <Show when={props.onDiffStyleChange}>
+ <RadioGroup
+ options={["unified", "split"] as const}
+ current={diffStyle()}
+ value={(style) => style}
+ label={(style) => (style === "unified" ? "Unified" : "Split")}
+ onSelect={(style) => style && props.onDiffStyleChange?.(style)}
+ />
+ </Show>
<Button size="normal" icon="chevron-grabber-vertical" onClick={handleExpandOrCollapseAll}>
<Switch>
<Match when={store.open.length > 0}>Collapse all</Match>
@@ -102,7 +118,7 @@ export const SessionReview = (props: SessionReviewProps) => {
<Dynamic
component={diffComponent}
preloadedDiff={diff.preloaded}
- diffStyle={props.split ? "split" : "unified"}
+ diffStyle={diffStyle()}
before={{
name: diff.file!,
contents: diff.before!,