diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index e5c7989518..62784f6d5c 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -514,6 +514,11 @@ export default class EventTile extends React.Component { const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId()); room?.on(ThreadEvent.New, this.onNewThread); + + if (this.state.threadLastReply?.isEncrypted()) { + this.state.threadLastReply.once(MatrixEventEvent.Decrypted, this.onEventDecryption); + MatrixClientPeg.get().decryptEventIfNeeded(this.state.threadLastReply); + } } private setupNotificationListener = (thread: Thread): void => { @@ -596,6 +601,7 @@ export default class EventTile extends React.Component { if (this.threadState) { this.threadState.off(NotificationStateEvents.Update, this.onThreadStateUpdate); } + this.state.threadLastReply?.removeListener(MatrixEventEvent.Decrypted, this.onEventDecryption); } componentDidUpdate(prevProps: IProps, prevState: IState, snapshot) { @@ -604,8 +610,20 @@ export default class EventTile extends React.Component { MatrixClientPeg.get().on(RoomEvent.Receipt, this.onRoomReceipt); this.isListeningForReceipts = true; } + + if (this.state.threadLastReply !== prevState.threadLastReply) { + if (this.state.threadLastReply.isEncrypted()) { + this.state.threadLastReply.once(MatrixEventEvent.Decrypted, this.onEventDecryption); + MatrixClientPeg.get().decryptEventIfNeeded(this.state.threadLastReply); + } + prevState.threadLastReply?.removeListener(MatrixEventEvent.Decrypted, this.onEventDecryption); + } } + private onEventDecryption = () => { + this.forceUpdate(); + }; + private onNewThread = (thread: Thread) => { if (thread.id === this.props.mxEvent.getId()) { this.updateThread(thread);