| import React, { useCallback } from 'react'; | |
| import { QueryKeys } from 'librechat-data-provider'; | |
| import { useQueryClient } from '@tanstack/react-query'; | |
| import { useParams, useNavigate } from 'react-router-dom'; | |
| import { | |
| Button, | |
| Spinner, | |
| OGDialog, | |
| OGDialogTitle, | |
| OGDialogHeader, | |
| OGDialogContent, | |
| useToastContext, | |
| } from '@librechat/client'; | |
| import type { TMessage } from 'librechat-data-provider'; | |
| import { useDeleteConversationMutation } from '~/data-provider'; | |
| import { useLocalize, useNewConvo } from '~/hooks'; | |
| import { NotificationSeverity } from '~/common'; | |
| type DeleteButtonProps = { | |
| conversationId: string; | |
| retainView: () => void; | |
| title: string; | |
| showDeleteDialog?: boolean; | |
| setShowDeleteDialog?: (value: boolean) => void; | |
| triggerRef?: React.RefObject<HTMLButtonElement>; | |
| setMenuOpen?: React.Dispatch<React.SetStateAction<boolean>>; | |
| }; | |
| export function DeleteConversationDialog({ | |
| setShowDeleteDialog, | |
| conversationId, | |
| setMenuOpen, | |
| retainView, | |
| title, | |
| }: { | |
| setMenuOpen?: React.Dispatch<React.SetStateAction<boolean>>; | |
| setShowDeleteDialog: (value: boolean) => void; | |
| conversationId: string; | |
| retainView: () => void; | |
| title: string; | |
| }) { | |
| const localize = useLocalize(); | |
| const navigate = useNavigate(); | |
| const queryClient = useQueryClient(); | |
| const { showToast } = useToastContext(); | |
| const { newConversation } = useNewConvo(); | |
| const { conversationId: currentConvoId } = useParams(); | |
| const deleteMutation = useDeleteConversationMutation({ | |
| onSuccess: () => { | |
| setShowDeleteDialog(false); | |
| if (currentConvoId === conversationId || currentConvoId === 'new') { | |
| newConversation(); | |
| navigate('/c/new', { replace: true }); | |
| } | |
| setMenuOpen?.(false); | |
| retainView(); | |
| showToast({ | |
| message: localize('com_ui_convo_delete_success'), | |
| severity: NotificationSeverity.SUCCESS, | |
| showIcon: true, | |
| }); | |
| }, | |
| onError: () => { | |
| showToast({ | |
| message: localize('com_ui_convo_delete_error'), | |
| severity: NotificationSeverity.ERROR, | |
| showIcon: true, | |
| }); | |
| }, | |
| }); | |
| const confirmDelete = useCallback(() => { | |
| const messages = queryClient.getQueryData<TMessage[]>([QueryKeys.messages, conversationId]); | |
| const thread_id = messages?.[messages.length - 1]?.thread_id; | |
| const endpoint = messages?.[messages.length - 1]?.endpoint; | |
| deleteMutation.mutate({ conversationId, thread_id, endpoint, source: 'button' }); | |
| }, [conversationId, deleteMutation, queryClient]); | |
| return ( | |
| <OGDialogContent | |
| title={localize('com_ui_delete_confirm') + ' ' + title} | |
| className="w-11/12 max-w-md" | |
| showCloseButton={false} | |
| > | |
| <OGDialogHeader> | |
| <OGDialogTitle>{localize('com_ui_delete_conversation')}</OGDialogTitle> | |
| </OGDialogHeader> | |
| <div className="w-full truncate"> | |
| {localize('com_ui_delete_confirm')} <strong>{title}</strong> ? | |
| </div> | |
| <div className="flex justify-end gap-4 pt-4"> | |
| <Button aria-label="cancel" variant="outline" onClick={() => setShowDeleteDialog(false)}> | |
| {localize('com_ui_cancel')} | |
| </Button> | |
| <Button variant="destructive" onClick={confirmDelete} disabled={deleteMutation.isLoading}> | |
| {deleteMutation.isLoading ? <Spinner /> : localize('com_ui_delete')} | |
| </Button> | |
| </div> | |
| </OGDialogContent> | |
| ); | |
| } | |
| export default function DeleteButton({ | |
| conversationId, | |
| retainView, | |
| title, | |
| setMenuOpen, | |
| showDeleteDialog, | |
| setShowDeleteDialog, | |
| triggerRef, | |
| }: DeleteButtonProps) { | |
| if (showDeleteDialog === undefined || setShowDeleteDialog === undefined) { | |
| return null; | |
| } | |
| if (!conversationId) { | |
| return null; | |
| } | |
| return ( | |
| <OGDialog open={showDeleteDialog!} onOpenChange={setShowDeleteDialog!} triggerRef={triggerRef}> | |
| <DeleteConversationDialog | |
| setShowDeleteDialog={setShowDeleteDialog} | |
| conversationId={conversationId} | |
| setMenuOpen={setMenuOpen} | |
| retainView={retainView} | |
| title={title} | |
| /> | |
| </OGDialog> | |
| ); | |
| } | |