Files
caravel/frontend/src/pages/admin/AdminRelayEdit.tsx
T
2026-03-03 11:45:57 -08:00

95 lines
2.9 KiB
TypeScript

import { useNavigate, useParams } from "@solidjs/router"
import { Show, createEffect, createResource, createSignal } from "solid-js"
import { adminGetRelay, adminUpdateRelay, type RelayConfig } from "../../lib/api"
import RelayForm from "../../components/RelayForm"
import { slugify } from "../../lib/slugify"
import BackLink from "../../components/BackLink"
import PageContainer from "../../components/PageContainer"
import ResourceState from "../../components/ResourceState"
import useMinLoading from "../../components/useMinLoading"
const DEFAULT_CONFIG: RelayConfig = {
policy: { public_join: false, strip_signatures: false },
groups: { enabled: false, auto_join: false },
management: { enabled: false },
blossom: { enabled: false },
livekit: { enabled: false },
push: { enabled: false },
}
export default function AdminRelayEdit() {
const navigate = useNavigate()
const params = useParams()
const relayId = () => params.id ?? ""
const [relay] = createResource(relayId, adminGetRelay)
const loading = useMinLoading(() => relay.loading)
const [name, setName] = createSignal("")
const [subdomain, setSubdomain] = createSignal("")
const [icon, setIcon] = createSignal("")
const [description, setDescription] = createSignal("")
const [error, setError] = createSignal("")
const [submitting, setSubmitting] = createSignal(false)
createEffect(() => {
const data = relay()
if (!data) return
setName(data.name)
setSubdomain(data.subdomain)
setIcon(data.icon)
setDescription(data.description)
})
async function handleSubmit(e: Event) {
e.preventDefault()
setError("")
setSubmitting(true)
try {
await adminUpdateRelay(relayId(), {
name: name().trim(),
subdomain: slugify(subdomain()),
icon: icon().trim(),
description: description().trim(),
config: relay()?.config ?? DEFAULT_CONFIG,
})
navigate(`/admin/relays/${relayId()}`)
} catch (e) {
setError(e instanceof Error ? e.message : "Failed to update relay")
} finally {
setSubmitting(false)
}
}
return (
<PageContainer size="narrow">
<BackLink href={`/admin/relays/${params.id}`} label="Back" />
<h1 class="text-2xl font-bold text-gray-900 mb-6 py-2">Edit Relay (Admin)</h1>
<ResourceState
loading={loading()}
error={relay.error}
loadingText="Loading relay..."
errorText="Failed to load relay."
/>
<Show when={relay() && !loading()}>
<RelayForm
name={name()}
setName={setName}
subdomain={subdomain()}
setSubdomain={setSubdomain}
icon={icon()}
setIcon={setIcon}
description={description()}
setDescription={setDescription}
onSubmit={handleSubmit}
submitting={submitting()}
error={error()}
submitLabel="Save Changes"
submittingLabel="Saving..."
/>
</Show>
</PageContainer>
)
}