'use client'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useAuth } from '../_lib/auth-context'; function slugify(input: string): string { return input .toLowerCase() .trim() .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, '') .slice(0, 40); } export function SignupForm({ redirect }: { redirect?: string }) { const router = useRouter(); const { refresh } = useAuth(); const [tenantName, setTenantName] = useState(''); const [tenantSlug, setTenantSlug] = useState(''); const [slugTouched, setSlugTouched] = useState(false); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const computedSlug = slugify(tenantName); const effectiveSlug = slugTouched ? tenantSlug : computedSlug; async function onSubmit(e: React.FormEvent) { e.preventDefault(); setError(null); if (password !== confirmPassword) { setError('Passwords do not match'); return; } if (effectiveSlug.length < 2) { setError('Tenant name must produce a valid slug (lowercase letters, digits, dashes)'); return; } setSubmitting(true); try { const res = await fetch('/api/auth/signup', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tenantName, tenantSlug: effectiveSlug, email, password }), credentials: 'include', }); if (!res.ok) { const data = (await res.json().catch(() => ({}))) as { message?: string }; const messages = Array.isArray((data as { message?: unknown }).message) ? ((data as unknown as { message: string[] }).message.join(', ')) : data.message; setError(messages ?? 'Signup failed'); return; } await refresh(); router.push(redirect || '/'); } finally { setSubmitting(false); } } return (
{error &&

{error}

}

You'll be the first OWNER. You can invite others from settings later.

); }