'use client'; import Link from 'next/link'; import { Suspense, type FormEvent, useCallback, useMemo, useState } from 'react'; import { useSearchParams } from 'next/navigation'; import { AuthShell } from '@/components/auth/auth-shell'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { useAuthHandoff } from '@/hooks/use-auth-handoff'; 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 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 [handoffError, setHandoffError] = useState(null); const [busy, setBusy] = useState(false); const [awaitingSession, setAwaitingSession] = useState(false); const handleHandoffTimeout = useCallback(() => { setAwaitingSession(false); setHandoffError('Authentication completed, but the session was not established on this device. Please sign in again.'); }, []); const { isHandingOff, statusText } = useAuthHandoff({ nextPath, session, isPending, awaitingSession, onTimeout: handleHandoffTimeout }); const signUp = async (event: FormEvent) => { event.preventDefault(); setError(null); setHandoffError(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; } setAwaitingSession(true); }; return ( Already registered?{' '} Sign in > )} > Name setName(event.target.value)} required disabled={busy || isHandingOff} /> Email setEmail(event.target.value)} required disabled={busy || isHandingOff} /> Password setPassword(event.target.value)} required minLength={8} disabled={busy || isHandingOff} /> Confirm Password setConfirmPassword(event.target.value)} required minLength={8} disabled={busy || isHandingOff} /> {error ? {error} : null} {handoffError ? {handoffError} : null} {statusText ? {statusText} : null} {busy ? 'Creating account...' : isHandingOff ? 'Finishing sign-in...' : 'Create account'} ); }
{error}
{handoffError}
{statusText}