summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-24 08:30:08 -0600
committeradamelmore <[email protected]>2026-01-24 09:10:02 -0600
commit6abe86806f1419eb9b39534facf2df2c3ebe0649 (patch)
tree6cff73247cd3997c8f55d4f4f6e4b816084aee99
parent6d8e9943837a73944911728a698138e23601d556 (diff)
downloadopencode-6abe86806f1419eb9b39534facf2df2c3ebe0649.tar.gz
opencode-6abe86806f1419eb9b39534facf2df2c3ebe0649.zip
fix(app): better error screen when connecting to sidecar
-rw-r--r--packages/desktop/src/index.tsx45
1 files changed, 39 insertions, 6 deletions
diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx
index f9eb19a58..fe9e3f92e 100644
--- a/packages/desktop/src/index.tsx
+++ b/packages/desktop/src/index.tsx
@@ -370,18 +370,51 @@ function ServerGate(props: { children: (data: Accessor<ServerReadyData>) => JSX.
}),
)
+ const errorMessage = () => {
+ const error = serverData.error
+ if (!error) return "Unknown error"
+ if (typeof error === "string") return error
+ if (error instanceof Error) return error.message
+ return String(error)
+ }
+
+ const restartApp = async () => {
+ await invoke("kill_sidecar").catch(() => undefined)
+ await relaunch().catch(() => undefined)
+ }
+
return (
// Not using suspense as not all components are compatible with it (undefined refs)
<Show
- when={serverData.state !== "pending" && serverData()}
+ when={serverData.state === "errored"}
fallback={
- <div class="h-screen w-screen flex flex-col items-center justify-center bg-background-base">
- <Splash class="w-16 h-20 opacity-50 animate-pulse" />
- <div data-tauri-decorum-tb class="flex flex-row absolute top-0 right-0 z-10 h-10" />
- </div>
+ <Show
+ when={serverData.state !== "pending" && serverData()}
+ fallback={
+ <div class="h-screen w-screen flex flex-col items-center justify-center bg-background-base">
+ <Splash class="w-16 h-20 opacity-50 animate-pulse" />
+ <div data-tauri-decorum-tb class="flex flex-row absolute top-0 right-0 z-10 h-10" />
+ </div>
+ }
+ >
+ {(data) => props.children(data)}
+ </Show>
}
>
- {(data) => props.children(data)}
+ <div class="h-screen w-screen flex flex-col items-center justify-center bg-background-base gap-4 px-6">
+ <div class="text-16-semibold">OpenCode failed to start</div>
+ <div class="text-12-regular opacity-70 text-center max-w-xl">
+ The local OpenCode server could not be started. Restart the app, or check your network settings (VPN/proxy)
+ and try again.
+ </div>
+ <div class="w-full max-w-3xl rounded border border-border bg-background-base overflow-auto max-h-64">
+ <pre class="p-3 whitespace-pre-wrap break-words text-11-regular">{errorMessage()}</pre>
+ </div>
+ <button class="px-3 py-2 rounded bg-primary text-primary-foreground" onClick={() => void restartApp()}>
+ Restart App
+ </button>
+ <div data-tauri-decorum-tb class="flex flex-row absolute top-0 right-0 z-10 h-10" />
+ </div>
</Show>
)
}