import React, { useCallback, useEffect, useState } from 'react'; import { BookmarkPlusIcon } from 'lucide-react'; import { Table, Input, Button, TableRow, TableHead, TableBody, TableCell, TableHeader, OGDialogTrigger, } from '@librechat/client'; import type { ConversationTagsResponse, TConversationTag } from 'librechat-data-provider'; import { BookmarkContext, useBookmarkContext } from '~/Providers/BookmarkContext'; import { BookmarkEditDialog } from '~/components/Bookmarks'; 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 [open, setOpen] = useState(false); 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) => ( ), [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)} aria-label={localize('com_ui_bookmarks_filter')} />
{localize('com_ui_bookmarks_title')}
{localize('com_ui_bookmarks_count')}
{localize('com_assistants_actions')}
{currentRows.length ? ( currentRows.map(renderRow) ) : ( {localize('com_ui_no_bookmarks')} )}
{`${pageIndex + 1} / ${Math.ceil(filteredRows.length / pageSize)}`}
); }; export default BookmarkTable;