feat: Display presigned avatar URLs for recent users on the dashboard.

This commit is contained in:
pradeepkumar
2026-02-01 15:04:11 +05:30
parent f30769d73a
commit f25aee39d9

View File

@@ -1,7 +1,7 @@
'use client'; 'use client';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { usersService, User } from '@/services'; import { usersService, User, uploadService } from '@/services';
import Link from 'next/link'; import Link from 'next/link';
export default function DashboardPage() { export default function DashboardPage() {
@@ -13,6 +13,7 @@ export default function DashboardPage() {
}); });
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const [recentUsers, setRecentUsers] = useState<User[]>([]); const [recentUsers, setRecentUsers] = useState<User[]>([]);
const [avatarUrls, setAvatarUrls] = useState<Record<string, string>>({});
useEffect(() => { useEffect(() => {
fetchDashboardData(); fetchDashboardData();
@@ -29,7 +30,23 @@ export default function DashboardPage() {
agents: users.filter((u) => u.role === 'AGENT').length, agents: users.filter((u) => u.role === 'AGENT').length,
pendingUsers: users.filter((u) => u.status === 'PENDING_VERIFICATION').length, pendingUsers: users.filter((u) => u.status === 'PENDING_VERIFICATION').length,
}); });
setRecentUsers(users.slice(0, 5)); const recent = users.slice(0, 5);
setRecentUsers(recent);
// Fetch presigned URLs for avatars
const urls: Record<string, string> = {};
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) { } catch (err) {
console.error('Failed to fetch dashboard data:', err); console.error('Failed to fetch dashboard data:', err);
} finally { } finally {
@@ -204,10 +221,10 @@ export default function DashboardPage() {
<td className="px-6 py-4 whitespace-nowrap"> <td className="px-6 py-4 whitespace-nowrap">
<div className="flex items-center"> <div className="flex items-center">
<div className="flex-shrink-0 h-10 w-10"> <div className="flex-shrink-0 h-10 w-10">
{user.profile?.avatar ? ( {avatarUrls[user.id] ? (
<img <img
className="h-10 w-10 rounded-full object-cover" className="h-10 w-10 rounded-full object-cover"
src={user.profile.avatar} src={avatarUrls[user.id]}
alt="" alt=""
/> />
) : ( ) : (