'use client'; import { useState, useEffect } from 'react'; import { apiClient } from '@/lib/apiClient'; import Card from '@/components/ui/Card'; import StatusBadge from '@/components/ui/StatusBadge'; import { AdminViewModelService } from '@/lib/services/AdminViewModelService'; import { AdminUserViewModel, UserListViewModel } from '@/lib/view-models/AdminUserViewModel'; import { Search, Filter, RefreshCw, Users, Shield, Trash2, AlertTriangle } from 'lucide-react'; export function AdminUsersPage() { const [userList, setUserList] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [search, setSearch] = useState(''); const [roleFilter, setRoleFilter] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const [deletingUser, setDeletingUser] = useState(null); useEffect(() => { const timeout = setTimeout(() => { loadUsers(); }, 300); return () => clearTimeout(timeout); }, [search, roleFilter, statusFilter]); const loadUsers = async () => { try { setLoading(true); setError(null); const response = await apiClient.admin.listUsers({ search: search || undefined, role: roleFilter || undefined, status: statusFilter || undefined, page: 1, limit: 50, }); // Map DTO to View Model const viewModel = AdminViewModelService.mapUserList(response); setUserList(viewModel); } catch (err) { const message = err instanceof Error ? err.message : 'Failed to load users'; if (message.includes('403') || message.includes('401')) { setError('Access denied - You must be logged in as an Owner or Admin'); } else { setError(message); } } finally { setLoading(false); } }; const handleUpdateStatus = async (userId: string, newStatus: string) => { try { await apiClient.admin.updateUserStatus(userId, newStatus); await loadUsers(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to update status'); } }; const handleDeleteUser = async (userId: string) => { if (!confirm('Are you sure you want to delete this user? This action cannot be undone.')) { return; } try { setDeletingUser(userId); await apiClient.admin.deleteUser(userId); await loadUsers(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to delete user'); } finally { setDeletingUser(null); } }; const clearFilters = () => { setSearch(''); setRoleFilter(''); setStatusFilter(''); }; return (
{/* Header */}

User Management

Manage and monitor all system users

{/* Error Banner */} {error && (
Error
{error}
)} {/* Filters Card */}
Filters
{(search || roleFilter || statusFilter) && ( )}
setSearch(e.target.value)} className="w-full pl-9 pr-3 py-2 bg-deep-graphite border border-charcoal-outline rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-primary-blue transition-colors" />
{/* Users Table */} {loading ? (
Loading users...
) : !userList || !userList.hasUsers ? (
No users found
) : (
{userList.users.map((user: AdminUserViewModel, index: number) => ( ))}
User Email Roles Status Last Login Actions
{user.displayName}
ID: {user.id}
{user.primaryDriverId && (
Driver: {user.primaryDriverId}
)}
{user.email}
{user.roleBadges.map((badge: string, idx: number) => ( {badge} ))}
{user.lastLoginFormatted}
{user.canSuspend && ( )} {user.canActivate && ( )} {user.canDelete && ( )}
)}
{/* Stats Summary */} {userList && (
Total Users
{userList.total}
Active
{userList.users.filter(u => u.status === 'active').length}
Admins
{userList.users.filter(u => u.isSystemAdmin).length}
)}
); }