'use client'; import { Suspense, useEffect, useMemo, useState } 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 { organizationApi } from '@/lib/api/organization'; function AcceptOrganizationInviteContent() { 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<{ ownerEmail: string; organizationName: string; organizationType: 'CLINIC' | 'LAB'; inviterOrganizationName: string; expiresAt: string; status: 'PENDING' | 'ACCEPTED'; } | null>(null); const [ownerName, setOwnerName] = useState(''); const [organizationName, setOrganizationName] = 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 organizationApi.previewInvite(token); setInviteInfo(res.data); setOrganizationName(res.data.organizationName || ''); 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 (!ownerName.trim()) return setError('Owner name is required'); if (!organizationName.trim()) return setError('Organization name is required'); if (password.length < 8) return setError('Password must be at least 8 characters'); if (password !== confirmPassword) return setError('Passwords do not match'); setSubmitting(true); try { await organizationApi.acceptInvite({ token, ownerName: ownerName.trim(), organizationName: organizationName.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 && (Invited by: {inviteInfo.inviterOrganizationName}
Owner email: {inviteInfo.ownerEmail}
Already have access? Go to login
> )}Loading invitation...
} >