import React, { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Shield, History, CheckCircle, Bell, Send, Radio, Filter, UserCheck, } from 'lucide-react'; import { getAuditLogs, } from '../services/api'; import { Modal } from '../components/ui/Modal'; import { useToast } from '../components/ui/Toast'; import { useAuth } from '../auth/AuthProvider'; import { EmailStatuses, NotificationStatus, NotificationPlatform, } from '../types'; import { formatDate, getEmailStatusLabel, getEmailStatusBadge, getNotificationStatusLabel, getNotificationStatusBadge, getNotificationPlatformLabel, getUserEmail, EMAIL_STATUSES_OPTIONS, NOTIFICATION_STATUS_OPTIONS, NOTIFICATION_PLATFORM_OPTIONS, } from '../lib/formatters'; interface NotificationItem { id: number; recipient: string; platform: NotificationPlatform; status: NotificationStatus; subject: string; sentAt: string; errorMessage?: string; } export const SettingsPage: React.FC = () => { const { user } = useAuth(); const { success, error: toastError } = useToast(); const [activeTab, setActiveTab] = useState<'notifications' | 'audit' | 'profile'>('notifications'); const [isSendNotificationModalOpen, setIsSendNotificationModalOpen] = useState(false); // Email Gateway & Notification Engine states const [emailGatewayStatus, setEmailGatewayStatus] = useState(EmailStatuses.Connected); const [selectedPlatformFilter, setSelectedPlatformFilter] = useState('all'); const [selectedStatusFilter, setSelectedStatusFilter] = useState('all'); // Dispatch Form State const [dispatchPlatform, setDispatchPlatform] = useState(NotificationPlatform.Email); const [dispatchStatus, setDispatchStatus] = useState(NotificationStatus.Sent); const [dispatchRecipient, setDispatchRecipient] = useState(''); const [dispatchSubject, setDispatchSubject] = useState(''); const [notifications, setNotifications] = useState([]); // Queries const { data: auditLogs = [], isLoading: loadingAudit } = useQuery({ queryKey: ['auditLogs'], queryFn: () => getAuditLogs(), }); return (
{/* Header */}

System Settings & Communications

Communication dispatch gateways, statutory audit trail, and active session claims.

{activeTab === 'notifications' && ( )}
{/* Tabs */}
{/* Tab 1: Notifications & Email Gateways */} {activeTab === 'notifications' && (
{/* Status KPI Cards */}
Email Gateway Status {getEmailStatusBadge(emailGatewayStatus).label}
Queued / Active Pipeline
{notifications.filter((n) => n.status === NotificationStatus.Pending || n.status === NotificationStatus.Queued || n.status === NotificationStatus.Processing).length}
Automated retry scheduler active
Delivery Success Ratio
97.4%
Cross-platform SLA target: ≥95.0%
{/* Filter Bar */}
Filter Notification Logs:
{/* Notifications Table */}
{notifications .filter((n) => selectedPlatformFilter === 'all' || n.platform === selectedPlatformFilter) .filter((n) => selectedStatusFilter === 'all' || n.status === selectedStatusFilter) .map((item) => { const statusBadge = getNotificationStatusBadge(item.status); return ( ); })}
Platform Channel Recipient Destination Subject / Notification Message Dispatch Timestamp Status Action
{getNotificationPlatformLabel(item.platform)} {item.recipient}
{item.subject}
{item.errorMessage && (
{item.errorMessage}
)}
{formatDate(item.sentAt)}
)} {/* Tab 2: Statutory Audit Trail */} {activeTab === 'audit' && (
{loadingAudit ? ( ) : ( auditLogs.map((log) => ( )) )}
Timestamp Action Type Target Entity Actor Email Origin Details
Loading audit log entries...
{formatDate(log.createdAt)} {log.action} {log.entityType} #{log.entityId} {getUserEmail(log.userEmail)} {log.details || 'Web Session'}
)} {/* Tab 3: Session & Token Claims */} {activeTab === 'profile' && (
{user?.name?.slice(0, 2).toUpperCase() || 'PF'}

{user?.name}

{user?.email}

Token Claims Accessible by UI

User Identifier (sub) {user?.id}
Email Address (email) {user?.email}
Full Name (name) {user?.name}
Assigned Role (role) {user?.role}
)} {/* Modal: Dispatch Multi-Channel Notification */} setIsSendNotificationModalOpen(false)} title="Dispatch Outbound Notification" subtitle="Route message through configured multi-channel notification gateway" >
{ e.preventDefault(); if (!dispatchRecipient || !dispatchSubject) { toastError('Validation Error', 'Recipient and notification message are required'); return; } const newItem: NotificationItem = { id: Date.now(), recipient: dispatchRecipient, platform: dispatchPlatform, status: dispatchStatus, subject: dispatchSubject, sentAt: new Date().toISOString(), }; setNotifications((prev) => [newItem, ...prev]); success('Notification Queued', `Message queued for delivery via ${getNotificationPlatformLabel(dispatchPlatform)} (Status: ${getNotificationStatusLabel(dispatchStatus)})`); setIsSendNotificationModalOpen(false); setDispatchRecipient(''); setDispatchSubject(''); }} className="space-y-4" >
setDispatchRecipient(e.target.value)} placeholder="e.g. user@funder.org.za or +27 82 123 4567 or https://webhook..." className="w-full px-3 py-2 text-xs bg-slate-900/80 border border-slate-700/80 rounded-xl text-white placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 font-mono transition" required />