@@ -11,6 +11,7 @@ import React, { createRef, forwardRef, JSX, MouseEvent, ReactNode } from "react"
11
11
import classNames from "classnames" ;
12
12
import {
13
13
EventStatus ,
14
+ EventTimeline ,
14
15
EventType ,
15
16
MatrixEvent ,
16
17
MatrixEventEvent ,
@@ -21,6 +22,7 @@ import {
21
22
Room ,
22
23
RoomEvent ,
23
24
RoomMember ,
25
+ RoomStateEvent ,
24
26
Thread ,
25
27
ThreadEvent ,
26
28
} from "matrix-js-sdk/src/matrix" ;
@@ -262,6 +264,10 @@ interface IState {
262
264
263
265
thread : Thread | null ;
264
266
threadNotification ?: NotificationCountType ;
267
+ /**
268
+ * Whether the event is encrypted.
269
+ */
270
+ isRoomEncrypted : boolean ;
265
271
}
266
272
267
273
/**
@@ -318,6 +324,7 @@ export class UnwrappedEventTile extends React.Component<EventTileProps, IState>
318
324
hover : false ,
319
325
320
326
thread,
327
+ isRoomEncrypted : false ,
321
328
} ;
322
329
323
330
// don't do RR animations until we are mounted
@@ -386,7 +393,7 @@ export class UnwrappedEventTile extends React.Component<EventTileProps, IState>
386
393
return true ;
387
394
}
388
395
389
- public componentDidMount ( ) : void {
396
+ public async componentDidMount ( ) : Promise < void > {
390
397
this . unmounted = false ;
391
398
this . suppressReadReceiptAnimation = false ;
392
399
const client = MatrixClientPeg . safeGet ( ) ;
@@ -413,6 +420,12 @@ export class UnwrappedEventTile extends React.Component<EventTileProps, IState>
413
420
room ?. on ( ThreadEvent . New , this . onNewThread ) ;
414
421
415
422
this . verifyEvent ( ) ;
423
+
424
+ room ?. getLiveTimeline ( ) . getState ( EventTimeline . FORWARDS ) ?. on ( RoomStateEvent . Events , this . onRoomStateEvents ) ;
425
+
426
+ const crypto = client . getCrypto ( ) ;
427
+ if ( ! room || ! crypto ) return ;
428
+ this . setState ( { isRoomEncrypted : await crypto . isEncryptionEnabledInRoom ( room . roomId ) } ) ;
416
429
}
417
430
418
431
private updateThread = ( thread : Thread ) : void => {
@@ -470,6 +483,17 @@ export class UnwrappedEventTile extends React.Component<EventTileProps, IState>
470
483
}
471
484
} ;
472
485
486
+ private onRoomStateEvents = async ( evt : MatrixEvent ) : Promise < void > => {
487
+ const client = MatrixClientPeg . safeGet ( ) ;
488
+ const crypto = client . getCrypto ( ) ;
489
+ if ( ! crypto ) return ;
490
+
491
+ const room = client . getRoom ( evt . getRoomId ( ) ) ;
492
+ if ( room && evt . getType ( ) === EventType . RoomEncryption ) {
493
+ this . setState ( { isRoomEncrypted : await crypto . isEncryptionEnabledInRoom ( room . roomId ) } ) ;
494
+ }
495
+ } ;
496
+
473
497
private get thread ( ) : Thread | null {
474
498
let thread : Thread | undefined = this . props . mxEvent . getThread ( ) ;
475
499
/**
@@ -767,7 +791,7 @@ export class UnwrappedEventTile extends React.Component<EventTileProps, IState>
767
791
}
768
792
}
769
793
770
- if ( MatrixClientPeg . safeGet ( ) . isRoomEncrypted ( ev . getRoomId ( ) ! ) ) {
794
+ if ( this . state . isRoomEncrypted ) {
771
795
// else if room is encrypted
772
796
// and event is being encrypted or is not_sent (Unknown Devices/Network Error)
773
797
if ( ev . status === EventStatus . ENCRYPTING ) {
0 commit comments