From 97aeb18a24091f973e31cc331bb1e6d17353d09d Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 10 Nov 2024 10:44:29 -0500 Subject: [PATCH] Decrypt reaction events --- src/tile/GridTile.test.tsx | 2 ++ src/useReactions.tsx | 21 +++++++++++++-------- src/utils/testReactions.tsx | 7 +++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/tile/GridTile.test.tsx b/src/tile/GridTile.test.tsx index 81e50110..9b03a5ea 100644 --- a/src/tile/GridTile.test.tsx +++ b/src/tile/GridTile.test.tsx @@ -43,6 +43,8 @@ test("GridTile is accessible", async () => { off: () => {}, client: { getUserId: () => null, + on: () => {}, + off: () => {}, }, }, memberships: [], diff --git a/src/useReactions.tsx b/src/useReactions.tsx index 15b7b714..c8d3c3b5 100644 --- a/src/useReactions.tsx +++ b/src/useReactions.tsx @@ -10,6 +10,7 @@ import { MatrixEvent, RelationType, RoomEvent as MatrixRoomEvent, + MatrixEventEvent, } from "matrix-js-sdk/src/matrix"; import { ReactionEventContent } from "matrix-js-sdk/src/types"; import { @@ -184,19 +185,21 @@ export const ReactionsProvider = ({ useEffect(() => { const reactionTimeouts = new Set(); const handleReactionEvent = (event: MatrixEvent): void => { - if (event.isSending()) { - // Skip any events that are still sending. - return; - } + // Decrypted events might come from a different room + if (event.getRoomId() !== room.roomId) return; + // Skip any events that are still sending. + if (event.isSending()) return; const sender = event.getSender(); const reactionEventId = event.getId(); - if (!sender || !reactionEventId) { - // Skip any event without a sender or event ID. - return; - } + // Skip any event without a sender or event ID. + if (!sender || !reactionEventId) return; if (event.getType() === ElementCallReactionEventType) { + room.client + .decryptEventIfNeeded(event) + .catch((e) => logger.warn(`Failed to decrypt ${event.getId()}`, e)); + if (event.isBeingDecrypted() || event.isDecryptionFailure()) return; const content: ECallReactionEventContent = event.getContent(); const membershipEventId = content?.["m.relates_to"]?.event_id; @@ -295,6 +298,7 @@ export const ReactionsProvider = ({ room.on(MatrixRoomEvent.Timeline, handleReactionEvent); room.on(MatrixRoomEvent.Redaction, handleReactionEvent); + room.client.on(MatrixEventEvent.Decrypted, handleReactionEvent); // We listen for a local echo to get the real event ID, as timeline events // may still be sending. @@ -303,6 +307,7 @@ export const ReactionsProvider = ({ return (): void => { room.off(MatrixRoomEvent.Timeline, handleReactionEvent); room.off(MatrixRoomEvent.Redaction, handleReactionEvent); + room.client.off(MatrixEventEvent.Decrypted, handleReactionEvent); room.off(MatrixRoomEvent.LocalEchoUpdated, handleReactionEvent); reactionTimeouts.forEach((t) => clearTimeout(t)); // If we're clearing timeouts, we also clear all reactions. diff --git a/src/utils/testReactions.tsx b/src/utils/testReactions.tsx index 99557e8a..84ff217b 100644 --- a/src/utils/testReactions.tsx +++ b/src/utils/testReactions.tsx @@ -138,6 +138,13 @@ export class MockRoom extends EventEmitter { this.testRedactedEvents.push(props); return Promise.resolve({ event_id: randomUUID() }); }, + decryptEventIfNeeded: async () => {}, + on() { + return this; + }, + off() { + return this; + }, } as unknown as MatrixClient; }