import { createEffect, createMemo, createSignal, For } from "solid-js" import type { Relay } from "@/lib/hooks" import { slugify } from "@/lib/slugify" import { validateSubdomainLabel } from "@/lib/subdomain" import { setToastMessage } from "@/components/Toast" import { plans } from "@/lib/state" export type RelayFormValues = Pick type RelayFormProps = { initialValues?: Partial syncSubdomainWithName?: boolean onSubmit: (values: RelayFormValues) => Promise | void submitLabel: string submittingLabel: string } export default function RelayForm(props: RelayFormProps) { const defaultPlanId = createMemo(() => props.initialValues?.plan ?? plans()[0]?.id ?? "free") const [plan, setPlan] = createSignal(defaultPlanId()) 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) async function handleSubmit(e: Event) { e.preventDefault() if (!plan()) { setToastMessage("Please select a plan") return } const subdomainError = validateSubdomainLabel(subdomain()) if (subdomainError) { setToastMessage(subdomainError) return } setToastMessage("") setSubmitting(true) try { await props.onSubmit({ plan: plan(), info_name: name(), subdomain: subdomain(), info_icon: icon(), info_description: description(), }) } catch (e) { setToastMessage(e instanceof Error ? e.message : "Failed to save relay") } finally { setSubmitting(false) } } createEffect(() => setPlan(defaultPlanId())) createEffect(() => { if (props.syncSubdomainWithName) { setSubdomain(slugify(name())) } }) return (
setName(e.currentTarget.value)} class="w-full border border-gray-300 rounded-lg px-3 py-2" />
setSubdomain(e.currentTarget.value)} required class="flex-1 px-3 py-2" /> .spaces.coracle.social
setIcon(e.currentTarget.value)} class="w-full border border-gray-300 rounded-lg px-3 py-2" />