diff --git a/frontend/src/components/RelayForm.tsx b/frontend/src/components/RelayForm.tsx index 11c1dcf..0916557 100644 --- a/frontend/src/components/RelayForm.tsx +++ b/frontend/src/components/RelayForm.tsx @@ -1,63 +1,61 @@ import { createEffect, createSignal } from "solid-js" import type { Relay } from "@/lib/hooks" import { slugify } from "@/lib/slugify" +import { PLANS } from "@/lib/api" -export type RelayFormValues = { - info_name: string - subdomain: string - info_icon: string - info_description: string -} +export type RelayFormValues = Pick type RelayFormProps = { - initialValues: Pick + initialValues?: Partial syncSubdomainWithName?: boolean - onSubmit: (values: RelayFormValues, e: Event) => void | Promise - submitting: boolean - error?: string + onSubmit: (values: RelayFormValues) => Promise | void submitLabel: string submittingLabel: string } export default function RelayForm(props: RelayFormProps) { - const [name, setName] = createSignal(props.initialValues.info_name) - const [subdomain, setSubdomain] = createSignal(props.initialValues.subdomain) - const [icon, setIcon] = createSignal(props.initialValues.info_icon) - const [description, setDescription] = createSignal(props.initialValues.info_description) + const [plan, setPlan] = createSignal(props.initialValues?.plan ?? "") + const [name, setName] = createSignal(props.initialValues?.info_name ?? "") + const [subdomain, setSubdomain] = createSignal(props.initialValues?.subdomain ?? "") + const [icon, setIcon] = createSignal(props.initialValues?.info_icon ?? "") + const [description, setDescription] = createSignal(props.initialValues?.info_description ?? "") + const [submitting, setSubmitting] = createSignal(false) + const [error, setError] = createSignal("") - createEffect(() => { - setName(props.initialValues.info_name) - setSubdomain(props.initialValues.subdomain) - setIcon(props.initialValues.info_icon) - setDescription(props.initialValues.info_description) - }) - - function handleSubmit(e: Event) { + async function handleSubmit(e: Event) { e.preventDefault() - void props.onSubmit( - { + setError("") + setSubmitting(true) + + try { + await props.onSubmit({ + plan: plan(), info_name: name(), subdomain: subdomain(), info_icon: icon(), info_description: description(), - }, - e, - ) + }) + } catch (e) { + setError(e instanceof Error ? e.message : "Failed to save relay") + } finally { + setSubmitting(false) + } } + createEffect(() => { + if (props.syncSubdomainWithName) { + setSubdomain(slugify(name())) + } + }) + return (
- {/* Basic info */}
{ - const value = e.currentTarget.value - setName(value) - if (props.syncSubdomainWithName) setSubdomain(slugify(value)) - }} required + value={name()} + onInput={e => setName(e.currentTarget.value)} class="w-full border border-gray-300 rounded-lg px-3 py-2" />
@@ -85,19 +83,41 @@ export default function RelayForm(props: RelayFormProps) {