@@ -15,6 +15,7 @@ limitations under the License.
15
15
*/
16
16
17
17
import { Room } from "matrix-js-sdk/src/models/room" ;
18
+ import { Thread } from "matrix-js-sdk/src/models/thread" ;
18
19
import { MatrixEvent } from "matrix-js-sdk/src/models/event" ;
19
20
import { EventType } from "matrix-js-sdk/src/@types/event" ;
20
21
import { M_BEACON } from "matrix-js-sdk/src/@types/beacon" ;
@@ -59,34 +60,34 @@ export function doesRoomHaveUnreadMessages(room: Room): boolean {
59
60
return false ;
60
61
}
61
62
62
- const myUserId = MatrixClientPeg . get ( ) . getUserId ( ) ;
63
-
64
- // get the most recent read receipt sent by our account.
65
- // N.B. this is NOT a read marker (RM, aka "read up to marker"),
66
- // despite the name of the method :((
67
- const readUpToId = room . getEventReadUpTo ( myUserId ) ;
68
-
69
- if ( ! SettingsStore . getValue ( "feature_thread" ) ) {
70
- // as we don't send RRs for our own messages, make sure we special case that
71
- // if *we* sent the last message into the room, we consider it not unread!
72
- // Should fix: https://github.com/vector-im/element-web/issues/3263
73
- // https://github.com/vector-im/element-web/issues/2427
74
- // ...and possibly some of the others at
75
- // https://github.com/vector-im/element-web/issues/3363
76
- if ( room . timeline . length && room . timeline [ room . timeline . length - 1 ] . getSender ( ) === myUserId ) {
77
- return false ;
63
+ for ( const timeline of [ room , ...room . getThreads ( ) ] ) {
64
+ // If the current timeline has unread messages, we're done.
65
+ if ( doesRoomOrThreadHaveUnreadMessages ( timeline ) ) {
66
+ return true ;
78
67
}
79
68
}
69
+ // If we got here then no timelines were found with unread messages.
70
+ return false ;
71
+ }
72
+
73
+ function doesRoomOrThreadHaveUnreadMessages ( room : Room | Thread ) : boolean {
74
+ const myUserId = MatrixClientPeg . get ( ) . getUserId ( ) ;
80
75
81
- // if the read receipt relates to an event is that part of a thread
82
- // we consider that there are no unread messages
83
- // This might be a false negative, but probably the best we can do until
84
- // the read receipts have evolved to cater for threads
85
- const event = room . findEventById ( readUpToId ) ;
86
- if ( event ?. getThread ( ) ) {
76
+ // as we don't send RRs for our own messages, make sure we special case that
77
+ // if *we* sent the last message into the room, we consider it not unread!
78
+ // Should fix: https://github.com/vector-im/element-web/issues/3263
79
+ // https://github.com/vector-im/element-web/issues/2427
80
+ // ...and possibly some of the others at
81
+ // https://github.com/vector-im/element-web/issues/3363
82
+ if ( room . timeline . at ( - 1 ) ?. getSender ( ) === myUserId ) {
87
83
return false ;
88
84
}
89
85
86
+ // get the most recent read receipt sent by our account.
87
+ // N.B. this is NOT a read marker (RM, aka "read up to marker"),
88
+ // despite the name of the method :((
89
+ const readUpToId = room . getEventReadUpTo ( myUserId ! ) ;
90
+
90
91
// this just looks at whatever history we have, which if we've only just started
91
92
// up probably won't be very much, so if the last couple of events are ones that
92
93
// don't count, we don't know if there are any events that do count between where
0 commit comments