'use client'; import React, { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { Card, Table, StatusBadge, Pagination, Button } from '../../../../shared/components'; import { PencilEdit01Icon } from '../../../../shared/Icons.js'; import { useToast } from '@zen/core/toast'; const UsersPageClient = () => { const router = useRouter(); const toast = useToast(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); // Pagination state const [pagination, setPagination] = useState({ page: 1, limit: 20, total: 0, totalPages: 0 }); // Sort state const [sortBy, setSortBy] = useState('created_at'); const [sortOrder, setSortOrder] = useState('desc'); // Table columns configuration const columns = [ { key: 'name', label: 'Nom', sortable: true, render: (user) => (
{user.name}
ID: {user.id.slice(0, 8)}...
), 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%', } }, { key: 'role', label: 'Rôle', sortable: true, render: (user) => , skeleton: { height: 'h-6', width: '80px', className: 'rounded-full' } }, { key: 'email_verified', label: 'Statut', sortable: true, render: (user) => , skeleton: { height: 'h-6', width: '90px', className: 'rounded-full' } }, { key: 'created_at', label: 'Créé le', sortable: true, render: (user) => ( {formatDate(user.created_at)} ), skeleton: { height: 'h-4', width: '70%' } }, { key: 'actions', label: '', sortable: false, noWrap: true, render: (user) => ( ), skeleton: { height: 'h-8', width: '80px', className: 'rounded-lg' } } ]; // Fetch users function const fetchUsers = async () => { setLoading(true); try { const searchParams = new URLSearchParams({ page: pagination.page.toString(), limit: pagination.limit.toString(), sortBy, sortOrder }); const response = await fetch(`/zen/api/users?${searchParams}`, { credentials: 'include' }); if (!response.ok) { throw new Error(`Error: ${response.status}`); } const data = await response.json(); setUsers(data.users); setPagination(prev => ({ ...prev, total: data.pagination.total, totalPages: data.pagination.totalPages, page: data.pagination.page })); } catch (err) { toast.error(err.message || 'Impossible de charger les utilisateurs'); console.error('Error fetching users:', err); } finally { setLoading(false); } }; // Effect to fetch users when sort or pagination change useEffect(() => { fetchUsers(); }, [sortBy, sortOrder, pagination.page, pagination.limit]); // Handle pagination const handlePageChange = (newPage) => { setPagination(prev => ({ ...prev, page: newPage })); }; const handleLimitChange = (newLimit) => { setPagination(prev => ({ ...prev, limit: newLimit, page: 1 // Reset to first page when changing limit })); }; // Handle sorting const handleSort = (newSortBy) => { const newSortOrder = sortBy === newSortBy && sortOrder === 'asc' ? 'desc' : 'asc'; setSortBy(newSortBy); setSortOrder(newSortOrder); }; // Format date helper const formatDate = (dateString) => { if (!dateString) return 'N/A'; try { return new Date(dateString).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); } catch { return 'Date invalide'; } }; return (
{/* Users Table */} ); }; const UsersPage = () => { return (

Utilisateurs

Gérez les comptes utilisateurs

); }; export default UsersPage;