mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-24 20:25:36 -04:00
120 lines
3.0 KiB
TypeScript
120 lines
3.0 KiB
TypeScript
import { For, Show } from "solid-js"
|
|
import type { LookupResult, WorkspaceSection } from "~/lib/lookup"
|
|
|
|
export function Result(props: { data: LookupResult }) {
|
|
return (
|
|
<>
|
|
<Show when={props.data.auth}>
|
|
{(auth) => (
|
|
<section data-component="section">
|
|
<h2>Auth</h2>
|
|
<DataTable rows={auth()} />
|
|
</section>
|
|
)}
|
|
</Show>
|
|
|
|
<Show when={props.data.accountWorkspaces}>
|
|
{(workspaces) => (
|
|
<section data-component="section">
|
|
<h2>Workspaces</h2>
|
|
<DataTable rows={workspaces()} />
|
|
</section>
|
|
)}
|
|
</Show>
|
|
|
|
<For each={props.data.workspaces}>{(ws) => <WorkspaceView section={ws} />}</For>
|
|
</>
|
|
)
|
|
}
|
|
|
|
function WorkspaceView(props: { section: WorkspaceSection }) {
|
|
return (
|
|
<section data-component="section" id={`workspace-${props.section.workspaceID}`}>
|
|
<h2>{props.section.title}</h2>
|
|
|
|
<h3>Users</h3>
|
|
<DataTable rows={props.section.users} />
|
|
|
|
<h3>Billing</h3>
|
|
<DataTable rows={props.section.billing ? [props.section.billing] : []} />
|
|
|
|
<h3>GO</h3>
|
|
<DataTable rows={props.section.go} />
|
|
|
|
<h3>Payments</h3>
|
|
<DataTable rows={props.section.payments} />
|
|
|
|
<h3>28-Day Usage</h3>
|
|
<DataTable rows={props.section.usage} />
|
|
|
|
<h3>Disabled Models</h3>
|
|
<DataTable rows={props.section.disabledModels} />
|
|
</section>
|
|
)
|
|
}
|
|
|
|
function DataTable(props: { rows: Record<string, unknown>[] }) {
|
|
const columns = () => {
|
|
const cols = new Set<string>()
|
|
for (const row of props.rows) {
|
|
for (const key of Object.keys(row)) cols.add(key)
|
|
}
|
|
return [...cols]
|
|
}
|
|
|
|
return (
|
|
<Show when={props.rows.length > 0} fallback={<div data-empty>(no data)</div>}>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<For each={columns()}>{(col) => <th>{col}</th>}</For>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<For each={props.rows}>
|
|
{(row) => (
|
|
<tr>
|
|
<For each={columns()}>{(col) => <td>{renderCell(row[col])}</td>}</For>
|
|
</tr>
|
|
)}
|
|
</For>
|
|
</tbody>
|
|
</table>
|
|
</Show>
|
|
)
|
|
}
|
|
|
|
function renderCell(value: unknown) {
|
|
if (value === null || value === undefined) return ""
|
|
if (typeof value === "string" && value.startsWith("https://")) {
|
|
return (
|
|
<a href={value} target="_blank" rel="noopener noreferrer">
|
|
{value}
|
|
</a>
|
|
)
|
|
}
|
|
if (isLinkCell(value)) {
|
|
const external = value.__link.startsWith("http")
|
|
return (
|
|
<a
|
|
href={value.__link}
|
|
target={external ? "_blank" : undefined}
|
|
rel={external ? "noopener noreferrer" : undefined}
|
|
>
|
|
{value.label}
|
|
</a>
|
|
)
|
|
}
|
|
if (typeof value === "object") return JSON.stringify(value)
|
|
return String(value)
|
|
}
|
|
|
|
function isLinkCell(value: unknown): value is { __link: string; label: string } {
|
|
return (
|
|
typeof value === "object" &&
|
|
value !== null &&
|
|
"__link" in value &&
|
|
typeof (value as { __link: unknown }).__link === "string"
|
|
)
|
|
}
|