@@ -619,10 +619,39 @@ class MessageListView with ChangeNotifier, _MessageSequence {
619
619
if (haveOldest) return ;
620
620
if (busyFetchingMore) return ;
621
621
assert (fetched);
622
+ assert (messages.isNotEmpty);
623
+ await _fetchMore (
624
+ anchor: NumericAnchor (messages[0 ].id),
625
+ numBefore: kMessageListFetchBatchSize,
626
+ numAfter: 0 ,
627
+ processResult: (result) {
628
+ if (result.messages.isNotEmpty
629
+ && result.messages.last.id == messages[0 ].id) {
630
+ // TODO(server-6): includeAnchor should make this impossible
631
+ result.messages.removeLast ();
632
+ }
633
+
634
+ store.reconcileMessages (result.messages);
635
+ store.recentSenders.handleMessages (result.messages); // TODO(#824)
636
+
637
+ final fetchedMessages = _allMessagesVisible
638
+ ? result.messages // Avoid unnecessarily copying the list.
639
+ : result.messages.where (_messageVisible);
640
+
641
+ _insertAllMessages (0 , fetchedMessages);
642
+ _haveOldest = result.foundOldest;
643
+ });
644
+ }
645
+
646
+ Future <void > _fetchMore ({
647
+ required Anchor anchor,
648
+ required int numBefore,
649
+ required int numAfter,
650
+ required void Function (GetMessagesResult ) processResult,
651
+ }) async {
622
652
assert (narrow is ! TopicNarrow
623
653
// We only intend to send "with" in [fetchInitial]; see there.
624
654
|| (narrow as TopicNarrow ).with_ == null );
625
- assert (messages.isNotEmpty);
626
655
_setStatus (FetchingStatus .fetchingMore, was: FetchingStatus .idle);
627
656
final generation = this .generation;
628
657
bool hasFetchError = false ;
@@ -631,10 +660,10 @@ class MessageListView with ChangeNotifier, _MessageSequence {
631
660
try {
632
661
result = await getMessages (store.connection,
633
662
narrow: narrow.apiEncode (),
634
- anchor: NumericAnchor (messages[ 0 ].id) ,
663
+ anchor: anchor ,
635
664
includeAnchor: false ,
636
- numBefore: kMessageListFetchBatchSize ,
637
- numAfter: 0 ,
665
+ numBefore: numBefore ,
666
+ numAfter: numAfter ,
638
667
allowEmptyTopicName: true ,
639
668
);
640
669
} catch (e) {
@@ -643,21 +672,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
643
672
}
644
673
if (this .generation > generation) return ;
645
674
646
- if (result.messages.isNotEmpty
647
- && result.messages.last.id == messages[0 ].id) {
648
- // TODO(server-6): includeAnchor should make this impossible
649
- result.messages.removeLast ();
650
- }
651
-
652
- store.reconcileMessages (result.messages);
653
- store.recentSenders.handleMessages (result.messages); // TODO(#824)
654
-
655
- final fetchedMessages = _allMessagesVisible
656
- ? result.messages // Avoid unnecessarily copying the list.
657
- : result.messages.where (_messageVisible);
658
-
659
- _insertAllMessages (0 , fetchedMessages);
660
- _haveOldest = result.foundOldest;
675
+ processResult (result);
661
676
} finally {
662
677
if (this .generation == generation) {
663
678
if (hasFetchError) {
0 commit comments