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 => (
))}
);
}