Skip to content

Commit 2197c45

Browse files
model: Prevent duplicate flags when processing update_message_flags.
Previously, the event handler would unconditionally add flags to the message's flag list. If a flag (like 'read') was already present, this created duplicates, which broke subsequent removal operations. This commit adds a check to ensure the flag is not already present before adding it, making the operation idempotent. Fixes #1986
1 parent 0709679 commit 2197c45

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

lib/model/message.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,9 @@ class MessageStoreImpl extends HasChannelStore with MessageStore, _OutboxMessage
736736

737737
if (isAdd && (event as UpdateMessageFlagsAddEvent).all) {
738738
for (final message in messages.values) {
739-
message.flags.add(event.flag);
739+
if (!message.flags.contains(event.flag)) {
740+
message.flags.add(event.flag);
741+
}
740742
}
741743

742744
for (final view in _messageListViews) {
@@ -750,9 +752,13 @@ class MessageStoreImpl extends HasChannelStore with MessageStore, _OutboxMessage
750752
if (message == null) continue; // a message we don't know about yet
751753
anyMessageFound = true;
752754

753-
isAdd
754-
? message.flags.add(event.flag)
755-
: message.flags.remove(event.flag);
755+
if (isAdd) {
756+
if (!message.flags.contains(event.flag)) {
757+
message.flags.add(event.flag);
758+
}
759+
} else {
760+
message.flags.remove(event.flag);
761+
}
756762
}
757763
if (anyMessageFound) {
758764
// TODO(#818): Support MentionsNarrow live-updates when handling

test/model/message_test.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,6 +1702,22 @@ void main() {
17021702
check(store).messages.values
17031703
.single.flags.deepEquals([MessageFlag.starred, MessageFlag.read]);
17041704
});
1705+
1706+
test('avoid duplicate flags', () async {
1707+
await prepare();
1708+
final message = eg.streamMessage(flags: [MessageFlag.read]);
1709+
await prepareMessages([message]);
1710+
1711+
// Add 'read' flag again
1712+
await store.handleEvent(mkAddEvent(MessageFlag.read, [message.id]));
1713+
1714+
// Should verify no notifications since no actual change happened
1715+
// But current implementation might notify anyway if it doesn't check for change
1716+
// optimization. The main point is flags list shouldn't have duplicates.
1717+
// Let's check the flags first.
1718+
1719+
check(store).messages.values.single.flags.deepEquals([MessageFlag.read]);
1720+
});
17051721
});
17061722

17071723
group('remove flag', () {

0 commit comments

Comments
 (0)