This commit is contained in:
LukeParkerDev
2026-04-28 12:20:01 +10:00
parent 70443cd2de
commit 9cd611780f
4 changed files with 59 additions and 94 deletions
@@ -44,7 +44,6 @@ function versionOlderThan(current: string | null | undefined, expected: string |
}
interface DialogSelectServerProps {
initialView?: "add-wsl"
onNavigateHome?: () => void
}
@@ -163,7 +162,7 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) {
showForm: false,
},
addWsl: {
showWizard: props.initialView === "add-wsl",
showWizard: false,
},
editServer: {
id: undefined as string | undefined,
@@ -550,21 +549,6 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) {
if (server.defaultKey() === key) await server.setDefault(null)
}
function handleRemoveWsl(conn: ServerConnection.Any) {
if (!isWslSidecar(conn)) return
removeWslMutation.mutate(ServerConnection.key(conn))
}
function handleRetryWsl(conn: ServerConnection.Any) {
if (!isWslSidecar(conn)) return
retryWslMutation.mutate(ServerConnection.key(conn))
}
function handleUpdateWsl(conn: ServerConnection.Any) {
if (!isWslSidecar(conn)) return
updateWslMutation.mutate(conn.distro)
}
return (
<Dialog
title={formTitle()}
@@ -621,7 +605,6 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) {
const blocked = () => health(key)?.healthy === false
const canChangeDefault = () => server.canDefault() && i.type !== "ssh"
const canRemove = () => i.type === "http" || wsl
const hasMenuActionsBeforeDelete = () => canRemove() && (i.type === "http" || canChangeDefault() || canRetryWsl(i))
const outdated = () => {
const check = wslCheck(i)
return versionOlderThan(check?.version, check?.expectedVersion)
@@ -668,7 +651,7 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) {
onPointerDown={(e: PointerEvent) => e.stopPropagation()}
onClick={(e: MouseEvent) => {
e.stopPropagation()
handleUpdateWsl(i)
if (wslDistro) updateWslMutation.mutate(wslDistro)
}}
>
{updating() ? "Updating OpenCode..." : label()}
@@ -702,7 +685,7 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) {
</DropdownMenu.Item>
</Show>
<Show when={wsl && canRetryWsl(i)}>
<DropdownMenu.Item onSelect={() => handleRetryWsl(i)}>
<DropdownMenu.Item onSelect={() => retryWslMutation.mutate(key)}>
<DropdownMenu.ItemLabel>Retry start</DropdownMenu.ItemLabel>
</DropdownMenu.Item>
</Show>
@@ -720,14 +703,14 @@ export function DialogSelectServer(props: DialogSelectServerProps = {}) {
</DropdownMenu.ItemLabel>
</DropdownMenu.Item>
</Show>
<Show when={hasMenuActionsBeforeDelete()}>
<Show when={canRemove() && (i.type === "http" || canChangeDefault() || canRetryWsl(i))}>
<DropdownMenu.Separator />
</Show>
<Show when={canRemove()}>
<DropdownMenu.Item
onSelect={() => {
if (wsl) {
handleRemoveWsl(i)
removeWslMutation.mutate(key)
return
}
void handleRemove(key)
@@ -244,20 +244,39 @@ export function DialogWslServer(props: DialogWslServerProps = {}) {
}
}
const steps = createMemo(() =>
STEPS.map((step) => ({
step,
title: stepTitle(step),
state: stepState(step, {
active: activeStep(),
wslReady: wslReady(),
distroReady: distroReady(),
opencodeReady: opencodeReady(),
opencodeMismatch: opencodeCheck()?.matchesDesktop === false,
}),
locked: stepIndex(step) > stepIndex(recommendedStep()),
})),
)
const steps = createMemo(() => {
const active = activeStep()
const activeIndex = STEPS.indexOf(active)
const recommendedIndex = STEPS.indexOf(recommendedStep())
return STEPS.map((step) => {
const index = STEPS.indexOf(step)
return {
step,
title: step === "wsl" ? "WSL" : step === "distro" ? "Choose distro" : "OpenCode",
state:
active === step
? "current"
: step === "wsl"
? wslReady()
? "done"
: "warning"
: step === "distro"
? distroReady()
? "done"
: index > activeIndex
? "locked"
: "warning"
: opencodeCheck()?.matchesDesktop === false
? "warning"
: opencodeReady()
? "done"
: index > activeIndex
? "locked"
: "warning",
locked: index > recommendedIndex,
}
})
})
const loadError = createMemo(() => {
const error = wslServers.error
if (!error) return "Failed to load WSL state."
@@ -554,36 +573,3 @@ function requestError(language: ReturnType<typeof useLanguage>, err: unknown) {
description: err instanceof Error ? err.message : String(err),
})
}
function stepIndex(step: WslServerStep) {
return STEPS.indexOf(step)
}
function stepTitle(step: WslServerStep) {
if (step === "wsl") return "WSL"
if (step === "distro") return "Choose distro"
return "OpenCode"
}
function stepState(
step: WslServerStep,
state: {
active: WslServerStep
wslReady: boolean
distroReady: boolean
opencodeReady: boolean
opencodeMismatch: boolean
},
) {
if (state.active === step) return "current"
if (step === "wsl") return state.wslReady ? "done" : "warning"
if (step === "distro")
return state.distroReady ? "done" : stepIndex(step) > stepIndex(state.active) ? "locked" : "warning"
return state.opencodeMismatch
? "warning"
: state.opencodeReady
? "done"
: stepIndex(step) > stepIndex(state.active)
? "locked"
: "warning"
}
@@ -265,10 +265,6 @@ export function runWslSh(script: string, distro?: string | null, opts?: RunWslOp
return runWslInDistro(["sh", "-lc", script], distro, opts)
}
export function runWslBash(script: string, distro?: string | null, opts?: RunWslOptions) {
return runWslInDistro(["bash", "-lc", script], distro, opts)
}
export async function probeWslRuntime(opts?: RunWslOptions): Promise<WslRuntimeCheck> {
const version = await runWsl(["--version"], opts).catch((error) => ({
code: 1,