import React, { useEffect } from 'react'; import { Controller, useForm } from 'react-hook-form'; import type { TConversationTag, TConversation, TConversationTagRequest, } from 'librechat-data-provider'; import { cn, removeFocusOutlines, defaultTextProps } from '~/utils/'; import { useBookmarkContext } from '~/Providers/BookmarkContext'; import { useConversationTagMutation } from '~/data-provider'; import { Checkbox, Label, TextareaAutosize } from '~/components/ui/'; import { useLocalize, useBookmarkSuccess } from '~/hooks'; import { NotificationSeverity } from '~/common'; import { useToastContext } from '~/Providers'; type TBookmarkFormProps = { bookmark?: TConversationTag; conversation?: TConversation; onOpenChange: React.Dispatch>; formRef: React.RefObject; setIsLoading: React.Dispatch>; tags?: string[]; setTags?: (tags: string[]) => void; }; const BookmarkForm = ({ bookmark, conversation, onOpenChange, formRef, setIsLoading, tags, setTags, }: TBookmarkFormProps) => { const localize = useLocalize(); const { showToast } = useToastContext(); const { bookmarks } = useBookmarkContext(); const mutation = useConversationTagMutation(bookmark?.tag); const onSuccess = useBookmarkSuccess(conversation?.conversationId || ''); const { register, handleSubmit, setValue, getValues, control, formState: { errors }, } = useForm({ defaultValues: { tag: bookmark?.tag || '', description: bookmark?.description || '', conversationId: conversation?.conversationId || '', addToConversation: conversation ? true : false, }, }); useEffect(() => { if (bookmark) { setValue('tag', bookmark.tag || ''); setValue('description', bookmark.description || ''); } }, [bookmark, setValue]); const onSubmit = (data: TConversationTagRequest) => { if (mutation.isLoading) { return; } if (data.tag === bookmark?.tag && data.description === bookmark?.description) { return; } setIsLoading(true); mutation.mutate(data, { onSuccess: () => { showToast({ message: bookmark ? localize('com_ui_bookmarks_update_success') : localize('com_ui_bookmarks_create_success'), }); setIsLoading(false); onOpenChange(false); if (setTags && data.addToConversation) { const newTags = [...(tags || []), data.tag].filter( (tag) => tag !== undefined, ) as string[]; setTags(newTags); onSuccess(newTags); } }, onError: () => { showToast({ message: bookmark ? localize('com_ui_bookmarks_update_error') : localize('com_ui_bookmarks_create_error'), severity: NotificationSeverity.ERROR, }); setIsLoading(false); }, }); }; return (
{ return ( value === bookmark?.tag || bookmarks.every((bookmark) => bookmark.tag !== value) || 'tag must be unique' ); }, })} aria-invalid={!!errors.tag} className={cn( defaultTextProps, 'flex h-10 max-h-10 w-full resize-none px-3 py-2', removeFocusOutlines, )} placeholder=" " /> {errors.tag && {errors.tag.message}}
{conversation && (
( )} />
)}
); }; export default BookmarkForm;