Skip to content

Commit 683c713

Browse files
committed
unreads: Handle updates when there are moved messages
Signed-off-by: Zixuan James Li <[email protected]>
1 parent a1cb1a8 commit 683c713

File tree

2 files changed

+127
-1
lines changed

2 files changed

+127
-1
lines changed

lib/model/unreads.dart

+26-1
Original file line numberDiff line numberDiff line change
@@ -296,13 +296,38 @@ class Unreads extends ChangeNotifier {
296296
madeAnyUpdate |= mentions.add(messageId);
297297
}
298298

299-
// TODO(#901) handle moved messages
299+
madeAnyUpdate |= _handleMessageMove(event);
300300

301301
if (madeAnyUpdate) {
302302
notifyListeners();
303303
}
304304
}
305305

306+
bool _handleMessageMove(UpdateMessageEvent event) {
307+
final messageMove = event.moveData;
308+
if (messageMove == null) {
309+
// No moved messages or malformed event.
310+
return false;
311+
}
312+
313+
final topics = streams[messageMove.origStreamId];
314+
if (topics == null || topics[messageMove.origTopic] == null) {
315+
// No known unreads affected by move; nothing to do.
316+
return false;
317+
}
318+
319+
final messageToMoveIds = _removeAllInStreamTopic(
320+
event.messageIds.toSet(),
321+
messageMove.origStreamId, messageMove.origTopic);
322+
if (messageToMoveIds.isEmpty) {
323+
return false;
324+
}
325+
_addAllInStreamTopic(
326+
messageToMoveIds..sort(),
327+
messageMove.newStreamId, messageMove.newTopic);
328+
return true;
329+
}
330+
306331
void handleDeleteMessageEvent(DeleteMessageEvent event) {
307332
mentions.removeAll(event.messageIds);
308333
final messageIdsSet = Set.of(event.messageIds);

test/model/unreads_test.dart

+101
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,107 @@ void main() {
469469
}
470470
}
471471
});
472+
473+
group('moves', () {
474+
final origChannel = eg.stream();
475+
const origTopic = 'origTopic';
476+
const newTopic = 'newTopic';
477+
478+
test('move read messages to new topic', () {
479+
final message = eg.streamMessage(
480+
stream: origChannel, topic: origTopic, flags: [MessageFlag.read]);
481+
prepare();
482+
fillWithMessages([message]);
483+
484+
model.handleUpdateMessageEvent(eg.updateMessageEventMoveFrom(
485+
origMessages: [message],
486+
newTopicStr: newTopic));
487+
checkNotNotified();
488+
checkMatchesMessages([]);
489+
});
490+
491+
test('move read messages from topic with unreads', () {
492+
final message1 = eg.streamMessage(
493+
stream: origChannel, topic: origTopic, flags: [MessageFlag.read]);
494+
final message2 = eg.streamMessage(
495+
stream: origChannel, topic: origTopic);
496+
prepare();
497+
fillWithMessages([message1, message2]);
498+
499+
model.handleUpdateMessageEvent(eg.updateMessageEventMoveFrom(
500+
origMessages: [message1],
501+
newTopicStr: newTopic));
502+
checkNotNotified();
503+
checkMatchesMessages([message2]);
504+
});
505+
506+
test('move read messages to topic with unreads', () {
507+
final message1 = eg.streamMessage(
508+
stream: origChannel, topic: origTopic, flags: [MessageFlag.read]);
509+
final message2 = eg.streamMessage(
510+
stream: origChannel, topic: newTopic);
511+
prepare();
512+
fillWithMessages([message1, message2]);
513+
514+
model.handleUpdateMessageEvent(eg.updateMessageEventMoveFrom(
515+
origMessages: [message1],
516+
newTopicStr: newTopic,
517+
));
518+
checkNotNotified();
519+
checkMatchesMessages([message2]);
520+
});
521+
522+
test('move unread messages to topic with unreads', () {
523+
final message1 = eg.streamMessage(
524+
id: 1, stream: origChannel, topic: origTopic);
525+
final message2 = eg.streamMessage(
526+
id: 2, stream: origChannel, topic: newTopic);
527+
prepare();
528+
fillWithMessages([message1, message2]);
529+
530+
model.handleUpdateMessageEvent(eg.updateMessageEventMoveFrom(
531+
origMessages: [message1],
532+
newTopicStr: newTopic));
533+
checkNotifiedOnce();
534+
checkMatchesMessages([
535+
Message.fromJson(message1.toJson()..['subject'] = newTopic),
536+
message2,
537+
]);
538+
});
539+
540+
test('move unread messages to new topic', () {
541+
final message = eg.streamMessage(id: 1, stream: origChannel);
542+
prepare();
543+
fillWithMessages([message]);
544+
545+
model.handleUpdateMessageEvent(eg.updateMessageEventMoveFrom(
546+
origMessages: [message],
547+
newTopicStr: newTopic));
548+
checkNotifiedOnce();
549+
checkMatchesMessages([
550+
Message.fromJson(message.toJson()..['subject'] = newTopic),
551+
]);
552+
});
553+
554+
test('move unread messages to new channel', () {
555+
final message = eg.streamMessage(
556+
id: 1, stream: origChannel, topic: origTopic);
557+
final newChannel = eg.stream();
558+
prepare();
559+
fillWithMessages([message]);
560+
561+
model.handleUpdateMessageEvent(eg.updateMessageEventMoveFrom(
562+
origMessages: [message],
563+
newStreamId: newChannel.streamId,
564+
newTopicStr: newTopic));
565+
checkNotifiedOnce();
566+
checkMatchesMessages([
567+
Message.fromJson(message.toJson()
568+
..['stream_id'] = newChannel.streamId
569+
..['subject'] = newTopic),
570+
]);
571+
});
572+
});
472573
});
473574

474575

0 commit comments

Comments
 (0)