Skip to content

Commit d72e50c

Browse files
committed
model: Update narrow when propageMode is changeAll or changeLater.
This prepares for the later UI change that make MessageListPage follow to the narrow of moved messages. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 0f3c452 commit d72e50c

File tree

4 files changed

+72
-4
lines changed

4 files changed

+72
-4
lines changed

lib/model/message.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class MessageStoreImpl with MessageStore {
210210
origTopic: origTopic,
211211
newTopic: newTopic,
212212
messageIds: event.messageIds,
213+
propagateMode: event.propagateMode,
213214
);
214215
}
215216
}

lib/model/message_list.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,8 @@ class MessageListView with ChangeNotifier, _MessageSequence {
358358
super.dispose();
359359
}
360360

361+
Narrow narrow;
361362
final PerAccountStore store;
362-
final Narrow narrow;
363363

364364
/// Whether [message] should actually appear in this message list,
365365
/// given that it does belong to the narrow.
@@ -525,8 +525,17 @@ class MessageListView with ChangeNotifier, _MessageSequence {
525525
fetchInitial();
526526
}
527527

528-
void _messagesMovedFromNarrow(List<int> messageIds) {
528+
void _messagesMovedFromNarrow(
529+
List<int> messageIds,
530+
{TopicNarrow? newNarrow, PropagateMode? propagateMode}
531+
) {
529532
if (_removeMessagesById(messageIds)) {
533+
if (propagateMode == PropagateMode.changeAll
534+
|| propagateMode == PropagateMode.changeLater) {
535+
narrow = newNarrow!;
536+
_reset();
537+
fetchInitial();
538+
}
530539
notifyListeners();
531540
}
532541
}
@@ -537,6 +546,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
537546
required String origTopic,
538547
required String newTopic,
539548
required List<int> messageIds,
549+
required PropagateMode? propagateMode,
540550
}) {
541551
switch (narrow) {
542552
case DmNarrow():
@@ -566,7 +576,9 @@ class MessageListView with ChangeNotifier, _MessageSequence {
566576
case (false, false): return;
567577
case (true, true ): _messagesMovedInternally(messageIds);
568578
case (false, true ): _messagesMovedIntoNarrow();
569-
case (true, false): _messagesMovedFromNarrow(messageIds); // TODO handle propagateMode
579+
case (true, false): _messagesMovedFromNarrow(messageIds,
580+
newNarrow: TopicNarrow(newStreamId, newTopic),
581+
propagateMode: propagateMode!);
570582
}
571583
}
572584
}

test/example_data.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,7 @@ UpdateMessageEvent updateMessageMoveEvent(
445445
String? newTopic,
446446
String? origContent,
447447
String? newContent,
448+
PropagateMode propagateMode = PropagateMode.changeOne,
448449
}) {
449450
assert(messages.isNotEmpty);
450451
assert(origTopic != null, 'origTopic required for a message move');
@@ -462,7 +463,7 @@ UpdateMessageEvent updateMessageMoveEvent(
462463
editTimestamp: 1234567890, // TODO generate timestamp
463464
origStreamId: origStreamId ?? (origMessage is StreamMessage ? origMessage.streamId : null),
464465
newStreamId: newStreamId,
465-
propagateMode: null,
466+
propagateMode: propagateMode,
466467
origTopic: origTopic,
467468
newTopic: newTopic,
468469
origContent: origContent,

test/model/message_list_test.dart

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,33 @@ void main() {
491491
checkHasMessages(initialMessages);
492492
checkNotifiedOnce();
493493
});
494+
495+
void testMessageMove(PropagateMode propagateMode) =>
496+
awaitFakeAsync((async) async {
497+
await prepareNarrow(narrow, initialMessages + movedMessages);
498+
connection.prepare(delay: const Duration(seconds: 1), json: newestResult(
499+
foundOldest: false,
500+
messages: movedMessages,
501+
).toJson());
502+
await store.handleEvent(eg.updateMessageMoveEvent(movedMessages,
503+
newTopic: 'new',
504+
origTopic: movedMessages[0].topic,
505+
newStreamId: otherStream.streamId,
506+
origStreamId: stream.streamId,
507+
propagateMode: propagateMode,
508+
));
509+
checkNotifiedOnce();
510+
async.elapse(const Duration(seconds: 1));
511+
checkHasMessages(movedMessages);
512+
check(model).narrow.equals(TopicNarrow(otherStream.streamId, 'new'));
513+
checkNotifiedOnce();
514+
});
515+
516+
test('follow to the new narrow when propagateMode = changeLater', () =>
517+
testMessageMove(PropagateMode.changeLater));
518+
519+
test('follow to the new narrow when propagateMode = changeAll', () =>
520+
testMessageMove(PropagateMode.changeAll));
494521
});
495522

496523
group('in stream narrow', () {
@@ -542,6 +569,33 @@ void main() {
542569
checkHasMessages(initialMessages);
543570
checkNotifiedOnce();
544571
});
572+
573+
void testMessageMove(PropagateMode propagateMode) =>
574+
awaitFakeAsync((async) async {
575+
await prepareNarrow(narrow, initialMessages + movedMessages);
576+
connection.prepare(delay: const Duration(seconds: 1), json: newestResult(
577+
foundOldest: false,
578+
messages: movedMessages,
579+
).toJson());
580+
await store.handleEvent(eg.updateMessageMoveEvent(movedMessages,
581+
newTopic: 'new',
582+
origTopic: movedMessages[0].topic,
583+
newStreamId: otherStream.streamId,
584+
origStreamId: stream.streamId,
585+
propagateMode: propagateMode,
586+
));
587+
checkNotifiedOnce();
588+
async.elapse(const Duration(seconds: 1));
589+
checkHasMessages(initialMessages);
590+
check(model).narrow.equals(StreamNarrow(stream.streamId));
591+
checkNotNotified();
592+
});
593+
594+
test('do not follow when propagateMode = changeLater', () =>
595+
testMessageMove(PropagateMode.changeLater));
596+
597+
test('do not follow when propagateMode = changeAll', () =>
598+
testMessageMove(PropagateMode.changeAll));
545599
});
546600

547601
group('in combined narrow', () {

0 commit comments

Comments
 (0)