import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { useNavigate } from 'react-router-dom'; import { RefreshCw, LogOut, Building2, Clock, ArrowLeft, Sparkles, } from 'lucide-react'; import { PfmPartnerLogo } from '../common/PfmPartnerLogo'; import { AuthUserProfile, UserClaims } from '../../auth/AuthProvider'; import { cancelSessionExpiration, dismissSubordinateModals } from '../../services/sessionExpiration'; interface AccountActivationModalProps { user: AuthUserProfile | null; claims: UserClaims; sub: string; onSync: (force?: boolean) => Promise<{ success: boolean; isUnauthorized?: boolean; errorMessage?: string }>; onLogout: () => Promise; initialError?: string | null; } const formatLockoutMessage = (msg?: string | null): string | null => { if (!msg) return null; const trimmed = msg.trim(); if (/^network\s*error$/i.test(trimmed)) { return 'Permission Check'; } return trimmed.replace(/network\s*error/gi, 'Permission Check'); }; export const AccountActivationModal: React.FC = ({ user, claims, onSync, onLogout, initialError, }) => { const navigate = useNavigate(); const [isSyncing, setIsSyncing] = useState(false); const [errorMessage, setErrorMessage] = useState(formatLockoutMessage(initialError) || null); useEffect(() => { if (initialError !== undefined) { setErrorMessage(formatLockoutMessage(initialError)); } }, [initialError]); useEffect(() => { cancelSessionExpiration(); dismissSubordinateModals(); }, []); const displayName = user?.name || (claims.name as string) || (claims.preferred_username as string) || 'Partner'; const tenant = user?.tenant || (claims.tenant as string) || (claims.org as string) || 'Partner Organisation'; const handleSyncClick = async () => { if (isSyncing) return; setIsSyncing(true); setErrorMessage(null); try { const result = await onSync(true); if (result.isUnauthorized) { await onLogout(); navigate('/', { replace: true }); return; } if (!result.success) { setErrorMessage( formatLockoutMessage( result.errorMessage || 'Activation is still being reviewed by your funding administrator. Please check back shortly.' ) ); } } catch (err: unknown) { const errObj = err as { response?: { status?: number }; message?: string }; if (errObj?.response?.status === 401) { await onLogout(); navigate('/', { replace: true }); return; } setErrorMessage('Permission Check: Unable to verify activation right now. Please try again in a few moments.'); } finally { setIsSyncing(false); } }; const handleSignOut = async () => { await onLogout(); navigate('/', { replace: true }); }; const handleNavigateLanding = () => { navigate('/'); }; const modalContent = (
{/* Background ambient lighting matching LandingPage */}
e.stopPropagation()} > {/* Glowing Brand Icon Lockup */}
{/* Title & Organization Pill */}
Activation Pending

Welcome,{' '} {displayName}

{tenant}
{/* Core Friendly Message */}

Your credentials have been authenticated. Your funding administrator is finalizing your portfolio access.

{/* Notice badge if check returned not yet ready */} {errorMessage && (
{formatLockoutMessage(errorMessage)}
)} {/* Action Button matching Specular / Landing styling */}
{/* Minimal Secondary Actions */}
•
); return typeof document !== 'undefined' ? createPortal(modalContent, document.body) : modalContent; };