'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/shared/Button'; import { Input } from '@/components/ui/shared/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 (
Loading invitation...
) : ( <> {inviteInfo && (Organization: {inviteInfo.organizationName}
Email: {inviteInfo.email}
Already have access? Go to login
> )}Loading invitation...
} >