'use client' import { useEffect, useState } from 'react' import { ADMIN_API_BASE } from '@/lib/api' interface AdminUser { id: string firstName: string lastName: string email: string role: string isActive: boolean createdAt: string permissions?: { id: string; resource: string; actions: string[] }[] } const ROLES = ['SUPER_ADMIN', 'ADMIN', 'SUPPORT', 'FINANCE', 'VIEWER'] const EMPTY_FORM = { firstName: '', lastName: '', email: '', password: '', role: 'SUPPORT', isActive: true, } export default function AdminUsersPage() { const [admins, setAdmins] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showModal, setShowModal] = useState(false) const [editingAdminId, setEditingAdminId] = useState(null) const [form, setForm] = useState(EMPTY_FORM) const [showPassword, setShowPassword] = useState(false) const [saving, setSaving] = useState(false) async function fetchAdmins() { try { const res = await fetch(`${ADMIN_API_BASE}/admin/admins`, { cache: 'no-store', credentials: 'include', }) const json = await res.json() if (!res.ok) throw new Error(json?.message ?? 'Failed') setAdmins(json.data ?? []) } catch (err: any) { setError(err.message) } finally { setLoading(false) } } useEffect(() => { fetchAdmins() }, []) function openCreateModal() { setEditingAdminId(null) setForm(EMPTY_FORM) setShowPassword(false) setError(null) setShowModal(true) } function openEditModal(admin: AdminUser) { setEditingAdminId(admin.id) setForm({ firstName: admin.firstName, lastName: admin.lastName, email: admin.email, password: '', role: admin.role, isActive: admin.isActive, }) setError(null) setShowModal(true) } function closeModal() { setShowModal(false) setEditingAdminId(null) setShowPassword(false) setForm(EMPTY_FORM) } async function saveAdmin(e: React.FormEvent) { e.preventDefault() setSaving(true) setError(null) try { const isEditing = Boolean(editingAdminId) const payload = { firstName: form.firstName, lastName: form.lastName, email: form.email, role: form.role, isActive: form.isActive, ...(form.password ? { password: form.password } : {}), } const res = await fetch(`${ADMIN_API_BASE}/admin/admins${editingAdminId ? `/${editingAdminId}` : ''}`, { method: isEditing ? 'PATCH' : 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify(payload), }) const json = await res.json() if (!res.ok) throw new Error(json?.message ?? `Failed to ${isEditing ? 'update' : 'create'} admin`) closeModal() await fetchAdmins() } catch (err: any) { setError(err.message) } finally { setSaving(false) } } const ROLE_COLORS: Record = { SUPER_ADMIN: 'text-emerald-400 bg-emerald-950/40', ADMIN: 'text-sky-400 bg-sky-950/40', SUPPORT: 'text-orange-400 bg-orange-950/40', FINANCE: 'text-violet-400 bg-violet-950/40', VIEWER: 'text-zinc-400 bg-zinc-800', } return (

Platform

Admin Users

{error &&
{error}
}
{loading ? ( ) : admins.length === 0 ? ( ) : admins.map((a) => ( ))}
Name Email Role Permissions Status Joined Actions
Loading…
No admin users found
{a.firstName} {a.lastName} {a.email} {a.role} {a.permissions && a.permissions.length > 0 ? a.permissions.map((permission) => permission.resource).join(', ') : 'Role-based only'} {a.isActive ? 'Active' : 'Inactive'} {new Date(a.createdAt).toLocaleDateString()}
{showModal && (

{editingAdminId ? 'Edit admin user' : 'New admin user'}

setForm({ ...form, firstName: e.target.value })} />
setForm({ ...form, lastName: e.target.value })} />
setForm({ ...form, email: e.target.value })} />
setForm({ ...form, password: e.target.value })} />
)}
) }