@@ -619,10 +619,39 @@ class MessageListView with ChangeNotifier, _MessageSequence {
619619 if (haveOldest) return ;
620620 if (busyFetchingMore) return ;
621621 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 {
622652 assert (narrow is ! TopicNarrow
623653 // We only intend to send "with" in [fetchInitial]; see there.
624654 || (narrow as TopicNarrow ).with_ == null );
625- assert (messages.isNotEmpty);
626655 _setStatus (FetchingStatus .fetchingMore, was: FetchingStatus .idle);
627656 final generation = this .generation;
628657 bool hasFetchError = false ;
@@ -631,10 +660,10 @@ class MessageListView with ChangeNotifier, _MessageSequence {
631660 try {
632661 result = await getMessages (store.connection,
633662 narrow: narrow.apiEncode (),
634- anchor: NumericAnchor (messages[ 0 ].id) ,
663+ anchor: anchor ,
635664 includeAnchor: false ,
636- numBefore: kMessageListFetchBatchSize ,
637- numAfter: 0 ,
665+ numBefore: numBefore ,
666+ numAfter: numAfter ,
638667 allowEmptyTopicName: true ,
639668 );
640669 } catch (e) {
@@ -643,21 +672,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
643672 }
644673 if (this .generation > generation) return ;
645674
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);
661676 } finally {
662677 if (this .generation == generation) {
663678 if (hasFetchError) {
0 commit comments