"use client"; import { type FormEvent, useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { authClient } from "@/lib/auth-client"; import { notify } from "@/lib/toast"; function slugify(value: string): string { return value .toLowerCase() .trim() .replace(/[^a-z0-9]+/g, "-") .replace(/^-+|-+$/g, ""); } // Shared "create a clinic" form: name + auto-derived slug, creates the org and // makes it active. Used by both the onboarding page and the sidebar-footer // clinic menu's "Create clinic" dialog. export function CreateClinicForm({ onCreated, submitLabel = "Create clinic", }: { onCreated?: (org: { id: string; name: string }) => void; submitLabel?: string; }) { const [name, setName] = useState(""); const [slug, setSlug] = useState(""); const [slugEdited, setSlugEdited] = useState(false); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); const onSubmit = async (event: FormEvent) => { event.preventDefault(); if (submitting) return; setSubmitting(true); setError(null); const finalSlug = (slugEdited ? slug : slugify(name)) || slugify(name); const { data: org, error: createErr } = await authClient.organization.create({ name: name.trim(), slug: finalSlug }); if (createErr || !org) { const message = createErr?.message ?? "Could not create the clinic."; setError(message); notify.error("Couldn't create clinic", message); setSubmitting(false); return; } await authClient.organization.setActive({ organizationId: org.id }); notify.success("Clinic created", `${org.name} is ready.`); onCreated?.(org); }; return (
{error && (

{error}

)}
{ setName(e.target.value); if (!slugEdited) setSlug(slugify(e.target.value)); }} placeholder="North Side Family Practice" required value={name} />
{ setSlugEdited(true); setSlug(slugify(e.target.value)); }} placeholder="north-side-family-practice" required value={slug} />

Used in links and invitations. Lowercase letters, numbers and dashes.

); }