"use client"; import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { UserPlusIcon } from "lucide-react"; import { authClient } from "@/lib/auth-client"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; import { Field, FieldDescription, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Spinner } from "@/components/ui/spinner"; export function SignUpForm({ callbackURL, requireInvite, initialCode = "", }: { callbackURL: string; requireInvite: boolean; initialCode?: string; }) { const router = useRouter(); const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [inviteCode, setInviteCode] = useState(initialCode); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); async function submit(event: React.FormEvent) { event.preventDefault(); if (requireInvite && !inviteCode.trim()) { setError("An invite code is required"); return; } setLoading(true); setError(null); const result = await authClient.signUp.email({ name, email, password, callbackURL, }); if (result.error) { setError(result.error.message ?? "Unable to create account"); setLoading(false); return; } if (inviteCode.trim()) { router.push(`/invitations/${encodeURIComponent(inviteCode.trim())}`); router.refresh(); return; } router.push(callbackURL); router.refresh(); } return (
Name setName(event.target.value)} className="tap-target" /> Email setEmail(event.target.value)} className="tap-target" /> Password setPassword(event.target.value)} className="tap-target" /> Use at least 10 characters in production. {initialCode.length > 4 ?

Your invitation is attached. You’ll confirm your access after creating your account.

: Invite code {requireInvite ? "" : "(optional)"} setInviteCode(event.target.value.toUpperCase().replace(/[^A-Z0-9]/g, "")) } placeholder="AB12" minLength={4} maxLength={4} pattern="[A-Za-z0-9]{4}" autoCapitalize="characters" autoCorrect="off" className="tap-target" required={requireInvite} /> }
{error ? ( {error} ) : null}

Already have an account?{" "} Sign in

); }