From 9dbf153489a2b1b9f8f8c0caaa9a3f4995dfa472 Mon Sep 17 00:00:00 2001 From: Joseph Licata <54822374+usnavy13@users.noreply.github.com> Date: Tue, 12 Aug 2025 22:38:20 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix:=20Prevent=20Type=20Error=20?= =?UTF-8?q?in=20Successful=20Bookmark=20Deletion=20(#9014)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/data-provider/mutations.ts | 64 ++++++++++++++++----------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/client/src/data-provider/mutations.ts b/client/src/data-provider/mutations.ts index 3329ea01e0..cda530ed38 100644 --- a/client/src/data-provider/mutations.ts +++ b/client/src/data-provider/mutations.ts @@ -388,43 +388,57 @@ export const useDeleteTagInConversations = () => { QueryKeys.allConversations, ]); + // If there is no conversations cache yet, nothing to update + if (!data || !Array.isArray(data.pages) || data.pages.length === 0) { + return; + } + const conversationIdsWithTag: string[] = []; - // Remove deleted tag from conversations - const newData = JSON.parse(JSON.stringify(data)) as InfiniteData; - for (let pageIndex = 0; pageIndex < newData.pages.length; pageIndex++) { - const page = newData.pages[pageIndex]; - page.conversations = page.conversations.map((conversation) => { - if ( - conversation.conversationId && - 'tags' in conversation && - Array.isArray(conversation.tags) && - conversation.tags.includes(deletedTag) - ) { - conversationIdsWithTag.push(conversation.conversationId); - conversation.tags = conversation.tags.filter((tag: string) => tag !== deletedTag); - } - return conversation; - }); - } + // Create an updated copy of the infinite query data without mutating the cache directly + const updatedData: InfiniteData = { + pageParams: Array.isArray(data.pageParams) ? [...data.pageParams] : [], + pages: data.pages.map((page) => ({ + ...page, + conversations: page.conversations.map((conversation) => { + if ( + conversation.conversationId && + 'tags' in conversation && + Array.isArray((conversation as unknown as { tags?: string[] }).tags) && + (conversation as unknown as { tags: string[] }).tags.includes(deletedTag) + ) { + conversationIdsWithTag.push(conversation.conversationId); + return { + ...conversation, + tags: (conversation as unknown as { tags: string[] }).tags.filter( + (tag: string) => tag !== deletedTag, + ), + } as t.TConversation; + } + return conversation as t.TConversation; + }), + })), + }; + queryClient.setQueryData>( [QueryKeys.allConversations], - newData, + updatedData, ); - // Remove the deleted tag from the cache of each conversation + // Remove the deleted tag from the cache of each individual conversation for (let i = 0; i < conversationIdsWithTag.length; i++) { const conversationId = conversationIdsWithTag[i]; const conversationData = queryClient.getQueryData([ QueryKeys.conversation, conversationId, ]); - if (conversationData && 'tags' in conversationData && Array.isArray(conversationData.tags)) { - conversationData.tags = conversationData.tags.filter((tag: string) => tag !== deletedTag); - queryClient.setQueryData( - [QueryKeys.conversation, conversationId], - conversationData, - ); + if (conversationData && Array.isArray((conversationData as { tags?: string[] }).tags)) { + queryClient.setQueryData([QueryKeys.conversation, conversationId], { + ...conversationData, + tags: (conversationData as { tags: string[] }).tags.filter( + (tag: string) => tag !== deletedTag, + ), + }); } } };