import { useState, useCallback, useMemo } from 'react'; import { Search, TrashIcon, ChevronLeft, ChevronRight, // ChevronsLeft, // ChevronsRight, MessageCircle, ArchiveRestore, } from 'lucide-react'; import type { TConversation } from 'librechat-data-provider'; import { Table, Input, Button, TableRow, Skeleton, OGDialog, Separator, TableCell, TableBody, TableHead, TableHeader, TooltipAnchor, OGDialogTrigger, } from '~/components'; import { useConversationsInfiniteQuery, useArchiveConvoMutation } from '~/data-provider'; import { DeleteConversationDialog } from '~/components/Conversations/ConvoOptions'; import { useAuthContext, useLocalize, useMediaQuery } from '~/hooks'; import { cn } from '~/utils'; export default function ArchivedChatsTable() { const localize = useLocalize(); const { isAuthenticated } = useAuthContext(); const isSmallScreen = useMediaQuery('(max-width: 768px)'); const [isOpened, setIsOpened] = useState(false); const [currentPage, setCurrentPage] = useState(1); const [searchQuery, setSearchQuery] = useState(''); const { data, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage, refetch } = useConversationsInfiniteQuery( { pageNumber: currentPage.toString(), isArchived: true }, { enabled: isAuthenticated && isOpened }, ); const mutation = useArchiveConvoMutation(); const handleUnarchive = useCallback( (conversationId: string) => { mutation.mutate({ conversationId, isArchived: false }); }, [mutation], ); const conversations = useMemo( () => data?.pages[currentPage - 1]?.conversations ?? [], [data, currentPage], ); const totalPages = useMemo(() => Math.ceil(Number(data?.pages[0].pages ?? 1)) ?? 1, [data]); const handleChatClick = useCallback((conversationId: string) => { if (!conversationId) { return; } window.open(`/c/${conversationId}`, '_blank'); }, []); const handlePageChange = useCallback( (newPage: number) => { setCurrentPage(newPage); if (!(hasNextPage ?? false)) { return; } fetchNextPage({ pageParam: newPage }); }, [fetchNextPage, hasNextPage], ); const handleSearch = useCallback((query: string) => { 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 || isFetchingNextPage) { return
{skeletons}
; } if (!data || (conversations.length === 0 && totalPages === 0)) { return
{localize('com_nav_archived_chats_empty')}
; } return (
setIsOpened(true)} >
handleSearch(e.target.value)} className="w-full border-none placeholder:text-text-secondary" />
{conversations.length === 0 ? (
{localize('com_nav_no_search_results')}
) : ( <> {localize('com_nav_archive_name')} {!isSmallScreen && ( {localize('com_nav_archive_created_at')} )} {localize('com_assistants_actions')} {conversations.map((conversation: TConversation) => ( {!isSmallScreen && (
{new Date(conversation.createdAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', })}
)} { const conversationId = conversation.conversationId ?? ''; if (!conversationId) { return; } handleUnarchive(conversationId); }} > } /> } />
))}
{localize('com_ui_page')} {currentPage} {localize('com_ui_of')} {totalPages}
{/* */} {/* */}
)}
); }