import React, { useRef } from 'react'; import { useDrag, useDrop } from 'react-dnd'; import type { TConversationTag } from 'librechat-data-provider'; import { DeleteBookmarkButton, EditBookmarkButton } from '~/components/Bookmarks'; import { useConversationTagMutation } from '~/data-provider'; import { TableRow, TableCell } from '~/components/ui'; import { NotificationSeverity } from '~/common'; import { useToastContext } from '~/Providers'; import { useLocalize } from '~/hooks'; interface BookmarkTableRowProps { row: TConversationTag; moveRow: (dragIndex: number, hoverIndex: number) => void; position: number; } interface DragItem { index: number; id: string; type: string; } const BookmarkTableRow: React.FC = ({ row, moveRow, position }) => { const ref = useRef(null); const mutation = useConversationTagMutation({ context: 'BookmarkTableRow', tag: row.tag }); const localize = useLocalize(); const { showToast } = useToastContext(); const handleDrop = (item: DragItem) => { mutation.mutate( { ...row, position: item.index }, { onError: () => { showToast({ message: localize('com_ui_bookmarks_update_error'), severity: NotificationSeverity.ERROR, }); }, }, ); }; const [, drop] = useDrop({ accept: 'bookmark', drop: handleDrop, hover(item: DragItem) { if (!ref.current || item.index === position) {return;} moveRow(item.index, position); item.index = position; }, }); const [{ isDragging }, drag] = useDrag({ type: 'bookmark', item: { index: position }, collect: (monitor) => ({ isDragging: monitor.isDragging(), }), }); drag(drop(ref)); return (
{row.tag}
{row.count}
); }; export default BookmarkTableRow;