From 17bd7ffbf1cfe6428e19bb69ebe32098aee99d01 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Thu, 16 Apr 2026 18:18:47 +1000 Subject: [PATCH] refactor: confirm windows local server swap inline --- .../src/components/dialog-select-server.tsx | 130 ++++++++++++++++-- 1 file changed, 118 insertions(+), 12 deletions(-) diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx index c229c37189..71b53bee1f 100644 --- a/packages/app/src/components/dialog-select-server.tsx +++ b/packages/app/src/components/dialog-select-server.tsx @@ -5,6 +5,7 @@ import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" import { Icon } from "@opencode-ai/ui/icon" import { IconButton } from "@opencode-ai/ui/icon-button" import { List } from "@opencode-ai/ui/list" +import { Popover } from "@opencode-ai/ui/popover" import { TextField } from "@opencode-ai/ui/text-field" import { useMutation } from "@tanstack/solid-query" import { showToast } from "@opencode-ai/ui/toast" @@ -13,7 +14,7 @@ import { createStore, reconcile } from "solid-js/store" import { DialogLocalServer } from "@/components/dialog-local-server" import { ServerHealthIndicator, ServerRow } from "@/components/server/server-row" import { useLanguage } from "@/context/language" -import { usePlatform } from "@/context/platform" +import { type LocalServerConfig, usePlatform } from "@/context/platform" import { normalizeServerUrl, ServerConnection, useServer } from "@/context/server" import { type ServerHealth, useCheckServerHealth } from "@/utils/server-health" @@ -199,6 +200,7 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) { localServer: { showPage: props.initialView === "local", targetMode: props.initialTargetMode as "windows" | "wsl" | undefined, + confirmSwapKey: undefined as ServerConnection.Key | undefined, }, editServer: { id: undefined as string | undefined, @@ -480,6 +482,50 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) { resetEdit() setStore("localServer", "showPage", true) setStore("localServer", "targetMode", targetMode) + setStore("localServer", "confirmSwapKey", undefined) + } + + const plainConfig = (config: LocalServerConfig): LocalServerConfig => structuredClone(config) + + const swapLocalToWindows = async () => { + const localServer = platform.localServer + if (!localServer) return + + try { + const state = await localServer.getState() + const config = plainConfig(state.config) + await localServer.setConfig({ + ...config, + mode: "windows", + distro: null, + onboarding: { + ...config.onboarding, + complete: true, + pendingRestart: false, + step: null, + }, + }) + setStore("localServer", "confirmSwapKey", undefined) + showToast({ + variant: "success", + title: "Local Server set to Windows", + description: "Restart OpenCode to finish switching back to Windows.", + persistent: true, + actions: [ + { + label: "Restart", + onClick: () => void platform.restart(), + }, + ], + }) + } catch (err) { + console.error("Local Server request failed", err instanceof Error ? (err.stack ?? err.message) : String(err)) + showToast({ + variant: "error", + title: language.t("common.requestFailed"), + description: err instanceof Error ? err.message : String(err), + }) + } } const localSwapLabel = (conn: ServerConnection.Any) => { @@ -609,17 +655,77 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) { />