From 4cb0a631c3860e703ded345bea5743b1280e217f Mon Sep 17 00:00:00 2001 From: N-Pex Date: Tue, 2 Jul 2024 11:08:03 +0200 Subject: [PATCH] Handle thread redactions For media messages etc. --- src/components/Chat.vue | 19 ++++++++++++------- src/components/chatMixin.js | 10 ++++++++++ .../messages/MessageIncomingThread.vue | 6 +++--- .../messages/MessageOutgoingThread.vue | 6 +++--- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/components/Chat.vue b/src/components/Chat.vue index 2ebc7de..99364cf 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -89,7 +89,7 @@ v-on:addQuickHeartReaction="addQuickHeartReaction({event, position: $event.position})" /> - +
{{ $t('message.unread_messages') }}
@@ -898,13 +898,10 @@ export default { methods: { /** - * Set initialLoadDone to 'true'. First process all events, setting threadParent and replyEvent if needed. + * Set initialLoadDone to 'true'. This will process all events, setting threadParent and replyEvent if needed (see watcher for "initialLoadDone") */ setInitialLoadDone() { - this.events.filter(event => (event.threadRootId && !event.parentThread)).forEach(event => this.setParentThread(event)); - this.events.filter(event => (event.replyEventId && !event.replyEvent)).forEach(event => this.setReplyToEvent(event)); this.initialLoadDone = true; - console.log("Loading finished!"); }, /** @@ -1633,8 +1630,16 @@ export default { }, redact(event) { - this.$matrix.matrixClient - .redactEvent(event.getRoomId(), event.getId()) + let promises = []; + if ((event.isThreadRoot || event.isMxThread) && this.timelineSet) { + // If this is a thread message, make sure to redact all children as well. + const children = this.timelineSet.relations.getAllChildEventsForEvent(event.getId()).filter(e => util.downloadableTypes().includes(e.getContent().msgtype)); + promises = children.map((c) => { + return this.$matrix.matrixClient.redactEvent(c.getRoomId(), c.getId()); + }); + } + promises.push(this.$matrix.matrixClient.redactEvent(event.getRoomId(), event.getId())); + Promise.allSettled(promises) .then(() => { console.log("Message redacted"); }) diff --git a/src/components/chatMixin.js b/src/components/chatMixin.js index 0318df9..4c524ba 100644 --- a/src/components/chatMixin.js +++ b/src/components/chatMixin.js @@ -162,6 +162,10 @@ export default { case "m.room.message": if (event.getSender() != this.$matrix.currentUserId) { if (event.isMxThread) { + // If redacted, use a text message (will show "This message was deleted") + if (event.isRedacted()) { + return MessageIncomingText; + } // Incoming thread, e.g. a file drop! return isForExport ? MessageIncomingThreadExport : MessageIncomingThread; } @@ -202,6 +206,12 @@ export default { return MessageIncomingText; } else { if (event.isMxThread) { + + // If redacted, use a text message (will show "This message was deleted") + if (event.isRedacted()) { + return MessageOutgoingText; + } + // Outgoing thread return isForExport ? MessageOutgoingThreadExport : MessageOutgoingThread; } diff --git a/src/components/messages/MessageIncomingThread.vue b/src/components/messages/MessageIncomingThread.vue index 32ede10..d428a8f 100644 --- a/src/components/messages/MessageIncomingThread.vue +++ b/src/components/messages/MessageIncomingThread.vue @@ -1,5 +1,5 @@