From 5c98bc4c954d8d8c4b789cb05e664ba28a0d7fce Mon Sep 17 00:00:00 2001 From: martincupela Date: Thu, 30 May 2024 12:02:49 +0200 Subject: [PATCH] fix: update quoting message on update of quoted message --- .../Message/__tests__/utils.test.js | 58 +++++++++++++++++++ src/components/Message/utils.tsx | 33 +++++++---- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/src/components/Message/__tests__/utils.test.js b/src/components/Message/__tests__/utils.test.js index 6d4eb0952e..dd4795a504 100644 --- a/src/components/Message/__tests__/utils.test.js +++ b/src/components/Message/__tests__/utils.test.js @@ -150,6 +150,64 @@ describe('Message utils', () => { expect(shouldUpdate).toBe(true); }); + it('should update if rendered with a different quoted message', () => { + const cases = [ + ['deleted_at', undefined, new Date().toISOString()], + ['latest_reactions', [], [1]], + ['own_reactions', [], [1]], + ['pinned', false, true], + ['reply_count', 0, 1], + ['status', 'sending', 'received'], + ['text', '', 'a'], + ['type', 'X', 'Y'], + ['updated_at', new Date(1).toISOString(), new Date(2).toISOString()], + [ + 'user', + { updated_at: new Date(1).toISOString() }, + { updated_at: new Date(2).toISOString() }, + ], + ]; + const message = generateMessage(); + const quotedMessage = generateMessage(); + cases.forEach(([key, prevVal, nextVal]) => { + const shouldUpdate = !areMessagePropsEqual( + { + message: { + ...message, + quoted_message: { ...quotedMessage, [key]: prevVal }, + quoted_message_id: quotedMessage.id, + }, + }, + { + message: { + ...message, + quoted_message: { ...quotedMessage, [key]: nextVal }, + quoted_message_id: quotedMessage.id, + }, + }, + ); + expect(shouldUpdate).toBe(true); + }); + expect( + !areMessagePropsEqual( + { + message: { + ...message, + quoted_message: undefined, + quoted_message_id: undefined, + }, + }, + { + message: { + ...message, + quoted_message: quotedMessage, + quoted_message_id: quotedMessage.id, + }, + }, + ), + ).toBe(true); + }); + it('should update if rendered with a different message is read by other users', () => { const message = generateMessage(); const currentReadBy = [alice]; diff --git a/src/components/Message/utils.tsx b/src/components/Message/utils.tsx index 608ddb890a..6e781237e8 100644 --- a/src/components/Message/utils.tsx +++ b/src/components/Message/utils.tsx @@ -232,22 +232,31 @@ export const showMessageActionsBox = ( return true; }; -const areMessagesEqual = < +function areMessagesEqual< StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics >( prevMessage: StreamMessage, nextMessage: StreamMessage, -) => - prevMessage.deleted_at === nextMessage.deleted_at && - prevMessage.latest_reactions?.length === nextMessage.latest_reactions?.length && - prevMessage.own_reactions?.length === nextMessage.own_reactions?.length && - prevMessage.pinned === nextMessage.pinned && - prevMessage.reply_count === nextMessage.reply_count && - prevMessage.status === nextMessage.status && - prevMessage.text === nextMessage.text && - prevMessage.type === nextMessage.type && - prevMessage.updated_at === nextMessage.updated_at && - prevMessage.user?.updated_at === nextMessage.user?.updated_at; +): boolean { + return ( + prevMessage.deleted_at === nextMessage.deleted_at && + prevMessage.latest_reactions?.length === nextMessage.latest_reactions?.length && + prevMessage.own_reactions?.length === nextMessage.own_reactions?.length && + prevMessage.pinned === nextMessage.pinned && + prevMessage.reply_count === nextMessage.reply_count && + prevMessage.status === nextMessage.status && + prevMessage.text === nextMessage.text && + prevMessage.type === nextMessage.type && + prevMessage.updated_at === nextMessage.updated_at && + prevMessage.user?.updated_at === nextMessage.user?.updated_at && + Boolean(prevMessage.quoted_message) === Boolean(nextMessage.quoted_message) && + (!prevMessage.quoted_message || + areMessagesEqual( + prevMessage.quoted_message as StreamMessage, + nextMessage.quoted_message as StreamMessage, + )) + ); +} export const areMessagePropsEqual = < StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics