"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 { Input } from "@/components/ui/input"; import { ChevronLeft, ChevronRight, Search } from "lucide-react"; import { formatDate } from "@/lib/utils"; import { LibreChatUser, LibreChatBalance } from "@/lib/types"; export function UsersTable() { const [page, setPage] = useState(1); const [searchTerm, setSearchTerm] = useState(""); const limit = 20; const { data: users = [], total = 0, loading: usersLoading, } = useCollection("users", { page, limit, // ✅ AJOUTER le searchTerm ici search: searchTerm, }); // 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 ({searchTerm ? users.length : total})
setSearchTerm(e.target.value)} className="pl-10" />
ID Nom Email Rôle Crédits Statut Créé le {users.length > 0 ? ( users.map((user) => { const userCredits = creditsMap.get(user._id) || 0; const isActive = new Date(user.updatedAt || user.createdAt) > new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 jours en millisecondes return ( {user._id.slice(-8)} {user.name} {user.email} {user.role} {userCredits.toLocaleString()} crédits {isActive ? "Actif" : "Inactif"} {formatDate(user.createdAt)} ); }) ) : ( {searchTerm ? `Aucun utilisateur trouvé pour "${searchTerm}"` : "Aucun utilisateur trouvé"} )}
{/* Pagination - masquée lors de la recherche */} {!searchTerm && (
Page {page} sur {totalPages} ({total} éléments au total)
)} {/* Info de recherche */} {searchTerm && (
{users.length} résultat(s) trouvé(s) pour "{searchTerm} "
)}
); }