summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-04-08 14:02:23 -0500
committerAdam <[email protected]>2026-04-08 14:02:23 -0500
commit689b1a4b3ab3c33aecc76b84c579b2efce444d6c (patch)
treee15a9ceaf044e75b15df7c0918aa9e145c808541 /packages/ui/src
parentd98be39344b8a39d16b62ce927be71a2c6a61a53 (diff)
downloadopencode-689b1a4b3ab3c33aecc76b84c579b2efce444d6c.tar.gz
opencode-689b1a4b3ab3c33aecc76b84c579b2efce444d6c.zip
fix(app): diff list normalization
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/session-review.tsx24
1 files changed, 23 insertions, 1 deletions
diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx
index 90da853ef..4a7205a5d 100644
--- a/packages/ui/src/components/session-review.tsx
+++ b/packages/ui/src/components/session-review.tsx
@@ -65,6 +65,26 @@ export type SessionReviewFocus = { file: string; id: string }
type ReviewDiff = (SnapshotFileDiff | VcsFileDiff) & { preloaded?: PreloadMultiFileDiffResult<any> }
type Item = ViewDiff & { preloaded?: PreloadMultiFileDiffResult<any> }
+function diff(value: unknown): value is ReviewDiff {
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false
+ if (!("file" in value) || typeof value.file !== "string") return false
+ if (!("additions" in value) || typeof value.additions !== "number") return false
+ if (!("deletions" in value) || typeof value.deletions !== "number") return false
+ if ("patch" in value && value.patch !== undefined && typeof value.patch !== "string") return false
+ if ("before" in value && value.before !== undefined && typeof value.before !== "string") return false
+ if ("after" in value && value.after !== undefined && typeof value.after !== "string") return false
+ if (!("status" in value) || value.status === undefined) return true
+ return value.status === "added" || value.status === "deleted" || value.status === "modified"
+}
+
+function list(value: unknown): ReviewDiff[] {
+ if (Array.isArray(value) && value.every(diff)) return value
+ if (Array.isArray(value)) return value.filter(diff)
+ if (diff(value)) return [value]
+ if (!value || typeof value !== "object") return []
+ return Object.values(value).filter(diff)
+}
+
export interface SessionReviewProps {
title?: JSX.Element
empty?: JSX.Element
@@ -157,7 +177,9 @@ export const SessionReview = (props: SessionReviewProps) => {
const opened = () => store.opened
const open = () => props.open ?? store.open
- const items = createMemo<Item[]>(() => props.diffs.map((diff) => ({ ...normalize(diff), preloaded: diff.preloaded })))
+ const items = createMemo<Item[]>(() =>
+ list(props.diffs).map((diff) => ({ ...normalize(diff), preloaded: diff.preloaded })),
+ )
const files = createMemo(() => items().map((diff) => diff.file))
const grouped = createMemo(() => {
const next = new Map<string, SessionReviewComment[]>()