Explorar o código

tui: add system theme resolution and event handling

Dax Raad hai 1 mes
pai
achega
91d5ce8bf3
Modificáronse 1 ficheiros con 35 adicións e 24 borrados
  1. 35 24
      packages/opencode/src/cli/cmd/tui/context/theme.tsx

+ 35 - 24
packages/opencode/src/cli/cmd/tui/context/theme.tsx

@@ -40,6 +40,7 @@ import { useRenderer } from "@opentui/solid"
 import { createStore, produce } from "solid-js/store"
 import { Global } from "@/global"
 import { Filesystem } from "@/util/filesystem"
+import { useSDK } from "./sdk"
 
 type ThemeColors = {
   primary: RGBA
@@ -310,32 +311,42 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
         })
     })
 
-    const renderer = useRenderer()
-    renderer
-      .getPalette({
-        size: 16,
-      })
-      .then((colors) => {
-        if (!colors.palette[0]) {
-          if (store.active === "system") {
-            setStore(
-              produce((draft) => {
-                draft.active = "opencode"
-                draft.ready = true
-              }),
-            )
-          }
-          return
-        }
-        setStore(
-          produce((draft) => {
-            draft.themes.system = generateSystem(colors, store.mode)
+    function resolveSystemTheme() {
+      console.log("resolved system theme")
+      renderer
+        .getPalette({
+          size: 16,
+        })
+        .then((colors) => {
+          if (!colors.palette[0]) {
             if (store.active === "system") {
-              draft.ready = true
+              setStore(
+                produce((draft) => {
+                  draft.active = "opencode"
+                  draft.ready = true
+                }),
+              )
             }
-          }),
-        )
-      })
+            return
+          }
+          setStore(
+            produce((draft) => {
+              draft.themes.system = generateSystem(colors, store.mode)
+              if (store.active === "system") {
+                draft.ready = true
+              }
+            }),
+          )
+        })
+    }
+
+    const renderer = useRenderer()
+    resolveSystemTheme()
+
+    const sdk = useSDK()
+    sdk.event.on("server.instance.disposed", () => {
+      resolveSystemTheme()
+    })
 
     const values = createMemo(() => {
       return resolveTheme(store.themes[store.active] ?? store.themes.opencode, store.mode)