diff options
Diffstat (limited to 'packages/app/src/components/server')
| -rw-r--r-- | packages/app/src/components/server/server-row.tsx | 82 |
1 files changed, 60 insertions, 22 deletions
diff --git a/packages/app/src/components/server/server-row.tsx b/packages/app/src/components/server/server-row.tsx index 12dcebfa9..5bb290ec3 100644 --- a/packages/app/src/components/server/server-row.tsx +++ b/packages/app/src/components/server/server-row.tsx @@ -1,5 +1,6 @@ import { Tooltip } from "@opencode-ai/ui/tooltip" import { + children, createEffect, createMemo, createSignal, @@ -9,7 +10,7 @@ import { type ParentProps, Show, } from "solid-js" -import { type ServerConnection, serverDisplayName } from "@/context/server" +import { type ServerConnection, serverName } from "@/context/server" import type { ServerHealth } from "@/utils/server-health" interface ServerRowProps extends ParentProps { @@ -20,13 +21,14 @@ interface ServerRowProps extends ParentProps { versionClass?: string dimmed?: boolean badge?: JSXElement + showCredentials?: boolean } export function ServerRow(props: ServerRowProps) { const [truncated, setTruncated] = createSignal(false) let nameRef: HTMLSpanElement | undefined let versionRef: HTMLSpanElement | undefined - const name = createMemo(() => serverDisplayName(props.conn)) + const name = createMemo(() => serverName(props.conn)) const check = () => { const nameTruncated = nameRef ? nameRef.scrollWidth > nameRef.clientWidth : false @@ -52,35 +54,71 @@ export function ServerRow(props: ServerRowProps) { const tooltipValue = () => ( <span class="flex items-center gap-2"> - <span>{name()}</span> + <span>{serverName(props.conn, true)}</span> <Show when={props.status?.version}> - <span class="text-text-invert-base">{props.status?.version}</span> + <span class="text-text-invert-weak">v{props.status?.version}</span> </Show> </span> ) + const badge = children(() => props.badge) + return ( - <Tooltip value={tooltipValue()} placement="top" inactive={!truncated()}> + <Tooltip + class="flex-1" + value={tooltipValue()} + placement="top-start" + inactive={!truncated() && !props.conn.displayName} + > <div class={props.class} classList={{ "opacity-50": props.dimmed }}> - <div - classList={{ - "size-1.5 rounded-full shrink-0": true, - "bg-icon-success-base": props.status?.healthy === true, - "bg-icon-critical-base": props.status?.healthy === false, - "bg-border-weak-base": props.status === undefined, - }} - /> - <span ref={nameRef} class={props.nameClass ?? "truncate"}> - {name()} - </span> - <Show when={props.status?.version}> - <span ref={versionRef} class={props.versionClass ?? "text-text-weak text-14-regular truncate"}> - {props.status?.version} - </span> - </Show> - {props.badge} + <div class="flex flex-col items-start"> + <div class="flex flex-row items-center gap-2"> + <span ref={nameRef} class={props.nameClass ?? "truncate"}> + {name()} + </span> + <Show + when={badge()} + fallback={ + <Show when={props.status?.version}> + <span ref={versionRef} class={props.versionClass ?? "text-text-weak text-14-regular truncate"}> + v{props.status?.version} + </span> + </Show> + } + > + {(badge) => badge()} + </Show> + </div> + <Show when={props.showCredentials && props.conn.type === "http" && props.conn}> + {(conn) => ( + <div class="flex flex-row gap-3"> + <span> + {conn().http.username ? ( + <span class="text-text-weak">{conn().http.username}</span> + ) : ( + <span class="text-text-weaker">no username</span> + )} + </span> + {conn().http.password && <span class="text-text-weak">••••••••</span>} + </div> + )} + </Show> + </div> {props.children} </div> </Tooltip> ) } + +export function ServerHealthIndicator(props: { health?: ServerHealth }) { + return ( + <div + classList={{ + "size-1.5 rounded-full shrink-0": true, + "bg-icon-success-base": props.health?.healthy === true, + "bg-icon-critical-base": props.health?.healthy === false, + "bg-border-weak-base": props.health === undefined, + }} + /> + ) +} |
