diff options
| author | Brendan Allan <[email protected]> | 2026-03-12 16:10:52 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-03-12 08:10:52 +0000 |
| commit | b76ead3fe80a6159fdbfcc9b82c7c6318be68e7f (patch) | |
| tree | bad16ba8185403eb9dc97b6c996bbfa78ae7918b /packages/app/src/components | |
| parent | 51835ecf90e23b34957f4dde843bbba1134f17fe (diff) | |
| download | opencode-b76ead3fe80a6159fdbfcc9b82c7c6318be68e7f.tar.gz opencode-b76ead3fe80a6159fdbfcc9b82c7c6318be68e7f.zip | |
refactor(desktop): rework default server initialization and connection handling (#16965)
Diffstat (limited to 'packages/app/src/components')
| -rw-r--r-- | packages/app/src/components/dialog-select-server.tsx | 54 | ||||
| -rw-r--r-- | packages/app/src/components/status-popover.tsx | 12 |
2 files changed, 35 insertions, 31 deletions
diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx index 3ecd26910..cba401a46 100644 --- a/packages/app/src/components/dialog-select-server.tsx +++ b/packages/app/src/components/dialog-select-server.tsx @@ -14,7 +14,7 @@ import { ServerHealthIndicator, ServerRow } from "@/components/server/server-row import { useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" import { normalizeServerUrl, ServerConnection, useServer } from "@/context/server" -import { checkServerHealth, type ServerHealth } from "@/utils/server-health" +import { type ServerHealth, useCheckServerHealth } from "@/utils/server-health" const DEFAULT_USERNAME = "opencode" @@ -43,13 +43,15 @@ function showRequestError(language: ReturnType<typeof useLanguage>, err: unknown }) } -function useDefaultServer(platform: ReturnType<typeof usePlatform>, language: ReturnType<typeof useLanguage>) { - const [defaultUrl, defaultUrlActions] = createResource( +function useDefaultServer() { + const language = useLanguage() + const platform = usePlatform() + const [defaultKey, defaultUrlActions] = createResource( async () => { try { - const url = await platform.getDefaultServerUrl?.() - if (!url) return null - return normalizeServerUrl(url) ?? null + const key = await platform.getDefaultServer?.() + if (!key) return null + return key } catch (err) { showRequestError(language, err) return null @@ -58,20 +60,22 @@ function useDefaultServer(platform: ReturnType<typeof usePlatform>, language: Re { initialValue: null }, ) - const canDefault = createMemo(() => !!platform.getDefaultServerUrl && !!platform.setDefaultServerUrl) - const setDefault = async (url: string | null) => { + const canDefault = createMemo(() => !!platform.getDefaultServer && !!platform.setDefaultServer) + const setDefault = async (key: ServerConnection.Key | null) => { try { - await platform.setDefaultServerUrl?.(url) - defaultUrlActions.mutate(url) + await platform.setDefaultServer?.(key) + defaultUrlActions.mutate(key) } catch (err) { showRequestError(language, err) } } - return { defaultUrl, canDefault, setDefault } + return { defaultKey, canDefault, setDefault } } -function useServerPreview(fetcher: typeof fetch) { +function useServerPreview() { + const checkServerHealth = useCheckServerHealth() + const looksComplete = (value: string) => { const normalized = normalizeServerUrl(value) if (!normalized) return false @@ -94,7 +98,7 @@ function useServerPreview(fetcher: typeof fetch) { const http: ServerConnection.HttpBase = { url: normalized } if (username) http.username = username if (password) http.password = password - const result = await checkServerHealth(http, fetcher) + const result = await checkServerHealth(http) setStatus(result.healthy) } @@ -172,9 +176,9 @@ export function DialogSelectServer() { const server = useServer() const platform = usePlatform() const language = useLanguage() - const fetcher = platform.fetch ?? globalThis.fetch - const { defaultUrl, canDefault, setDefault } = useDefaultServer(platform, language) - const { previewStatus } = useServerPreview(fetcher) + const { defaultKey, canDefault, setDefault } = useDefaultServer() + const { previewStatus } = useServerPreview() + const checkServerHealth = useCheckServerHealth() const [store, setStore] = createStore({ status: {} as Record<ServerConnection.Key, ServerHealth | undefined>, addServer: { @@ -266,7 +270,7 @@ export function DialogSelectServer() { const results: Record<ServerConnection.Key, ServerHealth> = {} await Promise.all( items().map(async (conn) => { - results[ServerConnection.key(conn)] = await checkServerHealth(conn.http, fetcher) + results[ServerConnection.key(conn)] = await checkServerHealth(conn.http) }), ) setStore("status", reconcile(results)) @@ -366,7 +370,7 @@ export function DialogSelectServer() { if (store.addServer.name.trim()) conn.displayName = store.addServer.name.trim() if (store.addServer.password) conn.http.password = store.addServer.password if (store.addServer.password && store.addServer.username) conn.http.username = store.addServer.username - const result = await checkServerHealth(conn.http, fetcher) + const result = await checkServerHealth(conn.http) setStore("addServer", { adding: false }) if (!result.healthy) { setStore("addServer", { error: language.t("dialog.server.add.error") }) @@ -406,7 +410,7 @@ export function DialogSelectServer() { displayName: name, http: { url: normalized, username, password }, } - const result = await checkServerHealth(conn.http, fetcher) + const result = await checkServerHealth(conn.http) setStore("editServer", { busy: false }) if (!result.healthy) { setStore("editServer", { error: language.t("dialog.server.add.error") }) @@ -496,8 +500,8 @@ export function DialogSelectServer() { async function handleRemove(url: ServerConnection.Key) { server.remove(url) - if ((await platform.getDefaultServerUrl?.()) === url) { - platform.setDefaultServerUrl?.(null) + if ((await platform.getDefaultServer?.()) === url) { + platform.setDefaultServer?.(null) } } @@ -553,7 +557,7 @@ export function DialogSelectServer() { status={store.status[key]} class="flex items-center gap-3 min-w-0 flex-1" badge={ - <Show when={defaultUrl() === i.http.url}> + <Show when={defaultKey() === ServerConnection.key(i)}> <span class="text-text-base bg-surface-base text-14-regular px-1.5 rounded-xs"> {language.t("dialog.server.status.default")} </span> @@ -586,14 +590,14 @@ export function DialogSelectServer() { > <DropdownMenu.ItemLabel>{language.t("dialog.server.menu.edit")}</DropdownMenu.ItemLabel> </DropdownMenu.Item> - <Show when={canDefault() && defaultUrl() !== i.http.url}> - <DropdownMenu.Item onSelect={() => setDefault(i.http.url)}> + <Show when={canDefault() && defaultKey() !== key}> + <DropdownMenu.Item onSelect={() => setDefault(key)}> <DropdownMenu.ItemLabel> {language.t("dialog.server.menu.default")} </DropdownMenu.ItemLabel> </DropdownMenu.Item> </Show> - <Show when={canDefault() && defaultUrl() === i.http.url}> + <Show when={canDefault() && defaultKey() === key}> <DropdownMenu.Item onSelect={() => setDefault(null)}> <DropdownMenu.ItemLabel> {language.t("dialog.server.menu.defaultRemove")} diff --git a/packages/app/src/components/status-popover.tsx b/packages/app/src/components/status-popover.tsx index c61b31958..8073746c9 100644 --- a/packages/app/src/components/status-popover.tsx +++ b/packages/app/src/components/status-popover.tsx @@ -14,7 +14,7 @@ import { usePlatform } from "@/context/platform" import { useSDK } from "@/context/sdk" import { normalizeServerUrl, ServerConnection, useServer } from "@/context/server" import { useSync } from "@/context/sync" -import { checkServerHealth, type ServerHealth } from "@/utils/server-health" +import { useCheckServerHealth, type ServerHealth } from "@/utils/server-health" import { DialogSelectServer } from "./dialog-select-server" const pollMs = 10_000 @@ -53,7 +53,8 @@ const listServersByHealth = ( }) } -const useServerHealth = (servers: Accessor<ServerConnection.Any[]>, fetcher: typeof fetch) => { +const useServerHealth = (servers: Accessor<ServerConnection.Any[]>) => { + const checkServerHealth = useCheckServerHealth() const [status, setStatus] = createStore({} as Record<ServerConnection.Key, ServerHealth | undefined>) createEffect(() => { @@ -64,7 +65,7 @@ const useServerHealth = (servers: Accessor<ServerConnection.Any[]>, fetcher: typ const results: Record<string, ServerHealth> = {} await Promise.all( list.map(async (conn) => { - results[ServerConnection.key(conn)] = await checkServerHealth(conn.http, fetcher) + results[ServerConnection.key(conn)] = await checkServerHealth(conn.http) }), ) if (dead) return @@ -168,7 +169,6 @@ export function StatusPopover() { const language = useLanguage() const navigate = useNavigate() - const fetcher = platform.fetch ?? globalThis.fetch const servers = createMemo(() => { const current = server.current const list = server.list @@ -176,10 +176,10 @@ export function StatusPopover() { if (list.every((item) => ServerConnection.key(item) !== ServerConnection.key(current))) return [current, ...list] return [current, ...list.filter((item) => ServerConnection.key(item) !== ServerConnection.key(current))] }) - const health = useServerHealth(servers, fetcher) + const health = useServerHealth(servers) const sortedServers = createMemo(() => listServersByHealth(servers(), server.key, health)) const mcp = useMcpToggle({ sync, sdk, language }) - const defaultServer = useDefaultServerKey(platform.getDefaultServerUrl) + const defaultServer = useDefaultServerKey(platform.getDefaultServer) const mcpNames = createMemo(() => Object.keys(sync.data.mcp ?? {}).sort((a, b) => a.localeCompare(b))) const mcpStatus = (name: string) => sync.data.mcp?.[name]?.status const mcpConnected = createMemo(() => mcpNames().filter((name) => mcpStatus(name) === "connected").length) |
