From c453bbb687e213fdea4bd86f27f68172cc9702a9 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Thu, 10 Nov 2022 16:41:24 -0500 Subject: [PATCH] Update Chat with last_message when current_user is sending a message --- app/soapbox/queries/chats.ts | 7 ++- app/soapbox/utils/__tests__/queries.test.ts | 52 +++++++++++++++++++-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/app/soapbox/queries/chats.ts b/app/soapbox/queries/chats.ts index 44c948c56..0109a469d 100644 --- a/app/soapbox/queries/chats.ts +++ b/app/soapbox/queries/chats.ts @@ -237,7 +237,7 @@ const useChatActions = (chatId: string) => { const createChatMessage = useMutation( ( { chatId, content }: { chatId: string, content: string }, - ) => api.post(`/api/v1/pleroma/chats/${chatId}/messages`, { content }), + ) => api.post(`/api/v1/pleroma/chats/${chatId}/messages`, { content }), { retry: false, onMutate: async (variables) => { @@ -281,7 +281,10 @@ const useChatActions = (chatId: string) => { onError: (_error: any, variables, context: any) => { queryClient.setQueryData(['chats', 'messages', variables.chatId], context.prevChatMessages); }, - onSuccess: (_data: any, variables) => { + onSuccess: (response, variables) => { + const nextChat = { ...chat, last_message: response.data }; + updatePageItem(ChatKeys.chatSearch(), nextChat, (o, n) => o.id === n.id); + queryClient.invalidateQueries(ChatKeys.chatMessages(variables.chatId)); }, }, diff --git a/app/soapbox/utils/__tests__/queries.test.ts b/app/soapbox/utils/__tests__/queries.test.ts index c21740a90..6fe75dfbf 100644 --- a/app/soapbox/utils/__tests__/queries.test.ts +++ b/app/soapbox/utils/__tests__/queries.test.ts @@ -2,17 +2,63 @@ import { InfiniteData } from '@tanstack/react-query'; import { queryClient } from 'soapbox/queries/client'; -import { PaginatedResult, sortQueryData } from '../queries'; +import { PaginatedResult, sortQueryData, updatePageItem } from '../queries'; interface Item { - id: number + id: number, + text: string } -const buildItem = (id: number): Item => ({ id }); +const buildItem = (id: number): Item => ({ id, text: `item ${id}` }); const queryKey = ['test', 'query']; +describe('updatePageItem()', () => { + beforeEach(() => { + queryClient.clear(); + }); + + describe('without cached data', () => { + it('safely returns undefined', () => { + updatePageItem(queryKey, buildItem(1), (o, n) => o.id === n.id); + const nextQueryData = queryClient.getQueryData>>(queryKey); + expect(nextQueryData).toBeUndefined(); + }); + }); + + describe('with cached data', () => { + const cachedQueryData = { + pages: [ + { + result: [buildItem(1), buildItem(2), buildItem(3)], + hasMore: false, + link: undefined, + }, + ], + pageParams: [undefined], + }; + + beforeEach(() => { + queryClient.setQueryData(queryKey, cachedQueryData); + }); + + it('updates the correct item in the cached data', () => { + const initialQueryData = queryClient.getQueryData>>(queryKey); + expect(initialQueryData?.pages[0].result.map((r) => r.id)).toEqual([1, 2, 3]); + expect(initialQueryData?.pages[0].result.find((r) => r.id === 2)?.text).toEqual('item 2'); + updatePageItem(queryKey, { id: 2, text: 'new text' }, (o, n) => o.id === n.id); + const nextQueryData = queryClient.getQueryData>>(queryKey); + expect(nextQueryData?.pages[0].result.map((r) => r.id)).toEqual([1, 2, 3]); + expect(nextQueryData?.pages[0].result.find((r) => r.id === 2)?.text).toEqual('new text'); + }); + }); +}); + describe('sortQueryData()', () => { + beforeEach(() => { + queryClient.clear(); + }); + describe('without cached data', () => { it('safely returns undefined', () => { sortQueryData(queryKey, (a, b) => b.id - a.id);