diff --git a/src/features/admin/components/AdminHeader.js b/src/features/admin/components/AdminHeader.js index fa61fc6..0ec64c5 100644 --- a/src/features/admin/components/AdminHeader.js +++ b/src/features/admin/components/AdminHeader.js @@ -3,6 +3,7 @@ import { Fragment } from 'react'; import { Menu, MenuButton, MenuItem, MenuItems, Transition } from '@headlessui/react'; import { ChevronDownIcon, User03Icon } from '@zen/core/shared/icons'; +import { UserAvatar } from '@zen/core/shared/components'; import { useRouter, usePathname } from 'next/navigation'; import { useTheme, getThemeIcon } from '@zen/core/themes'; @@ -10,11 +11,6 @@ const AdminHeader = ({ isMobileMenuOpen, setIsMobileMenuOpen, user, onLogout, ap const router = useRouter(); const pathname = usePathname(); - const getImageUrl = (imageKey) => { - if (!imageKey) return null; - return `/zen/api/storage/${imageKey}`; - }; - const handleLogout = async () => { try { if (onLogout) { @@ -34,16 +30,6 @@ const AdminHeader = ({ isMobileMenuOpen, setIsMobileMenuOpen, user, onLogout, ap } }; - const getUserInitials = (name) => { - if (!name) return 'U'; - return name - .split(' ') - .map(n => n[0]) - .join('') - .toUpperCase() - .slice(0, 2); - }; - const { theme, toggle, systemIsDark } = useTheme(); const ThemeIcon = getThemeIcon(theme, systemIsDark); const themeLabel = theme === 'light' ? 'Mode clair' : theme === 'dark' ? 'Mode sombre' : 'Thème système'; @@ -63,8 +49,6 @@ const AdminHeader = ({ isMobileMenuOpen, setIsMobileMenuOpen, user, onLogout, ap })(); const quickLinks = []; - const imageUrl = getImageUrl(user?.image); - const userInitials = getUserInitials(user?.name); return (
@@ -111,18 +95,7 @@ const AdminHeader = ({ isMobileMenuOpen, setIsMobileMenuOpen, user, onLogout, ap {/* User Profile Menu */} - {/* Avatar */} - {imageUrl ? ( - {user?.name - ) : ( -
- {userInitials} -
- )} + {/* Name — desktop only */} {user?.name || 'User'} diff --git a/src/features/admin/pages/UsersPage.client.js b/src/features/admin/pages/UsersPage.client.js index cdb08cb..0b1088b 100644 --- a/src/features/admin/pages/UsersPage.client.js +++ b/src/features/admin/pages/UsersPage.client.js @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; -import { Card, Table, Badge, StatusBadge, Button } from '@zen/core/shared/components'; +import { Card, Table, Badge, StatusBadge, Button, UserAvatar } from '@zen/core/shared/components'; import { PencilEdit01Icon } from '@zen/core/shared/icons'; import { useToast } from '@zen/core/toast'; @@ -29,27 +29,20 @@ const UsersPageClient = () => { const columns = [ { key: 'name', - label: 'Nom', + label: 'Utilisateur', sortable: true, render: (user) => ( -
-
{user.name}
-
ID: {user.id.slice(0, 8)}...
+
+ +
+
{user.name}
+
{user.email}
+
), - skeleton: { + skeleton: { height: 'h-4', width: '60%', - secondary: { height: 'h-3', width: '40%' } - } - }, - { - key: 'email', - label: 'Email', - sortable: true, - render: (user) =>
{user.email}
, - skeleton: { - height: 'h-4', - width: '60%', + secondary: { height: 'h-3', width: '40%' } } }, { diff --git a/src/shared/components/UserAvatar.js b/src/shared/components/UserAvatar.js new file mode 100644 index 0000000..60e1aba --- /dev/null +++ b/src/shared/components/UserAvatar.js @@ -0,0 +1,39 @@ +'use client'; + +const getImageUrl = (imageKey) => { + if (!imageKey) return null; + return `/zen/api/storage/${imageKey}`; +}; + +const getUserInitials = (name) => { + if (!name) return 'U'; + return name.split(' ').map(n => n[0]).join('').toUpperCase().slice(0, 2); +}; + +const sizeMap = { + sm: { wrapper: 'w-[26px] h-[26px]', text: 'text-[10px]' }, + md: { wrapper: 'w-8 h-8', text: 'text-[11px]' }, +}; + +const UserAvatar = ({ user, size = 'md' }) => { + const imageUrl = getImageUrl(user?.image); + const initials = getUserInitials(user?.name); + const { wrapper, text } = sizeMap[size] ?? sizeMap.md; + + if (imageUrl) { + return ( + {user?.name + ); + } + return ( +
+ {initials} +
+ ); +}; + +export default UserAvatar; diff --git a/src/shared/components/index.js b/src/shared/components/index.js index 39f170c..b72ce0d 100644 --- a/src/shared/components/index.js +++ b/src/shared/components/index.js @@ -26,3 +26,4 @@ export { default as FilterTabs } from './FilterTabs'; export { default as Breadcrumb } from './Breadcrumb'; export { default as Switch } from './Switch'; export { default as TagInput } from './TagInput'; +export { default as UserAvatar } from './UserAvatar';