summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-04-28 12:24:30 +0800
committerGitHub <[email protected]>2026-04-28 04:24:30 +0000
commitc8d9f7aa892ab46b9d6aa839d414451e8cd6b02a (patch)
treeb14b4355ea358fcc635df8d89162037ab470f505 /packages/app/src/components
parentcd7ec93cdfad5f35582c4b993eba5675da2ccd65 (diff)
downloadopencode-c8d9f7aa892ab46b9d6aa839d414451e8cd6b02a.tar.gz
opencode-c8d9f7aa892ab46b9d6aa839d414451e8cd6b02a.zip
refactor(app): load sync state through TanStack Query (#23792)
Diffstat (limited to 'packages/app/src/components')
-rw-r--r--packages/app/src/components/dialog-select-mcp.tsx62
-rw-r--r--packages/app/src/components/status-popover-body.tsx49
2 files changed, 11 insertions, 100 deletions
diff --git a/packages/app/src/components/dialog-select-mcp.tsx b/packages/app/src/components/dialog-select-mcp.tsx
index 98f262ce5..9bb36d32d 100644
--- a/packages/app/src/components/dialog-select-mcp.tsx
+++ b/packages/app/src/components/dialog-select-mcp.tsx
@@ -1,13 +1,12 @@
-import { useMutation } from "@tanstack/solid-query"
-import { Component, createEffect, createMemo, on, Show } from "solid-js"
-import { createStore } from "solid-js/store"
+import { useMutation, useQueryClient } from "@tanstack/solid-query"
+import { Component, createMemo, Show } from "solid-js"
import { useSync } from "@/context/sync"
import { useSDK } from "@/context/sdk"
import { Dialog } from "@opencode-ai/ui/dialog"
import { List } from "@opencode-ai/ui/list"
import { Switch } from "@opencode-ai/ui/switch"
-import { showToast } from "@opencode-ai/ui/toast"
import { useLanguage } from "@/context/language"
+import { loadMcpQuery } from "@/context/global-sync"
const statusLabels = {
connected: "mcp.status.connected",
@@ -20,48 +19,7 @@ export const DialogSelectMcp: Component = () => {
const sync = useSync()
const sdk = useSDK()
const language = useLanguage()
- const [state, setState] = createStore({
- done: false,
- loading: false,
- })
-
- createEffect(
- on(
- () => sync.data.mcp_ready,
- (ready, prev) => {
- if (!ready && prev) setState("done", false)
- },
- { defer: true },
- ),
- )
-
- createEffect(() => {
- if (state.done || state.loading) return
- if (sync.data.mcp_ready) {
- setState("done", true)
- return
- }
-
- setState("loading", true)
- void sdk.client.mcp
- .status()
- .then((result) => {
- sync.set("mcp", result.data ?? {})
- sync.set("mcp_ready", true)
- setState("done", true)
- })
- .catch((err) => {
- setState("done", true)
- showToast({
- variant: "error",
- title: language.t("common.requestFailed"),
- description: err instanceof Error ? err.message : String(err),
- })
- })
- .finally(() => {
- setState("loading", false)
- })
- })
+ const queryClient = useQueryClient()
const items = createMemo(() =>
Object.entries(sync.data.mcp ?? {})
@@ -71,16 +29,10 @@ export const DialogSelectMcp: Component = () => {
const toggle = useMutation(() => ({
mutationFn: async (name: string) => {
- const status = sync.data.mcp[name]
- if (status?.status === "connected") {
- await sdk.client.mcp.disconnect({ name })
- } else {
- await sdk.client.mcp.connect({ name })
- }
-
- const result = await sdk.client.mcp.status()
- if (result.data) sync.set("mcp", result.data)
+ if (sync.data.mcp[name]?.status === "connected") await sdk.client.mcp.disconnect({ name })
+ else await sdk.client.mcp.connect({ name })
},
+ onSuccess: () => queryClient.refetchQueries({ queryKey: loadMcpQuery(sync.directory).queryKey }),
}))
const enabledCount = createMemo(() => items().filter((i) => i.status === "connected").length)
diff --git a/packages/app/src/components/status-popover-body.tsx b/packages/app/src/components/status-popover-body.tsx
index 0f6a1c135..952e3eac6 100644
--- a/packages/app/src/components/status-popover-body.tsx
+++ b/packages/app/src/components/status-popover-body.tsx
@@ -3,7 +3,7 @@ import { useDialog } from "@opencode-ai/ui/context/dialog"
import { Icon } from "@opencode-ai/ui/icon"
import { Switch } from "@opencode-ai/ui/switch"
import { Tabs } from "@opencode-ai/ui/tabs"
-import { useMutation } from "@tanstack/solid-query"
+import { useMutation, useQueryClient } from "@tanstack/solid-query"
import { showToast } from "@opencode-ai/ui/toast"
import { useNavigate } from "@solidjs/router"
import { type Accessor, createEffect, createMemo, For, type JSXElement, onCleanup, Show } from "solid-js"
@@ -15,6 +15,7 @@ import { useSDK } from "@/context/sdk"
import { normalizeServerUrl, ServerConnection, useServer } from "@/context/server"
import { useSync } from "@/context/sync"
import { useCheckServerHealth, type ServerHealth } from "@/utils/server-health"
+import { loadMcpQuery } from "@/context/global-sync"
const pollMs = 10_000
@@ -137,14 +138,14 @@ const useMcpToggleMutation = () => {
const sync = useSync()
const sdk = useSDK()
const language = useLanguage()
+ const queryClient = useQueryClient()
return useMutation(() => ({
mutationFn: async (name: string) => {
const status = sync.data.mcp[name]
await (status?.status === "connected" ? sdk.client.mcp.disconnect({ name }) : sdk.client.mcp.connect({ name }))
- const result = await sdk.client.mcp.status()
- if (result.data) sync.set("mcp", result.data)
},
+ onSuccess: () => queryClient.refetchQueries({ queryKey: loadMcpQuery(sync.directory).queryKey }),
onError: (err) => {
showToast({
variant: "error",
@@ -162,14 +163,6 @@ export function StatusPopoverBody(props: { shown: Accessor<boolean> }) {
const dialog = useDialog()
const language = useLanguage()
const navigate = useNavigate()
- const sdk = useSDK()
-
- const [load, setLoad] = createStore({
- lspDone: false,
- lspLoading: false,
- mcpDone: false,
- mcpLoading: false,
- })
const fail = (err: unknown) => {
showToast({
@@ -181,40 +174,6 @@ export function StatusPopoverBody(props: { shown: Accessor<boolean> }) {
createEffect(() => {
if (!props.shown()) return
-
- if (!sync.data.mcp_ready && !load.mcpDone && !load.mcpLoading) {
- setLoad("mcpLoading", true)
- void sdk.client.mcp
- .status()
- .then((result) => {
- sync.set("mcp", result.data ?? {})
- sync.set("mcp_ready", true)
- })
- .catch((err) => {
- setLoad("mcpDone", true)
- fail(err)
- })
- .finally(() => {
- setLoad("mcpLoading", false)
- })
- }
-
- if (!sync.data.lsp_ready && !load.lspDone && !load.lspLoading) {
- setLoad("lspLoading", true)
- void sdk.client.lsp
- .status()
- .then((result) => {
- sync.set("lsp", result.data ?? [])
- sync.set("lsp_ready", true)
- })
- .catch((err) => {
- setLoad("lspDone", true)
- fail(err)
- })
- .finally(() => {
- setLoad("lspLoading", false)
- })
- }
})
let dialogRun = 0