'use client'; import { useEffect, useMemo, useState } from 'react'; import { Suspense } from 'react'; import { useTranslations } from 'next-intl'; import { Link, useRouter } from '@/i18n/navigation'; import { 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 t = useTranslations('auth'); 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(t('invalidInvitationLink')); 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(t('invitationAlreadyAccepted')); } } catch (e: unknown) { const message = e && typeof e === 'object' && 'message' in e ? String(e.message) : ''; setError(message || t('errorLoadInvitation')); } finally { setLoading(false); } })(); }, [token, t]); async function onAccept() { if (!token) return; setError(''); setSuccess(''); if (!name.trim()) { setError(t('nameRequired')); return; } if (password.length < 8) { setError(t('passwordMinLength8')); return; } if (password !== confirmPassword) { setError(t('passwordsDoNotMatch')); return; } setSubmitting(true); try { await staffApi.acceptInvite({ token, name: name.trim(), password, }); setSuccess(t('invitationAcceptedRedirect')); setTimeout(() => { router.replace('/login'); }, 1000); } catch (e: unknown) { const message = e && typeof e === 'object' && 'message' in e ? String(e.message) : ''; setError(message || t('errorAcceptInvitation')); } finally { setSubmitting(false); } } return (

{t('acceptInviteTitle')}

{loading ? (

{t('loadingInvitation')}

) : ( <> {inviteInfo && (

{t('organizationLabel')}{' '} {inviteInfo.organizationName}

{t('emailLabel')}{' '} {inviteInfo.email}

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

{t('alreadyHaveAccess')}{' '} {t('goToLogin')}

)}
); } function AcceptInviteFallback() { const t = useTranslations('auth'); return (

{t('loadingInvitation')}

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