@@ -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,36 +60,34 @@ export function doesRoomHaveUnreadMessages(room: Room): boolean {
59
60
return false ;
60
61
}
61
62
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 ;
67
+ }
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 {
62
74
const myUserId = MatrixClientPeg . get ( ) . getUserId ( ) ;
63
75
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 ) {
83
+ return false ;
84
+ }
85
+
64
86
// get the most recent read receipt sent by our account.
65
87
// N.B. this is NOT a read marker (RM, aka "read up to marker"),
66
88
// despite the name of the method :((
67
89
const readUpToId = room . getEventReadUpTo ( myUserId ! ) ;
68
90
69
- if ( ! SettingsStore . getValue ( "feature_threadstable" ) ) {
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 ;
78
- }
79
- }
80
-
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
- if ( readUpToId ) {
86
- const event = room . findEventById ( readUpToId ) ;
87
- if ( event ?. getThread ( ) ) {
88
- return false ;
89
- }
90
- }
91
-
92
91
// this just looks at whatever history we have, which if we've only just started
93
92
// up probably won't be very much, so if the last couple of events are ones that
94
93
// don't count, we don't know if there are any events that do count between where
0 commit comments