diff options
| author | Adam <[email protected]> | 2026-04-08 14:02:23 -0500 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-04-08 14:02:23 -0500 |
| commit | 689b1a4b3ab3c33aecc76b84c579b2efce444d6c (patch) | |
| tree | e15a9ceaf044e75b15df7c0918aa9e145c808541 /packages/ui/src | |
| parent | d98be39344b8a39d16b62ce927be71a2c6a61a53 (diff) | |
| download | opencode-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.tsx | 24 |
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[]>() |
