diff options
Diffstat (limited to 'packages/app/src/context')
| -rw-r--r-- | packages/app/src/context/global-sync.tsx | 5 | ||||
| -rw-r--r-- | packages/app/src/context/sync.tsx | 60 |
2 files changed, 43 insertions, 22 deletions
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<string, State> }>({ ready: false, path: { state: "", config: "", worktree: "", directory: "", home: "" }, project: [], provider: { all: [], connected: [], default: {} }, provider_auth: {}, - children: {}, }) const children: Record<string, ReturnType<typeof createStore<State>>> = {} function child(directory: string) { if (!directory) console.error("No directory provided") if (!children[directory]) { - setGlobalStore("children", directory, { + children[directory] = createStore<State>({ 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) |
