diff --git a/lib/model/unreads.dart b/lib/model/unreads.dart index b3eda6e3c7..a115d0d4b3 100644 --- a/lib/model/unreads.dart +++ b/lib/model/unreads.dart @@ -355,7 +355,7 @@ class Unreads extends ChangeNotifier { } else { final messageIdsSet = Set.of(event.messages); mentions.removeAll(messageIdsSet); - _slowRemoveAllInStreams(messageIdsSet); + _removeAllInStreams(messageIdsSet); _slowRemoveAllInDms(messageIdsSet); } case UpdateMessageFlagsRemoveEvent(): @@ -458,29 +458,18 @@ class Unreads extends ChangeNotifier { messageIds.map((messageId) => MapEntry(messageId, messageInfo))); } - // TODO use efficient model lookups - void _slowRemoveAllInStreams(Set idsToRemove) { - final newlyEmptyStreams = []; - for (final MapEntry(key: streamId, value: topics) in streams.entries) { - final newlyEmptyTopics = []; - for (final MapEntry(key: topic, value: messageIds) in topics.entries) { - messageIds.removeWhere((id) => idsToRemove.contains(id)); - if (messageIds.isEmpty) { - newlyEmptyTopics.add(topic); + void _removeAllInStreams(Set idsToRemove) { + for (var messageId in idsToRemove) { + final info = _reverseStreamsLookup.remove(messageId); + if (info != null && streams[info.streamId]?[info.topic] != null) { + streams[info.streamId]![info.topic]!.remove(messageId); + if (streams[info.streamId]![info.topic]!.isEmpty) { + streams[info.streamId]!.remove(info.topic); + } + if (streams[info.streamId]!.isEmpty) { + streams.remove(info.streamId); } } - for (final topic in newlyEmptyTopics) { - topics.remove(topic); - } - if (topics.isEmpty) { - newlyEmptyStreams.add(streamId); - } - } - for (final streamId in newlyEmptyStreams) { - streams.remove(streamId); - } - for (var messageId in idsToRemove) { - _reverseStreamsLookup.remove(messageId); } }