@@ -649,10 +649,39 @@ class MessageListView with ChangeNotifier, _MessageSequence {
649
649
if (haveOldest) return ;
650
650
if (busyFetchingMore) return ;
651
651
assert (fetched);
652
+ assert (messages.isNotEmpty);
653
+ await _fetchMore (
654
+ anchor: NumericAnchor (messages[0 ].id),
655
+ numBefore: kMessageListFetchBatchSize,
656
+ numAfter: 0 ,
657
+ processResult: (result) {
658
+ if (result.messages.isNotEmpty
659
+ && result.messages.last.id == messages[0 ].id) {
660
+ // TODO(server-6): includeAnchor should make this impossible
661
+ result.messages.removeLast ();
662
+ }
663
+
664
+ store.reconcileMessages (result.messages);
665
+ store.recentSenders.handleMessages (result.messages); // TODO(#824)
666
+
667
+ final fetchedMessages = _allMessagesVisible
668
+ ? result.messages // Avoid unnecessarily copying the list.
669
+ : result.messages.where (_messageVisible);
670
+
671
+ _insertAllMessages (0 , fetchedMessages);
672
+ _haveOldest = result.foundOldest;
673
+ });
674
+ }
675
+
676
+ Future <void > _fetchMore ({
677
+ required Anchor anchor,
678
+ required int numBefore,
679
+ required int numAfter,
680
+ required void Function (GetMessagesResult ) processResult,
681
+ }) async {
652
682
assert (narrow is ! TopicNarrow
653
683
// We only intend to send "with" in [fetchInitial]; see there.
654
684
|| (narrow as TopicNarrow ).with_ == null );
655
- assert (messages.isNotEmpty);
656
685
_setStatus (FetchingStatus .fetchingMore, was: FetchingStatus .idle);
657
686
final generation = this .generation;
658
687
bool hasFetchError = false ;
@@ -661,10 +690,10 @@ class MessageListView with ChangeNotifier, _MessageSequence {
661
690
try {
662
691
result = await getMessages (store.connection,
663
692
narrow: narrow.apiEncode (),
664
- anchor: NumericAnchor (messages[ 0 ].id) ,
693
+ anchor: anchor ,
665
694
includeAnchor: false ,
666
- numBefore: kMessageListFetchBatchSize ,
667
- numAfter: 0 ,
695
+ numBefore: numBefore ,
696
+ numAfter: numAfter ,
668
697
allowEmptyTopicName: true ,
669
698
);
670
699
} catch (e) {
@@ -673,21 +702,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
673
702
}
674
703
if (this .generation > generation) return ;
675
704
676
- if (result.messages.isNotEmpty
677
- && result.messages.last.id == messages[0 ].id) {
678
- // TODO(server-6): includeAnchor should make this impossible
679
- result.messages.removeLast ();
680
- }
681
-
682
- store.reconcileMessages (result.messages);
683
- store.recentSenders.handleMessages (result.messages); // TODO(#824)
684
-
685
- final fetchedMessages = _allMessagesVisible
686
- ? result.messages // Avoid unnecessarily copying the list.
687
- : result.messages.where (_messageVisible);
688
-
689
- _insertAllMessages (0 , fetchedMessages);
690
- _haveOldest = result.foundOldest;
705
+ processResult (result);
691
706
} finally {
692
707
if (this .generation == generation) {
693
708
if (hasFetchError) {
0 commit comments