'use client'; import { useEffect, useState } from 'react'; import { usersService, User, uploadService } from '@/services'; import Link from 'next/link'; export default function DashboardPage() { const [stats, setStats] = useState({ totalUsers: 0, activeUsers: 0, agents: 0, pendingUsers: 0, }); const [isLoading, setIsLoading] = useState(true); const [recentUsers, setRecentUsers] = useState([]); const [avatarUrls, setAvatarUrls] = useState>({}); useEffect(() => { fetchDashboardData(); }, []); const fetchDashboardData = async () => { setIsLoading(true); try { const response = await usersService.getUsers({ page: 1, limit: 100 }); const users = response.users || []; setStats({ totalUsers: response.total || 0, activeUsers: users.filter((u) => u.status === 'ACTIVE').length, agents: users.filter((u) => u.role === 'AGENT').length, pendingUsers: users.filter((u) => u.status === 'PENDING_VERIFICATION').length, }); const recent = users.slice(0, 5); setRecentUsers(recent); // Fetch presigned URLs for avatars const urls: Record = {}; await Promise.all( recent.map(async (user) => { if (user.profile?.avatar && uploadService.isS3Key(user.profile.avatar)) { try { urls[user.id] = await uploadService.getPresignedDownloadUrl(user.profile.avatar); } catch { // Ignore errors for individual avatar fetches } } }) ); setAvatarUrls(urls); } catch (err) { console.error('Failed to fetch dashboard data:', err); } finally { setIsLoading(false); } }; if (isLoading) { return (
); } return (
{/* Page Title */}

Dashboard

Welcome to Re-Quest Admin Panel

{/* Stats Cards */}

Total Users

{stats.totalUsers}

Active

{stats.activeUsers}

Agents

{stats.agents}

Pending

{stats.pendingUsers}

{/* Recent Users */}

Recent Users

View All →
{recentUsers.length === 0 ? (

No users found

) : ( {recentUsers.map((user) => ( ))}
User Role Status Joined
{avatarUrls[user.id] ? ( ) : (
{user.profile?.firstName?.[0] || user.email[0].toUpperCase()}
)}
{user.profile?.firstName} {user.profile?.lastName}
{user.email}
{user.role} {user.status === 'PENDING_VERIFICATION' ? 'PENDING' : user.status} {new Date(user.createdAt).toLocaleDateString()}
)}
); }