"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, User, Bot } from "lucide-react"; import { formatDate } from "@/lib/utils"; import { LibreChatMessage, LibreChatUser, LibreChatConversation, } from "@/lib/types"; // Définir des interfaces pour les types de contenu interface MessageContentItem { text?: string; content?: string; type?: string; } interface MessagePart { text?: string; content?: string; type?: string; } interface MessageWithParts extends LibreChatMessage { parts?: MessagePart[]; content?: MessageContentItem[] | string; } export function MessagesTable() { const [page, setPage] = useState(1); const limit = 20; // Charger les messages const { data: messages = [], total = 0, loading: messagesLoading, } = useCollection("messages", { page, limit, }); // Charger les utilisateurs pour les noms const { data: users = [] } = useCollection("users", { limit: 1000, }); // Charger les conversations pour les titres const { data: conversations = [] } = useCollection( "conversations", { limit: 1000, } ); // Créer des maps pour les lookups const userMap = useMemo(() => { return new Map(users.map((user) => [user._id, user])); }, [users]); const conversationMap = useMemo(() => { return new Map( conversations.map((conv) => [conv.conversationId || conv._id, conv]) ); }, [conversations]); const totalPages = Math.ceil(total / limit); const handlePrevPage = () => { setPage((prev) => Math.max(1, prev - 1)); }; const handleNextPage = () => { setPage((prev) => Math.min(totalPages, prev + 1)); }; // Fonction pour extraire le contenu du message const getMessageContent = (message: LibreChatMessage): string => { try { // Vérifier le champ text principal if (message.text && typeof message.text === "string") { return message.text.trim(); } // Traiter le message comme ayant potentiellement des parties const messageWithParts = message as MessageWithParts; // Vérifier le champ content (peut être un array ou string) if (messageWithParts.content) { if (typeof messageWithParts.content === "string") { return messageWithParts.content.trim(); } if (Array.isArray(messageWithParts.content)) { // Extraire le texte des objets content const textContent = messageWithParts.content .map((item: MessageContentItem | string) => { if (typeof item === "string") return item; if (item && typeof item === "object" && item.text) return item.text; if (item && typeof item === "object" && item.content) return item.content; return ""; }) .filter(Boolean) .join(" "); if (textContent.trim()) return textContent.trim(); } } // Vérifier les propriétés alternatives if (messageWithParts.parts && Array.isArray(messageWithParts.parts)) { const textContent = messageWithParts.parts .map((part: MessagePart) => { if (typeof part === "string") return part; if (part && typeof part === "object" && part.text) return part.text; return ""; }) .filter(Boolean) .join(" "); if (textContent.trim()) return textContent.trim(); } return "Contenu non disponible"; } catch (error) { console.error("Erreur lors de l'extraction du contenu:", error); return "Erreur de lecture du contenu"; } }; // Fonction pour obtenir le nom d'utilisateur const getUserName = (userId: string): string => { if (!userId || userId === "undefined") return "Utilisateur inconnu"; const user = userMap.get(userId); return user?.name || user?.email || `Utilisateur ${userId.slice(-8)}`; }; // Fonction pour obtenir le titre de la conversation const getConversationTitle = (conversationId: string): string => { if (!conversationId || conversationId === "undefined") return "Conversation inconnue"; const conversation = conversationMap.get(conversationId); if (conversation && conversation.title) { return conversation.title; } return `Conversation ${conversationId.slice(-6)}`; }; if (messagesLoading) { return ( Messages
{Array.from({ length: 5 }).map((_, i) => (
))}
); } return ( Messages récents ({total})
ID Conversation Utilisateur Rôle Contenu Tokens Créé le {messages.map((message) => { const content = getMessageContent(message); const userName = getUserName(message.user); const conversationTitle = getConversationTitle( message.conversationId ); const isUser = message.isCreatedByUser; return ( {message._id.slice(-8)}
{message.conversationId?.slice(-8) || "N/A"}
{conversationTitle}
{message.user?.slice(-8) || "N/A"}
{userName}
{isUser ? ( ) : ( )} {isUser ? "Utilisateur" : "Assistant"}

{content.length > 100 ? `${content.substring(0, 100)}...` : content}

{message.tokenCount > 0 && ( {message.tokenCount} )} {formatDate(new Date(message.createdAt))}
); })}
{/* Pagination */}
Page {page} sur {totalPages} ({total} éléments au total)
); }