import { useState, type FC } from 'react'; import { useRecoilValue } from 'recoil'; import { Constants } from 'librechat-data-provider'; import { Content, Portal, Root, Trigger } from '@radix-ui/react-popover'; import { BookmarkFilledIcon, BookmarkIcon } from '@radix-ui/react-icons'; import { useConversationTagsQuery, useTagConversationMutation } from '~/data-provider'; import { BookmarkMenuItems } from './Bookmarks/BookmarkMenuItems'; import { BookmarkContext } from '~/Providers/BookmarkContext'; import { useLocalize, useBookmarkSuccess } from '~/hooks'; import { Spinner } from '~/components'; import { cn } from '~/utils'; import store from '~/store'; const BookmarkMenu: FC = () => { const localize = useLocalize(); const conversation = useRecoilValue(store.conversationByIndex(0)); const conversationId = conversation?.conversationId ?? ''; const onSuccess = useBookmarkSuccess(conversationId); const [tags, setTags] = useState(conversation?.tags || []); const [open, setIsOpen] = useState(false); const { mutateAsync, isLoading } = useTagConversationMutation(conversationId); const { data } = useConversationTagsQuery(); const isActiveConvo = conversation && conversationId && conversationId !== Constants.NEW_CONVO && conversationId !== 'search'; if (!isActiveConvo) { return <>; } const onOpenChange = async (open: boolean) => { if (!open) { setIsOpen(open); return; } if (open && tags && tags.length > 0) { setIsOpen(open); } else { if (conversation && conversationId) { await mutateAsync( { tags: [Constants.SAVED_TAG as 'Saved'], }, { onSuccess: (newTags: string[]) => { setTags(newTags); onSuccess(newTags); }, onError: () => { console.error('Error adding bookmark'); }, }, ); } } }; const renderButtonContent = () => { if (isLoading) { return ; } if (tags && tags.length > 0) { return ; } return ; }; return ( {data && conversation && ( )} ); }; export default BookmarkMenu;