import { For, Show, createMemo, createSignal, onMount } from 'solid-js'; import { CARD, BTN_PRIMARY, BTN_GHOST } from '~/components/DashboardShell'; const API = '/api/gateway'; type AdminMetrics = { totalUsers: number; pendingVerifications: number; activeSessions: number; totalRoles: number; totalPhotographers: number; totalCustomers: number; totalCompanies: number; totalJobSeekers: number; }; async function adminFetch(path: string, opts?: RequestInit) { const token = typeof window !== 'undefined' ? window.sessionStorage.getItem('nxtgauge_access_token') || '' : ''; const cleanPath = path.startsWith('/api/') ? path.slice(4) : path; return fetch(`${API}${cleanPath}`, { ...opts, credentials: 'include', headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: `Bearer ${token}` } : {}), ...(opts?.headers ?? {}), }, }); } export default function AdminDashboardPage() { const [metrics, setMetrics] = createSignal({ totalUsers: 0, pendingVerifications: 0, activeSessions: 0, totalRoles: 0, totalPhotographers: 0, totalCustomers: 0, totalCompanies: 0, totalJobSeekers: 0, }); const [loading, setLoading] = createSignal(true); const [error, setError] = createSignal(''); const loadAdminMetrics = async () => { setLoading(true); setError(''); try { const [usersRes, rolesRes, photographersRes, customersRes, companiesRes, jobSeekersRes] = await Promise.all([ adminFetch('/api/admin/users?page=1&limit=1'), adminFetch('/api/admin/roles'), adminFetch('/api/admin/users?role=photographer&page=1&limit=1'), adminFetch('/api/admin/users?role=customer&page=1&limit=1'), adminFetch('/api/admin/users?role=company&page=1&limit=1'), adminFetch('/api/admin/users?role=jobseeker&page=1&limit=1'), ]); const usersJson = await usersRes.json().catch(() => ({})); const rolesJson = await rolesRes.json().catch(() => ({})); const photographersJson = await photographersRes.json().catch(() => ({})); const customersJson = await customersRes.json().catch(() => ({})); const companiesJson = await companiesRes.json().catch(() => ({})); const jobSeekersJson = await jobSeekersRes.json().catch(() => ({})); setMetrics({ totalUsers: usersJson?.total ?? usersJson?.count ?? 0, pendingVerifications: 0, activeSessions: 0, totalRoles: Array.isArray(rolesJson) ? rolesJson.length : 0, totalPhotographers: photographersJson?.total ?? photographersJson?.count ?? 0, totalCustomers: customersJson?.total ?? customersJson?.count ?? 0, totalCompanies: companiesJson?.total ?? companiesJson?.count ?? 0, totalJobSeekers: jobSeekersJson?.total ?? jobSeekersJson?.count ?? 0, }); } catch (e: any) { setError('Failed to load admin metrics: ' + e.message); } finally { setLoading(false); } }; onMount(loadAdminMetrics); const statCards = createMemo(() => [ { label: 'Total Users', value: metrics().totalUsers, color: '#0D0D2A' }, { label: 'Photographers', value: metrics().totalPhotographers, color: '#FF5E13' }, { label: 'Customers', value: metrics().totalCustomers, color: '#059669' }, { label: 'Companies', value: metrics().totalCompanies, color: '#7C3AED' }, { label: 'Job Seekers', value: metrics().totalJobSeekers, color: '#DC2626' }, { label: 'Pending Verifications', value: metrics().pendingVerifications, color: '#D97706' }, ]); return (

Admin Dashboard

Platform overview and management metrics.

{error()}
Loading admin metrics...
{(stat) => (

{stat.label}

{stat.value}

)}

Quick Actions

); }