| import { useMutation, useQueryClient } from '@tanstack/react-query'; |
| import { dataService, QueryKeys, Constants } from 'librechat-data-provider'; |
| import type { UseMutationResult, UseMutationOptions } from '@tanstack/react-query'; |
| import type * as t from 'librechat-data-provider'; |
|
|
| type EditArtifactContext = { |
| previousMessages: Record<string, t.TMessage[] | undefined>; |
| updatedConversationId: string | null; |
| }; |
|
|
| export const useEditArtifact = ( |
| _options?: t.EditArtifactOptions, |
| ): UseMutationResult< |
| t.TEditArtifactResponse, |
| Error, |
| t.TEditArtifactRequest, |
| EditArtifactContext |
| > => { |
| const queryClient = useQueryClient(); |
| const { onSuccess, onError, onMutate: userOnMutate, ...options } = _options ?? {}; |
|
|
| const mutationOptions: UseMutationOptions< |
| t.TEditArtifactResponse, |
| Error, |
| t.TEditArtifactRequest, |
| EditArtifactContext |
| > = { |
| mutationFn: (variables: t.TEditArtifactRequest) => dataService.editArtifact(variables), |
| |
| |
| |
| |
| |
| |
| |
| |
| onMutate: async (vars) => { |
| |
| if (userOnMutate) { |
| await userOnMutate(vars); |
| } |
| return { previousMessages: {}, updatedConversationId: null }; |
| }, |
| onError: (error, vars, context) => { |
| onError?.(error, vars, context); |
| }, |
| |
| |
| |
| onSuccess: (data, vars, context) => { |
| let targetNotFound = true; |
| const setMessageData = (conversationId?: string | null) => { |
| if (!conversationId) { |
| return; |
| } |
| queryClient.setQueryData<t.TMessage[]>([QueryKeys.messages, conversationId], (prev) => { |
| if (!prev) { |
| return prev; |
| } |
|
|
| const newArray = [...prev]; |
| let targetIndex: number | undefined; |
|
|
| for (let i = newArray.length - 1; i >= 0; i--) { |
| if (newArray[i].messageId === vars.messageId) { |
| targetIndex = i; |
| targetNotFound = false; |
| break; |
| } |
| } |
|
|
| if (targetIndex == null) { |
| return prev; |
| } |
|
|
| newArray[targetIndex] = { |
| ...newArray[targetIndex], |
| content: data.content, |
| text: data.text, |
| }; |
|
|
| return newArray; |
| }); |
| }; |
| setMessageData(data.conversationId); |
| if (targetNotFound) { |
| console.warn( |
| 'Edited Artifact Message not found in cache, trying `new` as `conversationId`', |
| ); |
| setMessageData(Constants.NEW_CONVO as string); |
| } |
|
|
| onSuccess?.(data, vars, context); |
| }, |
| ...options, |
| }; |
|
|
| return useMutation(mutationOptions); |
| }; |
|
|