import { useState, useCallback, useEffect } from 'react'; import { useConversationsInfiniteQuery } from '~/data-provider'; import { Search, ChevronRight, ChevronLeft, TrashIcon, MessageCircle, ArchiveRestore, ChevronsRight, ChevronsLeft, } from 'lucide-react'; import type { TConversation } from 'librechat-data-provider'; import { useAuthContext, useLocalize, useArchiveHandler } from '~/hooks'; import { DeleteConversationDialog } from '~/components/Conversations/ConvoOptions'; import { TooltipAnchor, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Separator, Skeleton, Button, Input, OGDialog, OGDialogTrigger, } from '~/components'; import { cn } from '~/utils'; export default function ArchivedChatsTable() { const localize = useLocalize(); const { isAuthenticated } = useAuthContext(); const [conversationId, setConversationId] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [searchQuery, setSearchQuery] = useState(''); const [totalPages, setTotalPages] = useState(1); const [isOpened, setIsOpened] = useState(false); const { data, isLoading, refetch } = useConversationsInfiniteQuery( { pageNumber: currentPage.toString(), limit: 10, isArchived: true }, { enabled: isAuthenticated && isOpened }, ); useEffect(() => { if (data) { setTotalPages(Math.ceil(Number(data.pages))); } }, [data]); const archiveHandler = useArchiveHandler(conversationId ?? '', false, () => { refetch(); }); const handleChatClick = useCallback((conversationId) => { window.open(`/c/${conversationId}`, '_blank'); }, []); const handlePageChange = useCallback((newPage) => { setCurrentPage(newPage); }, []); const handleSearch = useCallback((query) => { setSearchQuery(query); setCurrentPage(1); }, []); const getRandomWidth = () => Math.floor(Math.random() * (400 - 170 + 1)) + 170; const skeletons = Array.from({ length: 11 }, (_, index) => { const randomWidth = getRandomWidth(); return (
); }); if (isLoading) { return
{skeletons}
; } if (!data || data.pages.length === 0 || data.pages[0].conversations.length === 0) { return
{localize('com_nav_archived_chats_empty')}
; } const conversations = data.pages.flatMap((page) => page.conversations); return (
setIsOpened(true)} >
handleSearch(e.target.value)} className="w-full border-none" />
{conversations.length === 0 ? (
{localize('com_nav_no_search_results')}
) : ( <> {localize('com_nav_archive_name')} {localize('com_nav_archive_created_at')} {localize('com_assistants_actions')} {conversations.map((conversation: TConversation) => (
{new Date(conversation.createdAt).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric', })}
{ setConversationId(conversation.conversationId); archiveHandler(); }} > } > } > {DeleteConversationDialog({ conversationId: conversation.conversationId ?? '', retainView: refetch, title: conversation.title ?? '', })}
))}
Page {currentPage} of {totalPages}
)}
); }