'use client'; import Link from 'next/link'; import { Suspense, type FormEvent, useEffect, useMemo, useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { AuthShell } from '@/components/auth/auth-shell'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { authClient } from '@/lib/auth-client'; function sanitizeNextPath(value: string | null) { if (!value || !value.startsWith('/')) { return '/'; } return value; } export default function SignUpPage() { return ( Loading sign up...}> ); } function SignUpPageContent() { const router = useRouter(); const searchParams = useSearchParams(); const nextPath = useMemo(() => sanitizeNextPath(searchParams.get('next')), [searchParams]); const { data: rawSession, isPending } = authClient.useSession(); const session = (rawSession ?? null) as { user?: { id?: string } } | null; const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); useEffect(() => { if (!isPending && session?.user?.id) { router.replace(nextPath); } }, [isPending, nextPath, router, session]); const signUp = async (event: FormEvent) => { event.preventDefault(); setError(null); if (password !== confirmPassword) { setError('Passwords do not match.'); return; } setBusy(true); const { error: signUpError } = await authClient.signUp.email({ name: name.trim(), email: email.trim(), password, callbackURL: nextPath }); setBusy(false); if (signUpError) { setError(signUpError.message || 'Unable to create account.'); return; } router.replace(nextPath); }; return ( Already registered?{' '} Sign in > )} > Name setName(event.target.value)} required /> Email setEmail(event.target.value)} required /> Password setPassword(event.target.value)} required minLength={8} /> Confirm Password setConfirmPassword(event.target.value)} required minLength={8} /> {error ? {error} : null} {busy ? 'Creating account...' : 'Create account'} ); }
{error}