Skip to content
Closed
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
69 changes: 69 additions & 0 deletions packages/app/src/context/global-sync/event-reducer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,75 @@ describe("applyDirectoryEvent", () => {
expect(cacheStore.value).toEqual({ branch: "feature/test", default_branch: "main" })
})

test("session.diff stores array diffs in session_diff", () => {
const [store, setStore] = createStore(baseState())

applyDirectoryEvent({
event: {
type: "session.diff",
properties: {
sessionID: "ses_1",
diff: [{ file: "a.txt", before: "", after: "hello", additions: 1, deletions: 0, status: "added" }],
},
},
store,
setStore,
push() {},
directory: "/tmp",
loadLsp() {},
})

expect(Array.isArray(store.session_diff.ses_1)).toBe(true)
expect(store.session_diff.ses_1?.length).toBe(1)
expect(store.session_diff.ses_1?.[0]?.file).toBe("a.txt")
})

test("session.diff handles undefined diff gracefully", () => {
const [store, setStore] = createStore(baseState())

applyDirectoryEvent({
event: {
type: "session.diff",
properties: {
sessionID: "ses_1",
diff: undefined,
},
},
store,
setStore,
push() {},
directory: "/tmp",
loadLsp() {},
})

const result = store.session_diff.ses_1
expect(Array.isArray(result)).toBe(true)
expect(result?.length).toBe(0)
})

test("session.diff handles non-array diff gracefully", () => {
const [store, setStore] = createStore(baseState())

applyDirectoryEvent({
event: {
type: "session.diff",
properties: {
sessionID: "ses_1",
diff: { file: "a.txt" } as any,
},
},
store,
setStore,
push() {},
directory: "/tmp",
loadLsp() {},
})

const result = store.session_diff.ses_1
expect(Array.isArray(result)).toBe(true)
expect(result?.length).toBe(0)
})

test("routes disposal and lsp events to side-effect handlers", () => {
const [store, setStore] = createStore(baseState())
const pushes: string[] = []
Expand Down
3 changes: 2 additions & 1 deletion packages/app/src/context/global-sync/event-reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,8 @@ export function applyDirectoryEvent(input: {
}
case "session.diff": {
const props = event.properties as { sessionID: string; diff: FileDiff[] }
input.setStore("session_diff", props.sessionID, reconcile(props.diff, { key: "file" }))
const diff = Array.isArray(props.diff) ? props.diff : []
input.setStore("session_diff", props.sessionID, reconcile(diff, { key: "file" }))
break
}
case "todo.updated": {
Expand Down
5 changes: 3 additions & 2 deletions packages/ui/src/components/session-review.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ export const SessionReview = (props: SessionReviewProps) => {
const opened = () => store.opened

const open = () => props.open ?? store.open
const files = createMemo(() => props.diffs.map((diff) => diff.file))
const safeDiffs = () => (Array.isArray(props.diffs) ? props.diffs : [])
const files = createMemo(() => safeDiffs().map((diff) => diff.file))
const diffStyle = () => props.diffStyle ?? (props.split ? "split" : "unified")
const hasDiffs = () => files().length > 0

Expand Down Expand Up @@ -281,7 +282,7 @@ export const SessionReview = (props: SessionReviewProps) => {
<Show when={hasDiffs()} fallback={props.empty}>
<div class="pb-6">
<Accordion multiple value={open()} onChange={handleChange}>
<For each={props.diffs}>
<For each={safeDiffs()}>
{(diff) => {
let wrapper: HTMLDivElement | undefined
const file = diff.file
Expand Down
Loading