90 lines
2.8 KiB
TypeScript
90 lines
2.8 KiB
TypeScript
import { useNavigate, useParams } from "@solidjs/router"
|
|
import { Show, createEffect, createResource, createSignal } from "solid-js"
|
|
import { adminGetRelay, adminUpdateRelay } from "../../lib/api"
|
|
import RelayForm from "../../components/RelayForm"
|
|
import { RELAY_PLAN_IDS, type RelayPlanId } from "../../lib/relayPlans"
|
|
import { slugify } from "../../lib/slugify"
|
|
import BackLink from "../../components/BackLink"
|
|
import PageContainer from "../../components/PageContainer"
|
|
import ResourceState from "../../components/ResourceState"
|
|
|
|
export default function AdminRelayEdit() {
|
|
const navigate = useNavigate()
|
|
const params = useParams()
|
|
const relayId = () => params.id ?? ""
|
|
const [relay] = createResource(relayId, adminGetRelay)
|
|
|
|
const [name, setName] = createSignal("")
|
|
const [subdomain, setSubdomain] = createSignal("")
|
|
const [icon, setIcon] = createSignal("")
|
|
const [description, setDescription] = createSignal("")
|
|
const [plan, setPlan] = createSignal<RelayPlanId>("free")
|
|
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)
|
|
setPlan(RELAY_PLAN_IDS.includes(data.plan as RelayPlanId) ? (data.plan as RelayPlanId) : "free")
|
|
})
|
|
|
|
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(),
|
|
plan: plan(),
|
|
})
|
|
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">Edit Relay (Admin)</h1>
|
|
|
|
<ResourceState
|
|
loading={relay.loading}
|
|
error={relay.error}
|
|
loadingText="Loading relay..."
|
|
errorText="Failed to load relay."
|
|
/>
|
|
|
|
<Show when={relay() && !relay.loading}>
|
|
<RelayForm
|
|
name={name()}
|
|
setName={setName}
|
|
subdomain={subdomain()}
|
|
setSubdomain={setSubdomain}
|
|
icon={icon()}
|
|
setIcon={setIcon}
|
|
description={description()}
|
|
setDescription={setDescription}
|
|
plan={plan()}
|
|
setPlan={setPlan}
|
|
plans={RELAY_PLAN_IDS}
|
|
onSubmit={handleSubmit}
|
|
submitting={submitting()}
|
|
error={error()}
|
|
submitLabel="Save Changes"
|
|
submittingLabel="Saving..."
|
|
/>
|
|
</Show>
|
|
</PageContainer>
|
|
)
|
|
}
|