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