Various improvements [skip ci]

This commit is contained in:
Ilya Laktyushin
2025-02-12 22:15:02 +04:00
parent 8c523ec741
commit 2f2a27f0d2
130 changed files with 5126 additions and 1700 deletions

View File

@@ -205,6 +205,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
private var chatImportStatusPanel: ChatImportStatusPanel?
private(set) var adPanelNode: ChatAdPanelNode?
private(set) var feePanelNode: ChatFeePanelNode?
private let titleAccessoryPanelContainer: ChatControllerTitlePanelNodeContainer
private var titleAccessoryPanelNode: ChatTitleAccessoryPanelNode?
@@ -1470,8 +1471,6 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
dismissedAdPanelNode = self.adPanelNode
self.adPanelNode = adPanelNode
self.titleAccessoryPanelContainer.addSubnode(adPanelNode)
adPanelNode.clipsToBounds = true
}
let height = adPanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition, interfaceState: self.chatPresentationInterfaceState)
@@ -1490,6 +1489,46 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
self.adPanelNode = nil
}
var dismissedFeePanelNode: ChatFeePanelNode?
var feePanelHeight: CGFloat?
var displayFeePanel = false
if let user = self.chatPresentationInterfaceState.renderedPeer?.peer as? TelegramUser, user.botInfo == nil, let chatHistoryState = self.chatPresentationInterfaceState.chatHistoryState, case .loaded(false, _) = chatHistoryState {
if !self.chatPresentationInterfaceState.peerIsBlocked, let paidMessageStars = self.chatPresentationInterfaceState.contactStatus?.peerStatusSettings?.paidMessageStars, paidMessageStars.value > 0 {
displayFeePanel = true
}
}
if displayFeePanel {
var animateAppearance = false
let feePanelNode: ChatFeePanelNode
if let current = self.feePanelNode {
feePanelNode = current
} else {
feePanelNode = ChatFeePanelNode(context: self.context)
feePanelNode.controllerInteraction = self.controllerInteraction
feePanelNode.clipsToBounds = true
animateAppearance = true
}
if self.feePanelNode != feePanelNode {
dismissedFeePanelNode = self.feePanelNode
self.feePanelNode = feePanelNode
self.titleAccessoryPanelContainer.addSubnode(feePanelNode)
}
let height = feePanelNode.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, transition: transition, interfaceState: self.chatPresentationInterfaceState)
feePanelHeight = height
if transition.isAnimated && animateAppearance {
feePanelNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
feePanelNode.subnodeTransform = CATransform3DMakeTranslation(0.0, -height, 0.0)
transition.updateSublayerTransformOffset(layer: feePanelNode.layer, offset: CGPoint())
}
} else if let feePanelNode = self.feePanelNode {
dismissedFeePanelNode = feePanelNode
self.feePanelNode = nil
}
var inputPanelNodeBaseHeight: CGFloat = 0.0
if let inputPanelNode = self.inputPanelNode {
inputPanelNodeBaseHeight += inputPanelNode.minimalHeight(interfaceState: self.chatPresentationInterfaceState, metrics: layout.metrics)
@@ -1801,6 +1840,13 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
insets.top += panelHeight
extraNavigationBarHeight += panelHeight
}
var feePanelFrame: CGRect?
if let _ = self.feePanelNode, let panelHeight = feePanelHeight {
feePanelFrame = CGRect(origin: CGPoint(x: 0.0, y: extraNavigationBarHeight), size: CGSize(width: layout.size.width, height: panelHeight))
insets.top += panelHeight
extraNavigationBarHeight += panelHeight
}
updateExtraNavigationBarBackgroundHeight(extraNavigationBarHeight, extraNavigationBarHitTestSlop, extraTransition)
@@ -2253,6 +2299,10 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
adPanelNode.frame = adPanelFrame
}
if let feePanelNode = self.feePanelNode, let feePanelFrame, !feePanelNode.frame.equalTo(feePanelFrame) {
feePanelNode.frame = feePanelFrame
}
if let secondaryInputPanelNode = self.secondaryInputPanelNode, let apparentSecondaryInputPanelFrame = apparentSecondaryInputPanelFrame, !secondaryInputPanelNode.frame.equalTo(apparentSecondaryInputPanelFrame) {
if immediatelyLayoutSecondaryInputPanelAndAnimateAppearance {
secondaryInputPanelNode.frame = apparentSecondaryInputPanelFrame.offsetBy(dx: 0.0, dy: apparentSecondaryInputPanelFrame.height + previousInputPanelBackgroundFrame.maxY - apparentSecondaryInputPanelFrame.maxY)
@@ -2378,6 +2428,15 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
})
}
if let dismissedFeePanelNode {
var dismissedPanelFrame = dismissedFeePanelNode.frame
dismissedPanelFrame.origin.y = -dismissedPanelFrame.size.height
transition.updateAlpha(node: dismissedFeePanelNode, alpha: 0.0)
transition.updateFrame(node: dismissedFeePanelNode, frame: dismissedPanelFrame, completion: { [weak dismissedFeePanelNode] _ in
dismissedFeePanelNode?.removeFromSupernode()
})
}
if let inputPanelNode = self.inputPanelNode, let apparentInputPanelFrame = apparentInputPanelFrame, !inputPanelNode.frame.equalTo(apparentInputPanelFrame) {
if immediatelyLayoutInputPanelAndAnimateAppearance {
inputPanelNode.frame = apparentInputPanelFrame.offsetBy(dx: 0.0, dy: apparentInputPanelFrame.height + previousInputPanelBackgroundFrame.maxY - apparentInputBackgroundFrame.maxY)
@@ -4156,6 +4215,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
if !entities.isEmpty {
attributes.append(TextEntitiesMessageAttribute(entities: entities))
}
var webpage: TelegramMediaWebpage?
if let urlPreview = self.chatPresentationInterfaceState.urlPreview {
if self.chatPresentationInterfaceState.interfaceState.composeDisableUrlPreviews.contains(urlPreview.url) {
@@ -4232,7 +4292,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
messages.append(.forward(source: id, threadId: replyThreadId, grouping: .auto, attributes: attributes, correlationId: nil))
}
}
var usedCorrelationId: Int64?
if !messages.isEmpty, case .message = messages[messages.count - 1] {