Skip to content

Commit 9e5f2e9

Browse files
model: Prevent duplicate flags when processing update_message_flags.
Fixes #1986.
1 parent 0709679 commit 9e5f2e9

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,6 +1702,33 @@ void main() {
17021702
check(store).messages.values
17031703
.single.flags.deepEquals([MessageFlag.starred, MessageFlag.read]);
17041704
});
1705+
1706+
test('avoid duplicate flags', () async {
1707+
// Regression test for https://github.com/zulip/zulip-flutter/issues/1986
1708+
await prepare();
1709+
final message = eg.streamMessage(flags: [MessageFlag.read]);
1710+
await prepareMessages([message]);
1711+
1712+
await store.handleEvent(mkAddEvent(MessageFlag.read, [message.id]));
1713+
check(store).messages.values.single.flags.deepEquals([MessageFlag.read]);
1714+
});
1715+
1716+
test('handle update_message_flags: add flag "all" is idempotent', () async {
1717+
await prepare();
1718+
final m1 = eg.streamMessage(flags: [MessageFlag.read]);
1719+
final m2 = eg.streamMessage(flags: []);
1720+
await prepareMessages([m1, m2]);
1721+
1722+
await store.handleEvent(UpdateMessageFlagsAddEvent(
1723+
id: 1,
1724+
all: true,
1725+
flag: MessageFlag.read,
1726+
messages: [],
1727+
));
1728+
1729+
check(store.messages[m1.id]!.flags).deepEquals([MessageFlag.read]);
1730+
check(store.messages[m2.id]!.flags).deepEquals([MessageFlag.read]);
1731+
});
17051732
});
17061733

17071734
group('remove flag', () {

0 commit comments

Comments
 (0)