From c0f9b136309f870e45412fdc733e1b989e8146c7 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Mon, 29 Dec 2025 08:21:32 -0600 Subject: fix(desktop): more fine-grained state updates --- packages/app/src/context/global-sync.tsx | 5 +-- packages/app/src/context/sync.tsx | 60 ++++++++++++++++++++++---------- 2 files changed, 43 insertions(+), 22 deletions(-) (limited to 'packages/app/src/context') diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx index a496d59cb..0296dfad3 100644 --- a/packages/app/src/context/global-sync.tsx +++ b/packages/app/src/context/global-sync.tsx @@ -71,21 +71,19 @@ function createGlobalSync() { project: Project[] provider: ProviderListResponse provider_auth: ProviderAuthResponse - children: Record }>({ ready: false, path: { state: "", config: "", worktree: "", directory: "", home: "" }, project: [], provider: { all: [], connected: [], default: {} }, provider_auth: {}, - children: {}, }) const children: Record>> = {} function child(directory: string) { if (!directory) console.error("No directory provided") if (!children[directory]) { - setGlobalStore("children", directory, { + children[directory] = createStore({ project: "", provider: { all: [], connected: [], default: {} }, config: {}, @@ -105,7 +103,6 @@ function createGlobalSync() { message: {}, part: {}, }) - children[directory] = createStore(globalStore.children[directory]) bootstrapInstance(directory) } return children[directory] diff --git a/packages/app/src/context/sync.tsx b/packages/app/src/context/sync.tsx index 941b8b629..dad035fb3 100644 --- a/packages/app/src/context/sync.tsx +++ b/packages/app/src/context/sync.tsx @@ -1,5 +1,5 @@ -import { produce } from "solid-js/store" -import { createMemo } from "solid-js" +import { batch, createMemo } from "solid-js" +import { produce, reconcile } from "solid-js/store" import { Binary } from "@opencode-ai/util/binary" import { retry } from "@opencode-ai/util/retry" import { createSimpleContext } from "@opencode-ai/ui/context" @@ -67,22 +67,46 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ retry(() => sdk.client.session.todo({ sessionID })), retry(() => sdk.client.session.diff({ sessionID })), ]) - setStore( - produce((draft) => { - const match = Binary.search(draft.session, sessionID, (s) => s.id) - if (match.found) draft.session[match.index] = session.data! - if (!match.found) draft.session.splice(match.index, 0, session.data!) - draft.todo[sessionID] = todo.data ?? [] - draft.message[sessionID] = messages - .data!.map((x) => x.info) - .slice() - .sort((a, b) => a.id.localeCompare(b.id)) - for (const message of messages.data!) { - draft.part[message.info.id] = message.parts.slice().sort((a, b) => a.id.localeCompare(b.id)) - } - draft.session_diff[sessionID] = diff.data ?? [] - }), - ) + + batch(() => { + setStore( + "session", + produce((draft) => { + const match = Binary.search(draft, sessionID, (s) => s.id) + if (match.found) { + draft[match.index] = session.data! + return + } + draft.splice(match.index, 0, session.data!) + }), + ) + + setStore("todo", sessionID, reconcile(todo.data ?? [])) + setStore( + "message", + sessionID, + reconcile( + (messages.data ?? []) + .map((x) => x.info) + .slice() + .sort((a, b) => a.id.localeCompare(b.id)), + { key: "id" }, + ), + ) + + for (const message of messages.data ?? []) { + setStore( + "part", + message.info.id, + reconcile( + message.parts.slice().sort((a, b) => a.id.localeCompare(b.id)), + { key: "id" }, + ), + ) + } + + setStore("session_diff", sessionID, reconcile(diff.data ?? [], { key: "file" })) + }) }, fetch: async (count = 10) => { setStore("limit", (x) => x + count) -- cgit v1.2.3