Various improvements

This commit is contained in:
Isaac
2025-09-26 19:44:40 +08:00
parent 73b67e9a4e
commit d5d4bad649
20 changed files with 2491 additions and 146 deletions

View File

@@ -1340,9 +1340,8 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
self.titleTopicsAccessoryPanelNode = nil
}
var defaultLeftPanelWidth: CGFloat = 72.0
defaultLeftPanelWidth += layout.safeInsets.left
let leftPanelLeftInset = defaultLeftPanelWidth - 72.0
let defaultLeftPanelWidth: CGFloat = 72.0 + 8.0
let leftPanelLeftInset = defaultLeftPanelWidth - (72.0 + 8.0)
var leftPanelSize: CGSize?
var dismissedLeftPanel: (component: AnyComponentWithIdentity<ChatSidePanelEnvironment>, view: ComponentView<ChatSidePanelEnvironment>)?
@@ -1356,7 +1355,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
self.leftPanel = (leftPanelComponent, leftPanel.view)
}
leftPanelSize = CGSize(width: defaultLeftPanelWidth, height: layout.size.height)
leftPanelSize = CGSize(width: defaultLeftPanelWidth + 8.0, height: layout.size.height)
} else if let leftPanel = self.leftPanel {
dismissedLeftPanel = leftPanel
self.leftPanel = nil
@@ -1378,7 +1377,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
titleAccessoryPanelNode.clipsToBounds = true
}
let layoutResult = titleAccessoryPanelNode.updateLayout(width: layout.size.width, leftInset: leftPanelSize?.width ?? layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: immediatelyLayoutTitleAccessoryPanelNodeAndAnimateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState)
let layoutResult = titleAccessoryPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: immediatelyLayoutTitleAccessoryPanelNodeAndAnimateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState)
titleAccessoryPanelHeight = layoutResult.insetHeight
titleAccessoryPanelBackgroundHeight = layoutResult.backgroundHeight
titleAccessoryPanelHitTestSlop = layoutResult.hitTestSlop
@@ -1432,7 +1431,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
translationPanelNode.clipsToBounds = true
}
let height = translationPanelNode.updateLayout(width: layout.size.width, leftInset: leftPanelSize?.width ?? layout.safeInsets.left, rightInset: layout.safeInsets.right, leftDisplayInset: leftPanelSize?.width ?? 0.0, transition: immediatelyLayoutTitleAccessoryPanelNodeAndAnimateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState)
let height = translationPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, leftDisplayInset: 0.0, transition: immediatelyLayoutTitleAccessoryPanelNodeAndAnimateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState)
translationPanelHeight = height
if immediatelyLayoutTranslationPanelNodeAndAnimateAppearance {
translationPanelNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
@@ -1496,7 +1495,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
self.titleAccessoryPanelContainer.addSubnode(adPanelNode)
}
let height = adPanelNode.updateLayout(width: layout.size.width, leftInset: leftPanelSize?.width ?? layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition, interfaceState: self.chatPresentationInterfaceState)
let height = adPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition, interfaceState: self.chatPresentationInterfaceState)
if let adMessage = self.chatPresentationInterfaceState.adMessage, let opaqueId = adMessage.adAttribute?.opaqueId {
self.historyNode.markAdAsSeen(opaqueId: opaqueId)
}
@@ -1545,7 +1544,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
self.titleAccessoryPanelContainer.addSubnode(feePanelNode)
}
let height = feePanelNode.updateLayout(width: layout.size.width, leftInset: leftPanelSize?.width ?? layout.safeInsets.left, rightInset: layout.safeInsets.right, leftDisplayInset: leftPanelSize?.width ?? 0.0, transition: animateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState)
let height = feePanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, leftDisplayInset: 0.0, transition: animateAppearance ? .immediate : transition, interfaceState: self.chatPresentationInterfaceState)
feePanelHeight = height
if transition.isAnimated && animateAppearance {
@@ -1848,8 +1847,6 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
var titlePanelsContentOffset: CGFloat = 0.0
let sidePanelTopInset: CGFloat = insets.top
var titleTopicsAccessoryPanelFrame: CGRect?
if let _ = self.titleTopicsAccessoryPanelNode, let panelHeight = titleTopicsAccessoryPanelHeight {
titleTopicsAccessoryPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: titlePanelsContentOffset), size: CGSize(width: layout.size.width, height: panelHeight))
@@ -1897,15 +1894,10 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
insets.top += panelHeight
extraNavigationBarHeight += panelHeight
}
var extraNavigationBarLeftCutout: CGSize?
if let leftPanelSize {
extraNavigationBarLeftCutout = CGSize(width: leftPanelSize.width, height: navigationBarHeight)
} else {
extraNavigationBarLeftCutout = CGSize(width: 0.0, height: navigationBarHeight)
}
updateExtraNavigationBarBackgroundHeight(extraNavigationBarHeight, extraNavigationBarHitTestSlop, extraNavigationBarLeftCutout, transition)
updateExtraNavigationBarBackgroundHeight(extraNavigationBarHeight, extraNavigationBarHitTestSlop, nil, transition)
let sidePanelTopInset: CGFloat = insets.top
let contentBounds = CGRect(x: 0.0, y: 0.0, width: layout.size.width - wrappingInsets.left - wrappingInsets.right, height: layout.size.height - wrappingInsets.top - wrappingInsets.bottom)
@@ -2543,31 +2535,22 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
ChatSidePanelEnvironment(insets: UIEdgeInsets(
top: 0.0,
left: leftPanelLeftInset,
bottom: containerInsets.bottom + inputPanelsHeight,
bottom: containerInsets.bottom + inputPanelsHeight + 8.0,
right: 0.0
))
},
containerSize: CGSize(width: leftPanelSize.width, height: leftPanelSize.height - sidePanelTopInset)
containerSize: CGSize(width: defaultLeftPanelWidth, height: leftPanelSize.height - sidePanelTopInset)
)
let leftPanelFrame = CGRect(origin: CGPoint(x: 0.0, y: sidePanelTopInset), size: leftPanelSize)
let leftPanelFrame = CGRect(origin: CGPoint(x: layout.safeInsets.left, y: sidePanelTopInset), size: leftPanelSize)
if let leftPanelView = leftPanel.view.view {
if leftPanelView.superview == nil {
self.leftPanelContainer.view.addSubview(leftPanelView)
}
if immediatelyLayoutLeftPanelNodeAndAnimateAppearance {
leftPanelView.frame = leftPanelFrame.offsetBy(dx: -leftPanelSize.width, dy: 0.0)
if self.titleTopicsAccessoryPanelNode != nil || dismissedTitleTopicsAccessoryPanelNode != nil {
if let leftPanelView = leftPanelView as? ChatSideTopicsPanel.View {
leftPanelView.updateGlobalOffset(globalOffset: -leftPanelSize.width, transition: ComponentTransition(transition))
}
}
leftPanelView.frame = leftPanelFrame.offsetBy(dx: -leftPanelSize.width - 16.0, dy: 0.0)
}
transition.updateFrame(view: leftPanelView, frame: leftPanelFrame)
if let leftPanelView = leftPanelView as? ChatSideTopicsPanel.View {
leftPanelView.updateGlobalOffset(globalOffset: 0.0, transition: ComponentTransition(transition))
}
}
}
if let dismissedLeftPanel, let dismissedLeftPanelView = dismissedLeftPanel.view.view {
@@ -2584,14 +2567,9 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
},
containerSize: CGSize(width: defaultLeftPanelWidth, height: layout.size.height - sidePanelTopInset - (containerInsets.bottom + inputPanelsHeight))
)
transition.updateFrame(view: dismissedLeftPanelView, frame: CGRect(origin: CGPoint(x: -dismissedLeftPanelSize.width, y: sidePanelTopInset), size: dismissedLeftPanelSize), completion: { [weak dismissedLeftPanelView] _ in
transition.updateFrame(view: dismissedLeftPanelView, frame: CGRect(origin: CGPoint(x: -layout.safeInsets.left - dismissedLeftPanelSize.width - 16.0, y: sidePanelTopInset), size: dismissedLeftPanelSize), completion: { [weak dismissedLeftPanelView] _ in
dismissedLeftPanelView?.removeFromSuperview()
})
if let dismissedLeftPanelView = dismissedLeftPanelView as? ChatSideTopicsPanel.View {
if self.titleTopicsAccessoryPanelNode != nil {
dismissedLeftPanelView.updateGlobalOffset(globalOffset: -dismissedLeftPanelSize.width, transition: ComponentTransition(transition))
}
}
}
if let navigationBarBackgroundContent = self.navigationBarBackgroundContent {
@@ -2612,12 +2590,8 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
if let titleTopicsAccessoryPanelNode = self.titleTopicsAccessoryPanelNode, let titleTopicsAccessoryPanelFrame, (immediatelyLayoutTitleTopicsAccessoryPanelNodeAndAnimateAppearance || !titleTopicsAccessoryPanelNode.frame.equalTo(titleTopicsAccessoryPanelFrame)) {
if immediatelyLayoutTitleTopicsAccessoryPanelNodeAndAnimateAppearance {
titleTopicsAccessoryPanelNode.frame = titleTopicsAccessoryPanelFrame.offsetBy(dx: 0.0, dy: -titleTopicsAccessoryPanelFrame.height)
if self.leftPanel != nil || dismissedLeftPanel != nil {
titleTopicsAccessoryPanelNode.updateGlobalOffset(globalOffset: -titleTopicsAccessoryPanelFrame.height, transition: .immediate)
}
ComponentTransition(transition).setFrame(view: titleTopicsAccessoryPanelNode.view, frame: titleTopicsAccessoryPanelFrame)
titleTopicsAccessoryPanelNode.updateGlobalOffset(globalOffset: 0.0, transition: ComponentTransition(transition))
} else {
let previousFrame = titleTopicsAccessoryPanelNode.frame
titleTopicsAccessoryPanelNode.frame = titleTopicsAccessoryPanelFrame
@@ -2759,9 +2733,6 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
transition.updateFrame(node: dismissedTitleTopicsAccessoryPanelNode, frame: dismissedTopPanelFrame, completion: { [weak dismissedTitleTopicsAccessoryPanelNode] _ in
dismissedTitleTopicsAccessoryPanelNode?.removeFromSupernode()
})
if self.leftPanel != nil {
dismissedTitleTopicsAccessoryPanelNode.updateGlobalOffset(globalOffset: -dismissedTopPanelFrame.height, transition: ComponentTransition(transition))
}
}
if let dismissedTitleAccessoryPanelNode {