import React, { useCallback, useEffect, useState } from 'react'; import type { ConversationTagsResponse, TConversationTag } from 'librechat-data-provider'; import { Table, TableHeader, TableBody, TableRow, TableCell, Input, Button } from '~/components/ui'; import { BookmarkContext, useBookmarkContext } from '~/Providers/BookmarkContext'; import BookmarkTableRow from './BookmarkTableRow'; import { useLocalize } from '~/hooks'; const removeDuplicates = (bookmarks: TConversationTag[]) => { const seen = new Set(); return bookmarks.filter((bookmark) => { const duplicate = seen.has(bookmark._id); seen.add(bookmark._id); return !duplicate; }); }; const BookmarkTable = () => { const localize = useLocalize(); const [rows, setRows] = useState([]); const [pageIndex, setPageIndex] = useState(0); const [searchQuery, setSearchQuery] = useState(''); const pageSize = 10; const { bookmarks = [] } = useBookmarkContext(); useEffect(() => { const _bookmarks = removeDuplicates(bookmarks).sort((a, b) => a.position - b.position); setRows(_bookmarks); }, [bookmarks]); const moveRow = useCallback((dragIndex: number, hoverIndex: number) => { setRows((prevTags: TConversationTag[]) => { const updatedRows = [...prevTags]; const [movedRow] = updatedRows.splice(dragIndex, 1); updatedRows.splice(hoverIndex, 0, movedRow); return updatedRows.map((row, index) => ({ ...row, position: index })); }); }, []); const renderRow = useCallback( (row: TConversationTag) => { return ; }, [moveRow], ); const filteredRows = rows.filter( (row) => row.tag && row.tag.toLowerCase().includes(searchQuery.toLowerCase()), ); const currentRows = filteredRows.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize); return (
setSearchQuery(e.target.value)} />
{localize('com_ui_bookmarks_title')}
{localize('com_ui_bookmarks_count')}
{currentRows.map((row) => renderRow(row))}
{localize('com_ui_page')} {pageIndex + 1} {localize('com_ui_of')}{' '} {Math.ceil(filteredRows.length / pageSize)}
); }; export default BookmarkTable;