Просмотр исходного кода

fix(app): properly wrap produce calls in setProjects (#23638)

Brendan Allan 4 месяцев назад
Родитель
Сommit
22d33c57af

+ 3 - 8
packages/app/src/context/global-sync.tsx

@@ -10,7 +10,7 @@ import type {
 import { showToast } from "@opencode-ai/ui/toast"
 import { getFilename } from "@opencode-ai/shared/util/path"
 import { batch, createContext, getOwner, onCleanup, onMount, type ParentProps, untrack, useContext } from "solid-js"
-import { createStore, produce, reconcile } from "solid-js/store"
+import { createStore, produce, reconcile, unwrap } from "solid-js/store"
 import { useLanguage } from "@/context/language"
 import { Persist, persisted } from "@/utils/persist"
 import type { InitError } from "../pages/error"
@@ -95,13 +95,8 @@ function createGlobalSync() {
     )
   }
 
-  const setProjects = (next: Project[] | ((draft: Project[]) => void)) => {
+  const setProjects = (next: Project[] | ((draft: Project[]) => Project[])) => {
     projectWritten = true
-    if (typeof next === "function") {
-      setGlobalStore("project", produce(next))
-      cacheProjects()
-      return
-    }
     setGlobalStore("project", next)
     cacheProjects()
   }
@@ -116,7 +111,7 @@ function createGlobalSync() {
 
   const set = ((...input: unknown[]) => {
     if (input[0] === "project" && (Array.isArray(input[1]) || typeof input[1] === "function")) {
-      setProjects(input[1] as Project[] | ((draft: Project[]) => void))
+      setProjects(input[1] as Project[] | ((draft: Project[]) => Project[]))
       return input[1]
     }
     return (setGlobalStore as (...args: unknown[]) => unknown)(...input)

+ 11 - 7
packages/app/src/context/global-sync/event-reducer.ts

@@ -21,7 +21,7 @@ const SKIP_PARTS = new Set(["patch", "step-start", "step-finish"])
 export function applyGlobalEvent(input: {
   event: { type: string; properties?: unknown }
   project: Project[]
-  setGlobalProject: (next: Project[] | ((draft: Project[]) => void)) => void
+  setGlobalProject: (next: Project[] | ((draft: Project[]) => Project[])) => void
   refresh: () => void
 }) {
   if (input.event.type === "global.disposed" || input.event.type === "server.connected") {
@@ -33,14 +33,18 @@ export function applyGlobalEvent(input: {
   const properties = input.event.properties as Project
   const result = Binary.search(input.project, properties.id, (s) => s.id)
   if (result.found) {
-    input.setGlobalProject((draft) => {
-      draft[result.index] = { ...draft[result.index], ...properties }
-    })
+    input.setGlobalProject(
+      produce((draft) => {
+        draft[result.index] = { ...draft[result.index], ...properties }
+      }),
+    )
     return
   }
-  input.setGlobalProject((draft) => {
-    draft.splice(result.index, 0, properties)
-  })
+  input.setGlobalProject(
+    produce((draft) => {
+      draft.splice(result.index, 0, properties)
+    }),
+  )
 }
 
 function cleanupSessionCaches(