@@ -165,6 +165,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
165165 previousItemNode. listNode. updatePeerGrouping = nil
166166 previousItemNode. listNode. contentOffsetChanged = nil
167167 previousItemNode. listNode. contentScrollingEnded = nil
168+ previousItemNode. listNode. pinnedHeaderDisplayFractionUpdated = nil
168169 previousItemNode. listNode. didBeginInteractiveDragging = nil
169170 previousItemNode. listNode. endedInteractiveDragging = { _ in }
170171 previousItemNode. listNode. shouldStopScrolling = nil
@@ -327,11 +328,12 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
327328 }
328329
329330 return self . contentScrollingEnded ? ( listView) ?? false
330- //DispatchQueue.main.async { [weak self] in
331- // let _ = self?.contentScrollingEnded?(listView)
332- //}
333-
334- //return false
331+ }
332+ itemNode. listNode. pinnedHeaderDisplayFractionUpdated = { [ weak self] transition in
333+ guard let self else {
334+ return
335+ }
336+ self . pinnedHeaderDisplayFractionUpdated ? ( transition)
335337 }
336338 itemNode. listNode. activateChatPreview = { [ weak self] item, threadId, sourceNode, gesture, location in
337339 self ? . activateChatPreview ? ( item, threadId, sourceNode, gesture, location)
@@ -427,6 +429,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
427429 var contentOffset : ListViewVisibleContentOffset ?
428430 public var contentOffsetChanged : ( ( ListViewVisibleContentOffset , ListView ) -> Void ) ?
429431 public var contentScrollingEnded : ( ( ListView ) -> Bool ) ?
432+ public var pinnedHeaderDisplayFractionUpdated : ( ( ContainedViewLayoutTransition ) -> Void ) ?
430433 var didBeginInteractiveDragging : ( ( ListView ) -> Void ) ?
431434 var endedInteractiveDragging : ( ( ListView ) -> Void ) ?
432435 var shouldStopScrolling : ( ( ListView , CGFloat ) -> Bool ) ?
@@ -443,6 +446,34 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
443446 var canExpandHiddenItems : ( ( ) -> Bool ) ?
444447 public var displayFilterLimit : ( ( ) -> Void ) ?
445448
449+ public var pinnedHeaderDisplayFraction : CGFloat {
450+ guard let currentItemNodeValue = self . currentItemNodeValue else {
451+ return 0.0
452+ }
453+ if self . transitionFraction != 0.0 {
454+ var nextItemNode : ChatListContainerItemNode ?
455+ if let selectedIndex = self . availableFilters. firstIndex ( where: { $0. id == self . selectedId } ) {
456+ if self . transitionFraction < 0.0 {
457+ if selectedIndex + 1 < self . availableFilters. count {
458+ nextItemNode = self . itemNodes [ self . availableFilters [ selectedIndex + 1 ] . id]
459+ }
460+ } else {
461+ if selectedIndex > 0 {
462+ nextItemNode = self . itemNodes [ self . availableFilters [ selectedIndex - 1 ] . id]
463+ }
464+ }
465+ }
466+
467+ if let nextItemNode {
468+ let absTransitionFraction = abs ( self . transitionFraction)
469+ return ( 1.0 - absTransitionFraction) * currentItemNodeValue. listNode. pinnedScrollFraction + absTransitionFraction * nextItemNode. listNode. pinnedScrollFraction
470+ } else {
471+ return currentItemNodeValue. listNode. pinnedScrollFraction
472+ }
473+ }
474+ return currentItemNodeValue. listNode. pinnedScrollFraction
475+ }
476+
446477 public init (
447478 context: AccountContext ,
448479 controller: ChatListControllerImpl ? ,
@@ -584,6 +615,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
584615 self . update ( layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: . immediate)
585616 self . isSwitchingCurrentItemFilterByDragging = true
586617 self . currentItemFilterUpdated ? ( self . currentItemFilter, self . transitionFraction, . immediate, true )
618+ self . pinnedHeaderDisplayFractionUpdated ? ( . immediate)
587619 }
588620 }
589621 }
@@ -661,6 +693,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
661693 self . update ( layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: . immediate)
662694 self . isSwitchingCurrentItemFilterByDragging = true
663695 self . currentItemFilterUpdated ? ( self . currentItemFilter, self . transitionFraction, transition, false )
696+ self . pinnedHeaderDisplayFractionUpdated ? ( transition)
664697 }
665698 case . cancelled, . ended:
666699 if let ( layout, navigationBarHeight, visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight, insets, isReorderingFilters, isEditing, inlineNavigationLocation, inlineNavigationTransitionFraction, storiesInset) = self . validLayout, let selectedIndex = self . availableFilters. firstIndex ( where: { $0. id == self . selectedId } ) {
@@ -723,6 +756,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
723756 }
724757 self . isSwitchingCurrentItemFilterByDragging = false
725758 self . currentItemFilterUpdated ? ( self . currentItemFilter, self . transitionFraction, transition, false )
759+ self . pinnedHeaderDisplayFractionUpdated ? ( transition)
726760 }
727761 default :
728762 break
@@ -843,6 +877,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
843877 let transition : ContainedViewLayoutTransition = . animated( duration: 0.35 , curve: . spring)
844878 self . update ( layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: transition)
845879 self . currentItemFilterUpdated ? ( self . currentItemFilter, self . transitionFraction, transition, false )
880+ self . pinnedHeaderDisplayFractionUpdated ? ( transition)
846881 itemNode. emptyNode? . restartAnimation ( )
847882 completion ? ( )
848883 } else if self . pendingItemNode == nil {
@@ -889,6 +924,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
889924 strongSelf. selectedId = id
890925 strongSelf. applyItemNodeAsCurrent ( id: id, itemNode: itemNode)
891926 strongSelf. currentItemFilterUpdated ? ( strongSelf. currentItemFilter, strongSelf. transitionFraction, . immediate, false )
927+ strongSelf. pinnedHeaderDisplayFractionUpdated ? ( . immediate)
892928
893929 completion ? ( )
894930 return
@@ -945,6 +981,7 @@ public final class ChatListContainerNode: ASDisplayNode, ASGestureRecognizerDele
945981 strongSelf. update ( layout: layout, navigationBarHeight: navigationBarHeight, visualNavigationHeight: visualNavigationHeight, originalNavigationHeight: originalNavigationHeight, cleanNavigationBarHeight: cleanNavigationBarHeight, insets: insets, isReorderingFilters: isReorderingFilters, isEditing: isEditing, inlineNavigationLocation: inlineNavigationLocation, inlineNavigationTransitionFraction: inlineNavigationTransitionFraction, storiesInset: storiesInset, transition: . immediate)
946982
947983 strongSelf. currentItemFilterUpdated ? ( strongSelf. currentItemFilter, strongSelf. transitionFraction, transition, false )
984+ strongSelf. pinnedHeaderDisplayFractionUpdated ? ( transition)
948985 }
949986
950987 completion ? ( )
@@ -1177,6 +1214,9 @@ final class ChatListControllerNode: ASDisplayNode, ASGestureRecognizerDelegate {
11771214 self . mainContainerNode. contentScrollingEnded = { [ weak self] listView in
11781215 return self ? . contentScrollingEnded ( listView: listView, isPrimary: true ) ?? false
11791216 }
1217+ self . mainContainerNode. pinnedHeaderDisplayFractionUpdated = { [ weak self] transition in
1218+ self ? . pinnedHeaderDisplayFractionUpdated ( transition: transition)
1219+ }
11801220 self . mainContainerNode. didBeginInteractiveDragging = { [ weak self] listView in
11811221 self ? . didBeginInteractiveDragging ( listView: listView, isPrimary: true )
11821222 }
@@ -2172,6 +2212,19 @@ final class ChatListControllerNode: ASDisplayNode, ASGestureRecognizerDelegate {
21722212 return false
21732213 }
21742214
2215+ private func pinnedHeaderDisplayFractionUpdated( transition: ContainedViewLayoutTransition ) {
2216+ var pinnedFraction : CGFloat = 0.0
2217+ if let inlineStackContainerNode = self . inlineStackContainerNode, self . inlineStackContainerTransitionFraction != 0.0 {
2218+ pinnedFraction = ( 1.0 - self . inlineStackContainerTransitionFraction) * self . mainContainerNode. pinnedHeaderDisplayFraction + self . inlineStackContainerTransitionFraction * inlineStackContainerNode. pinnedHeaderDisplayFraction
2219+ } else {
2220+ pinnedFraction = self . mainContainerNode. pinnedHeaderDisplayFraction
2221+ }
2222+
2223+ if let navigationBarComponentView = self . navigationBarView. view as? ChatListNavigationBar . View {
2224+ navigationBarComponentView. updateEdgeEffectForPinnedFraction ( pinnedFraction: pinnedFraction, transition: ComponentTransition ( transition) )
2225+ }
2226+ }
2227+
21752228 func makeInlineChatList( location: ChatListControllerLocation ) -> ChatListContainerNode {
21762229 var forumPeerId : EnginePeer . Id ?
21772230 if case let . forum( peerId) = location {
@@ -2220,6 +2273,9 @@ final class ChatListControllerNode: ASDisplayNode, ASGestureRecognizerDelegate {
22202273 inlineStackContainerNode. contentScrollingEnded = { [ weak self] listView in
22212274 return self ? . contentScrollingEnded ( listView: listView, isPrimary: false ) ?? false
22222275 }
2276+ inlineStackContainerNode. pinnedHeaderDisplayFractionUpdated = { [ weak self] transition in
2277+ self ? . pinnedHeaderDisplayFractionUpdated ( transition: transition)
2278+ }
22232279
22242280 inlineStackContainerNode. activateChatPreview = self . mainContainerNode. activateChatPreview
22252281 inlineStackContainerNode. openStories = self . mainContainerNode. openStories
0 commit comments