"use client"; import { useState, useMemo } from "react"; import { useCollection } from "@/hooks/useCollection"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { formatDate } from "@/lib/utils"; import { LibreChatUser, LibreChatBalance } from "@/lib/types"; export function UsersTable() { const [page, setPage] = useState(1); const limit = 20; // Charger les utilisateurs const { data: users = [], total = 0, loading: usersLoading, } = useCollection("users", { page, limit, }); // Charger tous les balances pour associer les crédits const { data: balances = [] } = useCollection("balances", { limit: 1000, // Charger tous les balances }); // Créer une map des crédits par utilisateur const creditsMap = useMemo(() => { const map = new Map(); balances.forEach((balance) => { map.set(balance.user, balance.tokenCredits || 0); }); return map; }, [balances]); const totalPages = Math.ceil(total / limit); const handlePrevPage = () => { setPage((prev) => Math.max(1, prev - 1)); }; const handleNextPage = () => { setPage((prev) => Math.min(totalPages, prev + 1)); }; if (usersLoading) { return ( Liste des utilisateurs
{Array.from({ length: 5 }).map((_, i) => (
))}
); } return ( Liste des utilisateurs ({total})
ID Nom Email Rôle Crédits Statut Créé le {users.map((user) => { const userCredits = creditsMap.get(user._id) || 0; const isActive = new Date(user.updatedAt || user.createdAt) > new Date(Date.now() - 5 * 60 * 1000); // 5 minutes en millisecondes return ( {user._id.slice(-8)} {user.name} {user.email} {user.role} {userCredits.toLocaleString()} crédits {isActive ? 'Actif' : 'Inactif'} {formatDate(new Date(user.createdAt))} ); })}
{/* Pagination */}
Page {page} sur {totalPages} ({total} éléments au total)
); }