'use client' import { useEffect, useMemo, useState } from 'react' import { useRouter } from 'next/navigation' import { authFetch, clearToken, getApiBase, getToken } from '../lib/auth' import AdminShell from '../ui/AdminShell' type ServiceState = { name: string status: string message?: string } type RecentRequest = { id: number title?: string | null year?: number | null statusLabel?: string | null requestedBy?: string | null createdAt?: string | null } type PortalOverview = { overview?: { total_items?: number total_comments?: number by_kind?: Record by_status?: Record } my_items?: number } const formatDateTime = (value?: string | null) => { if (!value) return 'Unknown' const date = new Date(value) if (Number.isNaN(date.valueOf())) return value return date.toLocaleString() } const normalizeRecent = (items: any[]): RecentRequest[] => items .filter((item) => item?.id) .map((item) => ({ id: Number(item.id), title: item.title ?? null, year: item.year ?? null, statusLabel: item.statusLabel ?? null, requestedBy: item.requestedBy ?? null, createdAt: item.createdAt ?? null, })) export default function AdminLandingPage() { const router = useRouter() const [services, setServices] = useState([]) const [serviceOverall, setServiceOverall] = useState('unknown') const [recent, setRecent] = useState([]) const [portalOverview, setPortalOverview] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [serviceTesting, setServiceTesting] = useState>({}) const [serviceTestResults, setServiceTestResults] = useState>({}) const [serviceCheckedAt, setServiceCheckedAt] = useState(null) useEffect(() => { if (!getToken()) { router.push('/login') return } const load = async () => { setLoading(true) setError(null) try { const baseUrl = getApiBase() const [meResponse, serviceResponse, recentResponse, overviewResponse] = await Promise.all([ authFetch(`${baseUrl}/auth/me`), authFetch(`${baseUrl}/status/services`), authFetch(`${baseUrl}/requests/recent?take=8&days=0`), authFetch(`${baseUrl}/portal/overview`), ]) if (meResponse.status === 401) { clearToken() router.push('/login') return } if (meResponse.status === 403) { router.push('/') return } const me = await meResponse.json() if (me?.role !== 'admin') { router.push('/') return } if (serviceResponse.ok) { const data = await serviceResponse.json() setServiceOverall(data?.overall ?? 'unknown') setServices(Array.isArray(data?.services) ? data.services : []) setServiceCheckedAt(new Date().toISOString()) } if (recentResponse.ok) { const data = await recentResponse.json() setRecent(Array.isArray(data?.results) ? normalizeRecent(data.results) : []) } if (overviewResponse.ok) { const data = await overviewResponse.json() setPortalOverview(data) } } catch (err) { console.error(err) setError('Unable to load the operations dashboard.') } finally { setLoading(false) } } void load() const refreshTimer = window.setInterval(async () => { try { const response = await authFetch(`${getApiBase()}/status/services`) if (!response.ok) return const data = await response.json() setServiceOverall(data?.overall ?? 'unknown') setServices(Array.isArray(data?.services) ? data.services : []) setServiceCheckedAt(new Date().toISOString()) } catch (err) { console.error(err) } }, 30_000) return () => window.clearInterval(refreshTimer) }, [router]) const testService = async (service: ServiceState) => { const slug = service.name.toLowerCase().replace(/[^a-z0-9]/g, '') setServiceTesting((current) => ({ ...current, [service.name]: true })) setServiceTestResults((current) => { const next = { ...current } delete next[service.name] return next }) try { const response = await authFetch(`${getApiBase()}/status/services/${slug}/test`, { method: 'POST', }) if (!response.ok) { const text = await response.text() throw new Error(text || `Service test failed: ${response.status}`) } const result = await response.json() setServices((current) => current.map((item) => item.name === service.name ? { ...item, status: result?.status ?? item.status, message: result?.message ?? item.message } : item )) setServiceTestResults((current) => ({ ...current, [service.name]: result?.message || (result?.status === 'up' ? 'Connection test passed.' : 'Connection test completed.'), })) setServiceCheckedAt(new Date().toISOString()) } catch (err) { console.error(err) setServiceTestResults((current) => ({ ...current, [service.name]: 'Connection test failed.' })) } finally { setServiceTesting((current) => ({ ...current, [service.name]: false })) } } const serviceCounts = useMemo(() => { const up = services.filter((service) => service.status === 'up').length const down = services.filter((service) => service.status === 'down').length const degraded = services.filter((service) => service.status === 'degraded').length const notConfigured = services.filter((service) => service.status === 'not_configured').length return { up, down, degraded, notConfigured, total: services.length } }, [services]) const issueCount = Number(portalOverview?.overview?.by_kind?.issue ?? 0) const requestItemCount = Number(portalOverview?.overview?.by_kind?.request ?? 0) const commentCount = Number(portalOverview?.overview?.total_comments ?? 0) const rail = (
Fleet summary

{serviceCounts.up} of {serviceCounts.total || 0} online

{serviceCounts.down + serviceCounts.degraded > 0 ? `${serviceCounts.down + serviceCounts.degraded} configured service${serviceCounts.down + serviceCounts.degraded === 1 ? '' : 's'} need attention.` : 'No configured service is currently reporting a fault.'}

Open full diagnostics
) return ( router.push('/admin/diagnostics')}> Run diagnostics } > {loading ?
Loading operations dashboard...
: null} {error ?
{error}
: null}
Services online {serviceCounts.up}/{serviceCounts.total || 0}

{serviceOverall === 'up' ? 'All configured services are responding.' : 'Some services need review.'}

Recent requests {recent.length}

Loaded from the live request cache.

Open issue items {issueCount}

{commentCount} portal comments recorded.

Portal requests {requestItemCount}

Tracked in the dedicated request workflow.

Fleet service mesh

System status

Admin-only connectivity status for the services used by Magent. {serviceCheckedAt ? ` Last checked ${formatDateTime(serviceCheckedAt)}.` : ''}

{serviceOverall.replaceAll('_', ' ')}
{services.length === 0 ? (
Service status is not available yet.
) : (
{services.map((service) => { const slug = service.name.toLowerCase().replace(/[^a-z0-9]/g, '') const testing = Boolean(serviceTesting[service.name]) return (

{serviceTestResults[service.name] ?? service.message ?? 'No recent detail was returned.'}

Configure
) })}
)}

Recent activity

Live request cache entries, newest first.

{recent.length === 0 ? (
No recent requests were returned.
) : (
Request Status User Created
{recent.map((row) => ( ))}
)}

Attention states

Service states that affect request processing.

{serviceCounts.down} down {serviceCounts.degraded} degraded {serviceCounts.notConfigured} not configured
) }