import { useState, useEffect } from 'react'; import { useSearchParams, useNavigate, Link } from 'react-router-dom'; import { api } from '@/lib/api'; export function SetupPage() { const [searchParams] = useSearchParams(); const navigate = useNavigate(); const token = searchParams.get('token'); const [inviteData, setInviteData] = useState<{ email: string; name: string } | null>(null); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); useEffect(() => { if (!token) { setError('Invalid invite link'); setIsLoading(false); return; } api.validateInvite(token) .then(setInviteData) .catch((err) => setError(err.message)) .finally(() => setIsLoading(false)); }, [token]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (password.length < 8) { setError('Password must be at least 8 characters'); return; } if (password !== confirmPassword) { setError('Passwords do not match'); return; } setIsSubmitting(true); try { await api.acceptInvite(token!, password); navigate('/login?setup=success'); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to create account'); } finally { setIsSubmitting(false); } }; if (isLoading) { return (

Validating invite...

); } if (error && !inviteData) { return (
😕

Invalid Invite

{error}

Go to Login
); } return (
{/* Header */}

Welcome!

Set up your account to get started

{/* Setup form */}

{inviteData?.name}

{inviteData?.email}

{error && (
{error}
)}
setPassword(e.target.value)} required minLength={8} className="input" placeholder="At least 8 characters" />
setConfirmPassword(e.target.value)} required className="input" placeholder="Confirm your password" />
); }