summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components/server
diff options
context:
space:
mode:
Diffstat (limited to 'packages/app/src/components/server')
-rw-r--r--packages/app/src/components/server/server-row.tsx82
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,
+ }}
+ />
+ )
+}