import React, { useState, 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 [isHovered, setIsHovered] = useState(false); const ref = useRef(null); const mutation = useConversationTagMutation(row.tag); const localize = useLocalize(); const { showToast } = useToastContext(); const handleDrop = (item: DragItem) => { const data = { ...row, position: item.index, }; mutation.mutate(data, { onError: () => { showToast({ message: localize('com_ui_bookmarks_update_error'), severity: NotificationSeverity.ERROR, }); }, }); }; const [, drop] = useDrop({ accept: 'bookmark', drop: (item: DragItem) => handleDrop(item), hover(item: DragItem) { if (!ref.current) { return; } const dragIndex = item.index; const hoverIndex = position; if (dragIndex === hoverIndex) { return; } moveRow(dragIndex, hoverIndex); item.index = hoverIndex; }, }); const [{ isDragging }, drag] = useDrag({ type: 'bookmark', item: { index: position }, collect: (monitor) => ({ isDragging: monitor.isDragging(), }), }); drag(drop(ref)); return ( setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} >
{row.tag}
{row.count}
setIsHovered(true)} onBlur={() => setIsHovered(false)} > setIsHovered(true)} onBlur={() => setIsHovered(false)} /> setIsHovered(true)} onBlur={() => setIsHovered(false)} />
); }; export default BookmarkTableRow;