'use client'; import { useEffect, useMemo, useState } from 'react'; import { Suspense } from 'react'; import Link from 'next/link'; import { useRouter, useSearchParams } from 'next/navigation'; import { Button } from '@/components/ui/common/Button'; import { Input } from '@/components/ui/common/Input'; import { staffApi } from '@/lib/api/staff'; function AcceptInviteContent() { const params = useSearchParams(); const router = useRouter(); const token = useMemo(() => params.get('token') || '', [params]); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); const [inviteInfo, setInviteInfo] = useState<{ email: string; name: string; organizationName: string; expiresAt: string; status: 'PENDING' | 'ACCEPTED'; } | null>(null); const [name, setName] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); useEffect(() => { if (!token) { setLoading(false); setError('Invalid invitation link'); return; } void (async () => { setLoading(true); setError(''); try { const res = await staffApi.previewInvite(token); setInviteInfo(res.data); setName(res.data.name || ''); if (res.data.status === 'ACCEPTED') { setSuccess('This invitation is already accepted. You can log in now.'); } } catch (e: any) { setError(e?.message || 'Could not load invitation'); } finally { setLoading(false); } })(); }, [token]); async function onAccept() { if (!token) return; setError(''); setSuccess(''); if (!name.trim()) { setError('Name is required'); return; } if (password.length < 8) { setError('Password must be at least 8 characters'); return; } if (password !== confirmPassword) { setError('Passwords do not match'); return; } setSubmitting(true); try { await staffApi.acceptInvite({ token, name: name.trim(), password, }); setSuccess('Invitation accepted. Redirecting to login...'); setTimeout(() => { router.replace('/login'); }, 1000); } catch (e: any) { setError(e?.message || 'Could not accept invitation'); } finally { setSubmitting(false); } } return (

Accept invitation

{loading ? (

Loading invitation...

) : ( <> {inviteInfo && (

Organization: {inviteInfo.organizationName}

Email: {inviteInfo.email}

)} {error && (
{error}
)} {success && (
{success}
)} {inviteInfo?.status !== 'ACCEPTED' && (
setName(e.target.value)} /> setPassword(e.target.value)} /> setConfirmPassword(e.target.value)} />
)}

Already have access? Go to login

)}
); } export default function AcceptInvitePage() { return (

Loading invitation...

} >
); }