@@ -48,6 +48,7 @@ struct ChatListNodeListViewTransition {
4848 let stationaryItemRange : ( Int , Int ) ?
4949 let adjustScrollToFirstItem : Bool
5050 let animateCrossfade : Bool
51+ let locationGeneration : Int
5152}
5253
5354final class ChatListHighlightedLocation : Equatable {
@@ -1171,9 +1172,10 @@ private func mappedChatListNodeViewListTransition(
11711172 mode: ChatListNodeMode ,
11721173 isPeerEnabled: ( ( EnginePeer ) -> Bool ) ? ,
11731174 presentationData: ChatListPresentationData ,
1174- transition: ChatListNodeViewTransition
1175+ transition: ChatListNodeViewTransition ,
1176+ locationGeneration: Int
11751177) -> ChatListNodeListViewTransition {
1176- return ChatListNodeListViewTransition ( chatListView: transition. chatListView, deleteItems: transition. deleteItems, insertItems: mappedInsertEntries ( context: context, nodeInteraction: nodeInteraction, location: location, isPremium: isPremium, filterData: filterData, chatListFilters: chatListFilters, mode: mode, isPeerEnabled: isPeerEnabled, entries: transition. insertEntries, presentationData: presentationData) , updateItems: mappedUpdateEntries ( context: context, nodeInteraction: nodeInteraction, location: location, isPremium: isPremium, filterData: filterData, chatListFilters: chatListFilters, mode: mode, isPeerEnabled: isPeerEnabled, entries: transition. updateEntries, presentationData: presentationData) , options: transition. options, scrollToItem: transition. scrollToItem, stationaryItemRange: transition. stationaryItemRange, adjustScrollToFirstItem: transition. adjustScrollToFirstItem, animateCrossfade: transition. animateCrossfade)
1178+ return ChatListNodeListViewTransition ( chatListView: transition. chatListView, deleteItems: transition. deleteItems, insertItems: mappedInsertEntries ( context: context, nodeInteraction: nodeInteraction, location: location, isPremium: isPremium, filterData: filterData, chatListFilters: chatListFilters, mode: mode, isPeerEnabled: isPeerEnabled, entries: transition. insertEntries, presentationData: presentationData) , updateItems: mappedUpdateEntries ( context: context, nodeInteraction: nodeInteraction, location: location, isPremium: isPremium, filterData: filterData, chatListFilters: chatListFilters, mode: mode, isPeerEnabled: isPeerEnabled, entries: transition. updateEntries, presentationData: presentationData) , options: transition. options, scrollToItem: transition. scrollToItem, stationaryItemRange: transition. stationaryItemRange, adjustScrollToFirstItem: transition. adjustScrollToFirstItem, animateCrossfade: transition. animateCrossfade, locationGeneration : locationGeneration )
11771179}
11781180
11791181private final class ChatListOpaqueTransactionState {
@@ -1300,16 +1302,9 @@ public final class ChatListNode: ListViewImpl {
13001302
13011303 private var currentLocation : ChatListNodeLocation ?
13021304 private var chatListLocationGeneration : Int = 0
1303- /// Gates `displayedItemRangeChanged` — pagination, history preload and story-peer refresh.
1304- ///
1305- /// Defaults to true. `ChatListContainerNode` turns it off on the tab being switched away from
1306- /// and back on for the one becoming current, which is the folder-duplication fix; but not every
1307- /// `ChatListNode` lives in that container. `PeerSelectionControllerNode` (Forward to…) and
1308- /// `ContactMultiselectionControllerNode` (add members) build one directly and never call
1309- /// `reconcileLocationOnTabActivation`, so defaulting to false left those lists stuck on their
1310- /// first window — scrolling down simply ran out of chats. True is also what every list did
1311- /// before the gate existed, so this only ever narrows behaviour relative to that.
1312- var isActiveForFolderPagination : Bool = true
1305+ /// Defaults to false. Only the visible folder tab (or standalone lists that opt in) may paginate;
1306+ /// adjacent preloaded tabs must stay false or background pagination corrupts their item state.
1307+ var isActiveForFolderPagination : Bool = false
13131308 public private( set) var chatListFilter : ChatListFilter ? {
13141309 didSet {
13151310 self . chatListFilterValue. set ( . single( self . chatListFilter) )
@@ -2735,7 +2730,7 @@ public final class ChatListNode: ListViewImpl {
27352730 let presentationData = state. presentationData
27362731
27372732 return preparedChatListNodeViewTransition ( from: previousView, to: processedView, reason: reason, previewing: previewing, disableAnimations: disableAnimations, scrollPosition: updatedScrollPosition, searchMode: searchMode, forceAllUpdated: forceAllUpdated)
2738- |> map ( { mappedChatListNodeViewListTransition ( context: context, nodeInteraction: nodeInteraction, location: location, isPremium: accountIsPremium, filterData: filterData, chatListFilters: chatListFilters, mode: mode, isPeerEnabled: isPeerEnabled, presentationData: presentationData, transition: $0) } )
2733+ |> map ( { mappedChatListNodeViewListTransition ( context: context, nodeInteraction: nodeInteraction, location: location, isPremium: accountIsPremium, filterData: filterData, chatListFilters: chatListFilters, mode: mode, isPeerEnabled: isPeerEnabled, presentationData: presentationData, transition: $0, locationGeneration : locationGeneration ) } )
27392734 |> runOn ( prepareOnMainQueue ? Queue . mainQueue ( ) : viewProcessingQueue)
27402735 }
27412736
@@ -3427,6 +3422,11 @@ public final class ChatListNode: ListViewImpl {
34273422 if let ( transition, completion) = self . enqueuedTransition {
34283423 self . enqueuedTransition = nil
34293424
3425+ guard transition. locationGeneration == self . chatListLocationGeneration, self . isActiveForFolderPagination else {
3426+ completion ( )
3427+ return
3428+ }
3429+
34303430 let completion : ( ListViewDisplayedItemRange ) -> Void = { [ weak self] visibleRange in
34313431 if let strongSelf = self {
34323432 strongSelf. chatListView = transition. chatListView
@@ -3825,6 +3825,13 @@ public final class ChatListNode: ListViewImpl {
38253825 }
38263826 }
38273827
3828+ func deactivateFolderPagination( ) {
3829+ self . isActiveForFolderPagination = false
3830+ if case . navigation = self . currentLocation {
3831+ self . setChatListLocation ( . initial( count: 50 , filter: self . chatListFilter) )
3832+ }
3833+ }
3834+
38283835 func reconcileLocationOnTabActivation( ) {
38293836 self . isActiveForFolderPagination = true
38303837 if case . navigation = self . currentLocation {
0 commit comments