'use client'; import { useState, useEffect, Suspense } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { useAuth } from '@/lib/auth-context'; import { Button } from '@/components/ui/button'; import { invitationsApi, InvitationInfo } from '@/lib/api'; function RegisterForm() { const router = useRouter(); const searchParams = useSearchParams(); const inviteToken = searchParams.get('invite_token'); const { register, acceptedProjects, clearAcceptedProjects, justRegisteredName, user } = useAuth(); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const [inviteInfo, setInviteInfo] = useState(null); const [inviteLoading, setInviteLoading] = useState(false); const [justJoined, setJustJoined] = useState(false); // Verify invite token if present — auto-fill email useEffect(() => { if (inviteToken) { setInviteLoading(true); invitationsApi.verify(inviteToken) .then(({ invitation }) => { setInviteInfo(invitation); setEmail(invitation.email); }) .catch(() => { /* invalid token, not critical */ }) .finally(() => setInviteLoading(false)); } }, [inviteToken]); useEffect(() => { if (acceptedProjects.length > 0 && !justJoined) { setJustJoined(true); } }, [acceptedProjects, justJoined]); // Redirect if already logged in useEffect(() => { if (user) { if (inviteToken) { router.push(`/invite/${inviteToken}`); } else { router.push('/projects'); } } }, [user, inviteToken, router]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (password.length < 6) { setError('Password must be at least 6 characters'); return; } setLoading(true); try { await register(email, name, password, inviteToken ?? undefined); if (inviteToken) { router.push(`/invite/${inviteToken}`); } else { router.push('/projects'); } } catch (err: unknown) { setError(err instanceof Error ? err.message : 'Registration failed'); } finally { setLoading(false); } }; const handleGoToProject = (projectId: string) => { clearAcceptedProjects(); router.push(`/projects/${projectId}`); }; return (
{/* Ambient blobs */}
{/* Logo */}
VidReview
{/* Card */}
{/* Invite banner */} {inviteLoading ? (
Verifying invitation…
) : inviteInfo ? (

You're invited to join

{inviteInfo.projectName}

{inviteInfo.role.toLowerCase()}
) : null} {/* Accepted projects notification */} {justJoined && (
{justRegisteredName && (

Welcome, {justRegisteredName}!

)} {acceptedProjects.length > 0 ? ( <>

You're now a member of:

{acceptedProjects.map(p => ( ))} ) : (

Your account is ready. Redirecting…

)}
)} {error && (
{error}
)}

{inviteInfo ? 'Create your account' : 'Create workspace'}

{inviteInfo ? 'Join your team in seconds' : 'Set up your team in under a minute'}

setName(e.target.value)} placeholder="Jane Editor" required autoComplete="name" />
setEmail(e.target.value)} placeholder="you@company.com" required autoComplete="email" />
setPassword(e.target.value)} placeholder="At least 6 characters" required autoComplete="new-password" />

Use 8+ characters with a mix of letters and numbers

Already have an account?{' '} Sign in

); } export default function RegisterPage() { return (
Loading…
}>
); }