import { useState } from 'react'; import { req, saveToken, ENDPOINTS } from '../api'; import { Card, CardHeader, Callout, FormGroup, ResponseBox } from '../components/ui'; const { AUTH, ADMIN, RISK } = ENDPOINTS; function EmailStatusBody({ data }) { if (!data) return

Click Refresh to check email configuration.

; const configured = data.configured; const fields = data.fields || {}; return (
{configured ? 'โœ” Configured' : 'โœ˜ Not Configured'} {data.mail_port && ( Port: {data.mail_port}  ยท  STARTTLS: {data.starttls ? 'Yes' : 'No'} )}
{Object.entries(fields).map(([k, v]) => (
ADAPTIVEAUTH_{k} {v ? 'Set' : 'Missing'}
))} {!configured && data.setup_instructions && ( Setup: Create a .env file with the missing fields above.
{data.setup_instructions}
)}
); } export default function AdminTab({ onTokenSave }) { const [adminLoginResp, setAdminLoginResp] = useState(null); const [statsData, setStatsData] = useState(null); const [emailData, setEmailData] = useState(null); const [adminUserResp, setAdminUserResp] = useState(null); const [adminRiskResp, setAdminRiskResp] = useState(null); const [statsResp, setStatsResp] = useState(null); const [adminUserId, setAdminUserId] = useState(''); const [loading, setLoading] = useState({}); const setLoad = (k, v) => setLoading(p => ({ ...p, [k]: v })); const quickAdminLogin = async () => { setLoad('login', true); const r = await req(`${AUTH}/login`, 'POST', { email: 'demo.admin@adaptive.demo', password: 'Admin@Demo456!' }, false); setAdminLoginResp(r); if (r.ok && r.data?.access_token) { saveToken(r.data.access_token); onTokenSave?.(); } setLoad('login', false); }; const loadAdminStats = async () => { setLoad('stats', true); const r = await req(`${ADMIN}/statistics`); if (r.ok) setStatsData(r.data); setLoad('stats', false); }; const checkEmailStatus = async () => { setLoad('email', true); const r = await req(`${ADMIN}/email-status`); if (r.ok) setEmailData(r.data); else setEmailData(null); setLoad('email', false); }; const userCall = async (url, method = 'GET') => { setLoad('user', true); setAdminUserResp(await req(url, method)); setLoad('user', false); }; const riskCall = async (url) => { setLoad('risk', true); setAdminRiskResp(await req(url)); setLoad('risk', false); }; const adminBlock = async () => { if (!adminUserId) { alert('Enter user ID.'); return; } await userCall(`${ADMIN}/users/${adminUserId}/block`, 'POST'); }; const adminUnblock = async () => { if (!adminUserId) { alert('Enter user ID.'); return; } await userCall(`${ADMIN}/users/${adminUserId}/unblock`, 'POST'); }; const STAT_ITEMS = [ { key: 'total_users', label: 'Total Users', color: 'var(--info)' }, { key: 'active_sessions', label: 'Active Sessions',color: 'var(--success)' }, { key: 'high_risk_events_today',label: 'High Risk Today',color: 'var(--danger)' }, { key: 'failed_logins_today', label: 'Failed Logins', color: 'var(--warn)' }, ]; return (
Admin endpoints require an admin JWT token. Login with{' '} demo.admin@adaptive.demo / Admin@Demo456! first. {/* Quick Admin Login */} Quick Admin Login
demo.admin@adaptive.demo / Admin@Demo456!
{/* Stats */}
{STAT_ITEMS.map(s => (
{statsData ? (statsData[s.key] ?? 'โ€”') : 'โ€”'}
{s.label}
))}
{/* Email Status */} {loading.email ? 'โ€ฆ' : '๐Ÿ”„ Refresh'} } > Email Service Status
{/* User Management */} User Management
setAdminUserId(e.target.value)} placeholder="User ID" />
{/* Risk Events */} Risk Events & Anomalies
{/* Risk Stats */} Risk Statistics
{['day','week','month'].map(p => ( ))}
); }