diff --git a/src/channel.ts b/src/channel.ts index f8e2e19f8..69f9ac7fb 100644 --- a/src/channel.ts +++ b/src/channel.ts @@ -1563,6 +1563,9 @@ export class Channel< if (event.message) { if (event.hard_delete) channelState.removeMessage(event.message); else channelState.addMessageSorted(event.message, false, false); + + channelState.removeQuotedMessageReferences(event.message); + if (event.message.pinned) { channelState.removePinnedMessage(event.message); } diff --git a/src/channel_state.ts b/src/channel_state.ts index 50f9cef1e..9854fe0dd 100644 --- a/src/channel_state.ts +++ b/src/channel_state.ts @@ -437,6 +437,51 @@ export class ChannelState< return messageWithReaction; } + removeQuotedMessageReferences( + message: MessageResponse< + AttachmentType, + ChannelType, + CommandType, + MessageType, + ReactionType, + UserType + >, + ) { + const parseMessage = ( + m: ReturnType< + ChannelState< + AttachmentType, + ChannelType, + CommandType, + EventType, + MessageType, + ReactionType, + UserType + >['formatMessage'] + >, + ) => + (({ + ...m, + created_at: m.created_at.toString(), + pinned_at: m.pinned_at?.toString(), + updated_at: m.updated_at?.toString(), + } as unknown) as MessageResponse< + AttachmentType, + ChannelType, + CommandType, + MessageType, + ReactionType, + UserType + >); + + const updatedMessages = this.messages + .filter((msg) => msg.quoted_message_id === message.id) + .map(parseMessage) + .map((msg) => ({ ...msg, quoted_message: { ...message, attachments: [] } })); + + this.addMessagesSorted(updatedMessages, true); + } + /** * Updates all instances of given message in channel state * @param message diff --git a/test/unit/channel.js b/test/unit/channel.js index 42f09ffb8..cb78674d6 100644 --- a/test/unit/channel.js +++ b/test/unit/channel.js @@ -178,6 +178,38 @@ describe('Channel _handleChannelEvent', function () { }); expect(channel.state.unreadCount).to.be.equal(30); }); + + it('message.delete removes quoted messages references', function () { + const originalMessage = generateMsg({ silent: true }); + channel._handleChannelEvent({ + type: 'message.new', + user: { id: 'id' }, + message: originalMessage, + }); + + const quotingMessage = generateMsg({ + silent: true, + quoted_message: originalMessage, + quoted_message_id: originalMessage.id, + }); + + channel._handleChannelEvent({ + type: 'message.new', + user: { id: 'id2' }, + message: quotingMessage, + }); + + channel._handleChannelEvent({ + type: 'message.deleted', + user: { id: 'id' }, + message: { ...originalMessage, deleted_at: new Date().toISOString() }, + }); + + expect( + channel.state.messages.find((msg) => msg.id === quotingMessage.id) + .quoted_message.deleted_at, + ).to.be.ok; + }); }); describe('Channels - Constructor', function () {