@@ -42,13 +42,17 @@ class Unreads extends ChangeNotifier {
42
42
required ChannelStore channelStore,
43
43
}) {
44
44
final streams = < int , Map <String , QueueList <int >>> {};
45
+ final reverseStreamsLookup = < int , ({int streamId, String topic})> {};
45
46
final dms = < DmNarrow , QueueList <int >> {};
46
47
final mentions = Set .of (initial.mentions);
47
48
48
49
for (final unreadChannelSnapshot in initial.channels) {
49
50
final streamId = unreadChannelSnapshot.streamId;
50
51
final topic = unreadChannelSnapshot.topic;
51
52
(streams[streamId] ?? = {})[topic] = QueueList .from (unreadChannelSnapshot.unreadMessageIds);
53
+ final messageInfo = (streamId: streamId, topic: topic);
54
+ reverseStreamsLookup.addEntries (
55
+ unreadChannelSnapshot.unreadMessageIds.map ((messageId) => MapEntry (messageId, messageInfo)));
52
56
}
53
57
54
58
for (final unreadDmSnapshot in initial.dms) {
@@ -65,6 +69,7 @@ class Unreads extends ChangeNotifier {
65
69
return Unreads ._(
66
70
channelStore: channelStore,
67
71
streams: streams,
72
+ reverseStreamsLookup: reverseStreamsLookup,
68
73
dms: dms,
69
74
mentions: mentions,
70
75
oldUnreadsMissing: initial.oldUnreadsMissing,
@@ -75,11 +80,12 @@ class Unreads extends ChangeNotifier {
75
80
Unreads ._({
76
81
required this .channelStore,
77
82
required this .streams,
83
+ required Map <int , ({int streamId, String topic})> reverseStreamsLookup,
78
84
required this .dms,
79
85
required this .mentions,
80
86
required this .oldUnreadsMissing,
81
87
required this .selfUserId,
82
- });
88
+ }) : _reverseStreamsLookup = reverseStreamsLookup ;
83
89
84
90
final ChannelStore channelStore;
85
91
@@ -89,6 +95,9 @@ class Unreads extends ChangeNotifier {
89
95
/// Unread stream messages, as: stream ID → topic → message IDs (sorted).
90
96
final Map <int , Map <String , QueueList <int >>> streams;
91
97
98
+ /// Maps the message id to the (stream ID, topic) we stored it under in streams.
99
+ final Map <int , ({int streamId, String topic})> _reverseStreamsLookup;
100
+
92
101
/// Unread DM messages, as: DM narrow → message IDs (sorted).
93
102
final Map <DmNarrow , QueueList <int >> dms;
94
103
@@ -341,6 +350,7 @@ class Unreads extends ChangeNotifier {
341
350
streams.clear ();
342
351
dms.clear ();
343
352
mentions.clear ();
353
+ _reverseStreamsLookup.clear ();
344
354
oldUnreadsMissing = false ;
345
355
} else {
346
356
final messageIdsSet = Set .of (event.messages);
@@ -435,6 +445,7 @@ class Unreads extends ChangeNotifier {
435
445
436
446
void _addLastInStreamTopic (int messageId, int streamId, String topic) {
437
447
((streams[streamId] ?? = {})[topic] ?? = QueueList ()).addLast (messageId);
448
+ _reverseStreamsLookup[messageId] = (streamId: streamId, topic: topic);
438
449
}
439
450
440
451
// [messageIds] must be sorted ascending and without duplicates.
@@ -447,6 +458,9 @@ class Unreads extends ChangeNotifier {
447
458
// TODO(server-6) remove 6.0 comment
448
459
(existing) => setUnion (existing, messageIds),
449
460
);
461
+ final messageInfo = (streamId: streamId, topic: topic);
462
+ _reverseStreamsLookup.addEntries (
463
+ messageIds.map ((messageId) => MapEntry (messageId, messageInfo)));
450
464
}
451
465
452
466
// TODO use efficient model lookups
@@ -470,6 +484,9 @@ class Unreads extends ChangeNotifier {
470
484
for (final streamId in newlyEmptyStreams) {
471
485
streams.remove (streamId);
472
486
}
487
+ for (var messageId in idsToRemove) {
488
+ _reverseStreamsLookup.remove (messageId);
489
+ }
473
490
}
474
491
475
492
void _removeAllInStreamTopic (Set <int > incomingMessageIds, int streamId, String topic) {
@@ -486,6 +503,9 @@ class Unreads extends ChangeNotifier {
486
503
streams.remove (streamId);
487
504
}
488
505
}
506
+ for (var messageId in incomingMessageIds) {
507
+ _reverseStreamsLookup.remove (messageId);
508
+ }
489
509
}
490
510
491
511
// TODO use efficient model lookups
0 commit comments