@@ -649,10 +649,39 @@ class MessageListView with ChangeNotifier, _MessageSequence {
649649 if (haveOldest) return ;
650650 if (busyFetchingMore) return ;
651651 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 {
652682 assert (narrow is ! TopicNarrow
653683 // We only intend to send "with" in [fetchInitial]; see there.
654684 || (narrow as TopicNarrow ).with_ == null );
655- assert (messages.isNotEmpty);
656685 _setStatus (FetchingStatus .fetchingMore, was: FetchingStatus .idle);
657686 final generation = this .generation;
658687 bool hasFetchError = false ;
@@ -661,10 +690,10 @@ class MessageListView with ChangeNotifier, _MessageSequence {
661690 try {
662691 result = await getMessages (store.connection,
663692 narrow: narrow.apiEncode (),
664- anchor: NumericAnchor (messages[ 0 ].id) ,
693+ anchor: anchor ,
665694 includeAnchor: false ,
666- numBefore: kMessageListFetchBatchSize ,
667- numAfter: 0 ,
695+ numBefore: numBefore ,
696+ numAfter: numAfter ,
668697 allowEmptyTopicName: true ,
669698 );
670699 } catch (e) {
@@ -673,21 +702,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
673702 }
674703 if (this .generation > generation) return ;
675704
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);
691706 } finally {
692707 if (this .generation == generation) {
693708 if (hasFetchError) {
0 commit comments