'use client'; import { useState, useEffect, useCallback, useMemo } from 'react'; import { useRouter } from 'next/navigation'; import { adminService } from '@/services/admin.service'; import { User, CreateEmployeeData, UpdateUserData, PaginatedResponse } from '@/types'; import { Pagination } from '@/components/ui'; export default function UserManagement() { const router = useRouter(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [filterRole, setFilterRole] = useState(''); const [filterStatus, setFilterStatus] = useState(''); const [searchQuery, setSearchQuery] = useState(''); // Filtrage côté client par nom/email const filteredUsers = useMemo(() => { if (!searchQuery.trim()) return users; const query = searchQuery.toLowerCase().trim(); return users.filter(user => user.firstName?.toLowerCase().includes(query) || user.lastName?.toLowerCase().includes(query) || user.email?.toLowerCase().includes(query) || `${user.firstName} ${user.lastName}`.toLowerCase().includes(query) ); }, [users, searchQuery]); // Modals const [isCreateEmployeeModalOpen, setIsCreateEmployeeModalOpen] = useState(false); const [isEditUserModalOpen, setIsEditUserModalOpen] = useState(false); const [editingUser, setEditingUser] = useState(null); // Form data const [employeeFormData, setEmployeeFormData] = useState({ email: '', password: '', firstName: '', lastName: '', }); const [userFormData, setUserFormData] = useState({}); const loadUsers = useCallback(async () => { try { setLoading(true); setError(null); const filters: any = {}; if (filterRole) filters.role = filterRole; if (filterStatus) filters.isActive = filterStatus === 'active'; const response: PaginatedResponse = await adminService.getAllUsers( page, 100, // Charger plus pour le filtrage côté client Object.keys(filters).length > 0 ? filters : undefined ); setUsers(response.data || []); setTotalPages(response.totalPages || 1); } catch (err: any) { setError(err.message || 'Erreur lors du chargement des utilisateurs'); setUsers([]); } finally { setLoading(false); } }, [page, filterRole, filterStatus]); useEffect(() => { loadUsers(); }, [loadUsers]); const handleCreateEmployee = async (e: React.FormEvent) => { e.preventDefault(); try { await adminService.createEmployee(employeeFormData); setIsCreateEmployeeModalOpen(false); setEmployeeFormData({ email: '', password: '', firstName: '', lastName: '' }); loadUsers(); } catch (err: any) { alert(err.message || 'Erreur lors de la création de l\'employé'); } }; const handleEditUser = (user: User) => { setEditingUser(user); setUserFormData({ role: user.role, firstName: user.firstName, lastName: user.lastName, }); setIsEditUserModalOpen(true); }; const handleUpdateUser = async (e: React.FormEvent) => { e.preventDefault(); if (!editingUser) return; try { await adminService.updateUser(editingUser.id, userFormData); setIsEditUserModalOpen(false); setEditingUser(null); loadUsers(); } catch (err: any) { alert(err.message || 'Erreur lors de la modification de l\'utilisateur'); } }; const handleToggleUserStatus = async (user: User) => { const action = user.isActive ? 'désactiver' : 'réactiver'; if (!confirm(`Êtes-vous sûr de vouloir ${action} cet utilisateur ?`)) return; try { await adminService.updateUser(user.id, { isActive: !user.isActive }); loadUsers(); } catch (err: any) { alert(err.message || `Erreur lors de la ${action}ation`); } }; const getRoleBadgeColor = (role: string) => { switch (role) { case 'ADMIN': return 'bg-red-100 text-red-800'; case 'EMPLOYEE': return 'bg-blue-100 text-blue-800'; case 'CLIENT': return 'bg-green-100 text-green-800'; default: return 'bg-gray-100 text-gray-800'; } }; if (loading && users.length === 0) { return
Chargement des utilisateurs...
; } return (

Gestion des Utilisateurs

{error && (
{error}
)} {/* Filtres */}
setSearchQuery(e.target.value)} className="w-full border rounded px-3 py-2" />
{/* Table des utilisateurs */}
{filteredUsers.length === 0 ? ( ) : ( filteredUsers.map((user) => ( )) )}
Utilisateur Email Rôle Statut Date création Actions
{searchQuery ? 'Aucun résultat pour cette recherche' : 'Aucun utilisateur trouvé'}
{user.firstName} {user.lastName}
{user.email}
{user.role} {user.isActive !== false ? 'Actif' : 'Inactif'} {new Date(user.createdAt).toLocaleDateString('fr-FR')}
{/* Pagination */} {/* Modal créer employé */} {isCreateEmployeeModalOpen && (

Créer un employé

setEmployeeFormData({ ...employeeFormData, email: e.target.value })} className="w-full border rounded px-3 py-2" required />
setEmployeeFormData({ ...employeeFormData, password: e.target.value })} className="w-full border rounded px-3 py-2" required />
setEmployeeFormData({ ...employeeFormData, firstName: e.target.value })} className="w-full border rounded px-3 py-2" required />
setEmployeeFormData({ ...employeeFormData, lastName: e.target.value })} className="w-full border rounded px-3 py-2" required />
)} {/* Modal modifier utilisateur */} {isEditUserModalOpen && editingUser && (

Modifier l'utilisateur

)}
); }