import React, { useState, useEffect } from 'react'; import { Shield, Activity, LogOut, AlertTriangle, CheckCircle2, Clock } from 'lucide-react'; import { toast } from 'react-toastify'; import accountantSecurityService, { AccountantSession, AccountantActivityLog, MFAStatus } from '../../features/security/services/accountantSecurityService'; import Loading from '../../shared/components/Loading'; import EmptyState from '../../shared/components/EmptyState'; import { formatDate } from '../../shared/utils/format'; const SecurityManagementPage: React.FC = () => { const [activeTab, setActiveTab] = useState<'sessions' | 'activity' | 'mfa'>('sessions'); const [loading, setLoading] = useState(true); const [sessions, setSessions] = useState([]); const [activityLogs, setActivityLogs] = useState([]); const [mfaStatus, setMfaStatus] = useState(null); const [pagination, setPagination] = useState(null); useEffect(() => { if (activeTab === 'sessions') fetchSessions(); else if (activeTab === 'activity') fetchActivityLogs(); else if (activeTab === 'mfa') fetchMFAStatus(); }, [activeTab]); const fetchSessions = async () => { try { setLoading(true); const response = await accountantSecurityService.getSessions(); setSessions(response.data.sessions || []); } catch (error: any) { toast.error(error.response?.data?.detail || 'Failed to load sessions'); } finally { setLoading(false); } }; const fetchActivityLogs = async () => { try { setLoading(true); const response = await accountantSecurityService.getActivityLogs({ limit: 50 }); setActivityLogs(response.data.logs || []); setPagination(response.data.pagination); } catch (error: any) { toast.error(error.response?.data?.detail || 'Failed to load activity logs'); } finally { setLoading(false); } }; const fetchMFAStatus = async () => { try { setLoading(true); const response = await accountantSecurityService.getMFAStatus(); setMfaStatus(response.data); } catch (error: any) { toast.error(error.response?.data?.detail || 'Failed to load MFA status'); } finally { setLoading(false); } }; const handleRevokeSession = async (sessionId: number) => { if (!confirm('Are you sure you want to revoke this session?')) return; try { await accountantSecurityService.revokeSession(sessionId); toast.success('Session revoked successfully'); fetchSessions(); } catch (error: any) { toast.error(error.response?.data?.detail || 'Failed to revoke session'); } }; const handleRevokeAllSessions = async () => { if (!confirm('Are you sure you want to revoke all sessions? You will be logged out.')) return; try { await accountantSecurityService.revokeAllSessions(); toast.success('All sessions revoked successfully'); fetchSessions(); } catch (error: any) { toast.error(error.response?.data?.detail || 'Failed to revoke sessions'); } }; const getRiskColor = (risk: string) => { switch (risk) { case 'critical': return 'bg-red-100 text-red-800 border-red-200'; case 'high': return 'bg-orange-100 text-orange-800 border-orange-200'; case 'medium': return 'bg-yellow-100 text-yellow-800 border-yellow-200'; default: return 'bg-blue-100 text-blue-800 border-blue-200'; } }; if (loading && sessions.length === 0 && activityLogs.length === 0 && !mfaStatus) { return ; } return (
{/* Header */}

Security Management

Manage sessions, view activity logs, and MFA settings

{/* Tabs */}
{/* Content */} {activeTab === 'sessions' && (

Active Sessions

{sessions.length === 0 ? ( ) : (
{sessions.map((session) => (

Session #{session.id}

{session.step_up_authenticated && ( Step-up Authenticated )}

IP Address: {session.ip_address || 'N/A'}

Location: {session.city && session.country ? `${session.city}, ${session.country}` : 'N/A'}

Last Activity: {formatDate(session.last_activity)}

Expires: {formatDate(session.expires_at)}

))}
)}
)} {activeTab === 'activity' && (

Activity Logs

{activityLogs.length === 0 ? ( ) : (
{activityLogs.map((log) => (

{log.activity_type.replace(/_/g, ' ')}

{log.risk_level} {log.is_unusual && ( Unusual )}

{log.activity_description}

IP: {log.ip_address || 'N/A'} {log.country && Location: {log.country}} {formatDate(log.created_at)}
))}
)}
)} {activeTab === 'mfa' && mfaStatus && (

MFA Status

MFA Required {mfaStatus.requires_mfa ? 'Yes' : 'No'}
MFA Enabled {mfaStatus.mfa_enabled ? 'Yes' : 'No'}
MFA Enforced {mfaStatus.is_enforced ? 'Yes' : 'No'}
Backup Codes {mfaStatus.backup_codes_count} remaining
{mfaStatus.enforcement_reason && (

Note: {mfaStatus.enforcement_reason}

)}
)}
); }; export default SecurityManagementPage;