diff --git a/submodules/AccountContext/Sources/PeerSelectionController.swift b/submodules/AccountContext/Sources/PeerSelectionController.swift index e4f30c083b..8ffe045cfb 100644 --- a/submodules/AccountContext/Sources/PeerSelectionController.swift +++ b/submodules/AccountContext/Sources/PeerSelectionController.swift @@ -1,7 +1,8 @@ import Foundation import Display -import Postbox import SwiftSignalKit +import Postbox +import TelegramCore public struct ChatListNodePeersFilter: OptionSet { public var rawValue: Int32 @@ -40,9 +41,9 @@ public final class PeerSelectionControllerParams { public let createNewGroup: (() -> Void)? public let pretendPresentedInModal: Bool public let multipleSelection: Bool - public let forwardedMessagesCount: Int + public let forwardedMessageIds: [EngineMessage.Id] - public init(context: AccountContext, filter: ChatListNodePeersFilter = [.onlyWriteable], hasChatListSelector: Bool = true, hasContactSelector: Bool = true, hasGlobalSearch: Bool = true, title: String? = nil, attemptSelection: ((Peer) -> Void)? = nil, createNewGroup: (() -> Void)? = nil, pretendPresentedInModal: Bool = false, multipleSelection: Bool = false, forwardedMessagesCount: Int = 0) { + public init(context: AccountContext, filter: ChatListNodePeersFilter = [.onlyWriteable], hasChatListSelector: Bool = true, hasContactSelector: Bool = true, hasGlobalSearch: Bool = true, title: String? = nil, attemptSelection: ((Peer) -> Void)? = nil, createNewGroup: (() -> Void)? = nil, pretendPresentedInModal: Bool = false, multipleSelection: Bool = false, forwardedMessageIds: [EngineMessage.Id] = []) { self.context = context self.filter = filter self.hasChatListSelector = hasChatListSelector @@ -53,7 +54,7 @@ public final class PeerSelectionControllerParams { self.createNewGroup = createNewGroup self.pretendPresentedInModal = pretendPresentedInModal self.multipleSelection = multipleSelection - self.forwardedMessagesCount = forwardedMessagesCount + self.forwardedMessageIds = forwardedMessageIds } } @@ -65,7 +66,7 @@ public enum PeerSelectionControllerSendMode { public protocol PeerSelectionController: ViewController { var peerSelected: ((Peer) -> Void)? { get set } - var multiplePeersSelected: (([Peer], [PeerId: Peer], NSAttributedString, PeerSelectionControllerSendMode) -> Void)? { get set } + var multiplePeersSelected: (([Peer], [PeerId: Peer], NSAttributedString, PeerSelectionControllerSendMode, Bool) -> Void)? { get set } var inProgress: Bool { get set } var customDismiss: (() -> Void)? { get set } } diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index 5224869b22..3929232285 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -891,12 +891,12 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo }).start() let peerSelectionController = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, filter: [.onlyWriteable, .excludeDisabled], multipleSelection: true)) - peerSelectionController.multiplePeersSelected = { [weak self, weak peerSelectionController] peers, peerMap, messageText, mode in + peerSelectionController.multiplePeersSelected = { [weak self, weak peerSelectionController] peers, peerMap, messageText, mode, hideSendersNames in guard let strongSelf = self, let strongController = peerSelectionController else { return } strongController.dismiss() - + var result: [EnqueueMessage] = [] if messageText.string.count > 0 { let inputText = convertMarkdownToAttributes(messageText) @@ -912,8 +912,13 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo } } + var attributes: [MessageAttribute] = [] + if hideSendersNames { + attributes.append(ForwardHideSendersNamesMessageAttribute()) + } + result.append(contentsOf: messageIds.map { messageId -> EnqueueMessage in - return .forward(source: messageId, grouping: .auto, attributes: [], correlationId: nil) + return .forward(source: messageId, grouping: .auto, attributes: attributes, correlationId: nil) }) var displayPeers: [Peer] = [] diff --git a/submodules/StickerResources/Sources/StickerResources.swift b/submodules/StickerResources/Sources/StickerResources.swift index 3703f2a8c2..3a7710be48 100644 --- a/submodules/StickerResources/Sources/StickerResources.swift +++ b/submodules/StickerResources/Sources/StickerResources.swift @@ -373,6 +373,8 @@ public func chatMessageStickerPackThumbnail(postbox: Postbox, resource: MediaRes } } + addCorners(context, arguments: arguments) + return context } } diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 05118bb23c..ae1dba8923 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -11033,7 +11033,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var attemptSelectionImpl: ((Peer) -> Void)? let controller = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, filter: filter, attemptSelection: { peer in attemptSelectionImpl?(peer) - }, multipleSelection: true, forwardedMessagesCount: messages.count)) + }, multipleSelection: true, forwardedMessageIds: messages.map { $0.id })) let context = self.context attemptSelectionImpl = { [weak controller] peer in guard let controller = controller else { @@ -11048,7 +11048,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } controller.present(textAlertController(context: context, title: nil, text: presentationData.strings.Forward_ErrorDisabledForChat, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root)) } - controller.multiplePeersSelected = { [weak self, weak controller] peers, peerMap, messageText, mode in + controller.multiplePeersSelected = { [weak self, weak controller] peers, peerMap, messageText, mode, hideSendersNames in guard let strongSelf = self, let strongController = controller else { return } @@ -11069,8 +11069,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } + var attributes: [MessageAttribute] = [] + if hideSendersNames { + attributes.append(ForwardHideSendersNamesMessageAttribute()) + } + result.append(contentsOf: messages.map { message -> EnqueueMessage in - return .forward(source: message.id, grouping: .auto, attributes: [], correlationId: nil) + return .forward(source: message.id, grouping: .auto, attributes: attributes, correlationId: nil) }) let commit: ([EnqueueMessage]) -> Void = { result in diff --git a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift index 385e59d3b8..1bd87f3af8 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift @@ -549,7 +549,7 @@ final class ChatMediaInputNode: ChatInputNode { self.listView.useSingleDimensionTouchPoint = true self.listView.reorderedItemHasShadow = false self.listView.transform = CATransform3DMakeRotation(-CGFloat(Double.pi / 2.0), 0.0, 0.0, 1.0) - self.listView.scroller.panGestureRecognizer.cancelsTouchesInView = false + self.listView.scroller.panGestureRecognizer.cancelsTouchesInView = true self.listView.accessibilityPageScrolledString = { row, count in return strings.VoiceOver_ScrollStatus(row, count).string } @@ -557,7 +557,7 @@ final class ChatMediaInputNode: ChatInputNode { self.gifListView = ListView() self.gifListView.useSingleDimensionTouchPoint = true self.gifListView.transform = CATransform3DMakeRotation(-CGFloat(Double.pi / 2.0), 0.0, 0.0, 1.0) - self.gifListView.scroller.panGestureRecognizer.cancelsTouchesInView = false + self.gifListView.scroller.panGestureRecognizer.cancelsTouchesInView = true self.gifListView.accessibilityPageScrolledString = { row, count in return strings.VoiceOver_ScrollStatus(row, count).string } diff --git a/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift index 86b384ffc4..ce75a0619e 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputStickerPackItem.swift @@ -216,7 +216,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { switch thumbnailItem { case let .still(representation): imageSize = representation.dimensions.cgSize.aspectFitted(boundingImageSize) - let imageApply = self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: boundingImageSize, intrinsicInsets: UIEdgeInsets())) + let imageApply = self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(radius: 6.0), imageSize: imageSize, boundingSize: boundingImageSize, intrinsicInsets: UIEdgeInsets())) imageApply() self.imageNode.setSignal(chatMessageStickerPackThumbnail(postbox: account.postbox, resource: representation.resource, nilIfEmpty: true)) case let .animated(resource, _): @@ -339,7 +339,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { imageSize = representation.dimensions.cgSize.aspectFitted(boundingImageSize) let imageNode = TransformImageNode() - let imageApply = imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: boundingImageSize, intrinsicInsets: UIEdgeInsets())) + let imageApply = imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(radius: 6.0), imageSize: imageSize, boundingSize: boundingImageSize, intrinsicInsets: UIEdgeInsets())) imageApply() imageNode.setSignal(chatMessageStickerPackThumbnail(postbox: account.postbox, resource: representation.resource, nilIfEmpty: true)) scalingNode.addSubnode(imageNode) diff --git a/submodules/TelegramUI/Sources/ChatMediaInputStickerPane.swift b/submodules/TelegramUI/Sources/ChatMediaInputStickerPane.swift index e6d95c017a..fcc255d156 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputStickerPane.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputStickerPane.swift @@ -28,7 +28,10 @@ private func fixGridScrolling(_ gridNode: GridNode) { var scrollIndex: Int? if itemFrame.minY + itemFrame.height * 0.6 < contentInset { for i in 0 ..< gridNode.items.count { - if let _ = gridNode.items[i] as? ChatMediaInputStickerGridItem { + if let _ = gridNode.items[i] as? StickerPaneTrendingListGridItem { + scrollIndex = i + break + } else if let _ = gridNode.items[i] as? ChatMediaInputStickerGridItem { scrollIndex = i break } diff --git a/submodules/TelegramUI/Sources/ForwardAccessoryPanelNode.swift b/submodules/TelegramUI/Sources/ForwardAccessoryPanelNode.swift index 4ff2e49baf..ea26f89429 100644 --- a/submodules/TelegramUI/Sources/ForwardAccessoryPanelNode.swift +++ b/submodules/TelegramUI/Sources/ForwardAccessoryPanelNode.swift @@ -238,14 +238,16 @@ final class ForwardAccessoryPanelNode: AccessoryPanelNode { self.validLayout = (size, interfaceState) let bounds = CGRect(origin: CGPoint(), size: CGSize(width: size.width, height: 45.0)) - let leftInset: CGFloat = 55.0 + let inset: CGFloat = interfaceState.renderedPeer == nil ? 19.0 : 55.0 + let leftInset: CGFloat = inset + let rightInset: CGFloat = inset let textLineInset: CGFloat = 10.0 - let rightInset: CGFloat = 55.0 let textRightInset: CGFloat = 20.0 let closeButtonSize = CGSize(width: 44.0, height: bounds.height) let closeButtonFrame = CGRect(origin: CGPoint(x: bounds.width - rightInset - closeButtonSize.width + 12.0, y: 2.0), size: closeButtonSize) self.closeButton.frame = closeButtonFrame + self.closeButton.isHidden = interfaceState.renderedPeer == nil self.actionArea.frame = CGRect(origin: CGPoint(x: leftInset, y: 2.0), size: CGSize(width: closeButtonFrame.minX - leftInset, height: bounds.height)) @@ -288,7 +290,11 @@ final class ForwardAccessoryPanelNode: AccessoryPanelNode { @objc func tapGesture(_ recognizer: UITapGestureRecognizer) { if case .ended = recognizer.state { - self.closePressed() + if self.closeButton.isHidden { + self.interfaceInteraction?.updateForwardMessageHideSendersNames(!self.hideSendersNames) + } else { + self.closePressed() + } } } } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index b514380694..3fde267518 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -5645,7 +5645,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD func forwardMessages(messageIds: Set?) { if let messageIds = messageIds ?? self.state.selectedMessageIds, !messageIds.isEmpty { let peerSelectionController = self.context.sharedContext.makePeerSelectionController(PeerSelectionControllerParams(context: self.context, filter: [.onlyWriteable, .excludeDisabled], multipleSelection: true)) - peerSelectionController.multiplePeersSelected = { [weak self, weak peerSelectionController] peers, peerMap, messageText, mode in + peerSelectionController.multiplePeersSelected = { [weak self, weak peerSelectionController] peers, peerMap, messageText, mode, hideSendersNames in guard let strongSelf = self, let strongController = peerSelectionController else { return } @@ -5666,8 +5666,13 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD } } + var attributes: [MessageAttribute] = [] + if hideSendersNames { + attributes.append(ForwardHideSendersNamesMessageAttribute()) + } + result.append(contentsOf: messageIds.map { messageId -> EnqueueMessage in - return .forward(source: messageId, grouping: .auto, attributes: [], correlationId: nil) + return .forward(source: messageId, grouping: .auto, attributes: attributes, correlationId: nil) }) var displayPeers: [Peer] = [] diff --git a/submodules/TelegramUI/Sources/PeerSelectionController.swift b/submodules/TelegramUI/Sources/PeerSelectionController.swift index 2873c2ae74..9cc6ab141b 100644 --- a/submodules/TelegramUI/Sources/PeerSelectionController.swift +++ b/submodules/TelegramUI/Sources/PeerSelectionController.swift @@ -19,7 +19,7 @@ public final class PeerSelectionControllerImpl: ViewController, PeerSelectionCon private var customTitle: String? public var peerSelected: ((Peer) -> Void)? - public var multiplePeersSelected: (([Peer], [PeerId: Peer], NSAttributedString, PeerSelectionControllerSendMode) -> Void)? + public var multiplePeersSelected: (([Peer], [PeerId: Peer], NSAttributedString, PeerSelectionControllerSendMode, Bool) -> Void)? private let filter: ChatListNodePeersFilter private let attemptSelection: ((Peer) -> Void)? @@ -58,7 +58,7 @@ public final class PeerSelectionControllerImpl: ViewController, PeerSelectionCon private let hasContactSelector: Bool private let hasGlobalSearch: Bool private let pretendPresentedInModal: Bool - private let forwardedMessagesCount: Int + private let forwardedMessageIds: [EngineMessage.Id] override public var _presentedInModal: Bool { get { @@ -86,7 +86,7 @@ public final class PeerSelectionControllerImpl: ViewController, PeerSelectionCon self.attemptSelection = params.attemptSelection self.createNewGroup = params.createNewGroup self.pretendPresentedInModal = params.pretendPresentedInModal - self.forwardedMessagesCount = params.forwardedMessagesCount + self.forwardedMessageIds = params.forwardedMessageIds super.init(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData)) @@ -150,7 +150,7 @@ public final class PeerSelectionControllerImpl: ViewController, PeerSelectionCon } override public func loadDisplayNode() { - self.displayNode = PeerSelectionControllerNode(context: self.context, filter: self.filter, hasChatListSelector: self.hasChatListSelector, hasContactSelector: self.hasContactSelector, hasGlobalSearch: self.hasGlobalSearch, forwardedMessagesCount: self.forwardedMessagesCount, createNewGroup: self.createNewGroup, present: { [weak self] c, a in + self.displayNode = PeerSelectionControllerNode(context: self.context, filter: self.filter, hasChatListSelector: self.hasChatListSelector, hasContactSelector: self.hasContactSelector, hasGlobalSearch: self.hasGlobalSearch, forwardedMessageIds: self.forwardedMessageIds, createNewGroup: self.createNewGroup, present: { [weak self] c, a in self?.present(c, in: .window(.root), with: a) }, presentInGlobalOverlay: { [weak self] c, a in self?.presentInGlobalOverlay(c, with: a) @@ -160,8 +160,8 @@ public final class PeerSelectionControllerImpl: ViewController, PeerSelectionCon self.peerSelectionNode.navigationBar = self.navigationBar - self.peerSelectionNode.requestSend = { [weak self] peers, peerMap, text, mode in - self?.multiplePeersSelected?(peers, peerMap, text, mode) + self.peerSelectionNode.requestSend = { [weak self] peers, peerMap, text, mode, hideSendersNames in + self?.multiplePeersSelected?(peers, peerMap, text, mode, hideSendersNames) } self.peerSelectionNode.requestDeactivateSearch = { [weak self] in diff --git a/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift b/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift index 358eefd644..68f30d4f3e 100644 --- a/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift +++ b/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift @@ -20,6 +20,7 @@ final class PeerSelectionControllerNode: ASDisplayNode { private let dismiss: () -> Void private let filter: ChatListNodePeersFilter private let hasGlobalSearch: Bool + private let forwardedMessageIds: [EngineMessage.Id] private var presentationInterfaceState: ChatPresentationInterfaceState private var interfaceInteraction: ChatPanelInterfaceInteraction? @@ -37,6 +38,7 @@ final class PeerSelectionControllerNode: ASDisplayNode { private let segmentedControlNode: SegmentedControlNode? private var textInputPanelNode: PeerSelectionTextInputPanelNode? + private var forwardAccessoryPanelNode: ForwardAccessoryPanelNode? var contactListNode: ContactListNode? let chatListNode: ChatListNode @@ -56,7 +58,7 @@ final class PeerSelectionControllerNode: ASDisplayNode { var requestOpenDisabledPeer: ((Peer) -> Void)? var requestOpenPeerFromSearch: ((Peer) -> Void)? var requestOpenMessageFromSearch: ((Peer, MessageId) -> Void)? - var requestSend: (([Peer], [PeerId: Peer], NSAttributedString, PeerSelectionControllerSendMode) -> Void)? + var requestSend: (([Peer], [PeerId: Peer], NSAttributedString, PeerSelectionControllerSendMode, Bool) -> Void)? private var presentationData: PresentationData private var presentationDataDisposable: Disposable? @@ -66,28 +68,21 @@ final class PeerSelectionControllerNode: ASDisplayNode { return self.readyValue.get() } - init(context: AccountContext, filter: ChatListNodePeersFilter, hasChatListSelector: Bool, hasContactSelector: Bool, hasGlobalSearch: Bool, forwardedMessagesCount: Int, createNewGroup: (() -> Void)?, present: @escaping (ViewController, Any?) -> Void, presentInGlobalOverlay: @escaping (ViewController, Any?) -> Void, dismiss: @escaping () -> Void) { + init(context: AccountContext, filter: ChatListNodePeersFilter, hasChatListSelector: Bool, hasContactSelector: Bool, hasGlobalSearch: Bool, forwardedMessageIds: [EngineMessage.Id], createNewGroup: (() -> Void)?, present: @escaping (ViewController, Any?) -> Void, presentInGlobalOverlay: @escaping (ViewController, Any?) -> Void, dismiss: @escaping () -> Void) { self.context = context self.present = present self.presentInGlobalOverlay = presentInGlobalOverlay self.dismiss = dismiss self.filter = filter self.hasGlobalSearch = hasGlobalSearch + self.forwardedMessageIds = forwardedMessageIds let presentationData = context.sharedContext.currentPresentationData.with { $0 } self.presentationData = presentationData self.presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: .builtin(WallpaperSettings()), theme: self.presentationData.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, limitsConfiguration: self.context.currentLimitsConfiguration.with { $0 }, fontSize: self.presentationData.chatFontSize, bubbleCorners: self.presentationData.chatBubbleCorners, accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: .peer(PeerId(0)), subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil) - var mockMessageIds: [MessageId]? - if forwardedMessagesCount > 0 { - var messageIds: [MessageId] = [] - for _ in 0 ..< forwardedMessagesCount { - messageIds.append(MessageId(peerId: PeerId(0), namespace: Namespaces.Message.Local, id: Int32.random(in: 0 ..< Int32.max))) - } - mockMessageIds = messageIds - } - self.presentationInterfaceState = self.presentationInterfaceState.updatedInterfaceState { $0.withUpdatedForwardMessageIds(mockMessageIds) } + self.presentationInterfaceState = self.presentationInterfaceState.updatedInterfaceState { $0.withUpdatedForwardMessageIds(forwardedMessageIds) } if hasChatListSelector && hasContactSelector { self.toolbarBackgroundNode = NavigationBackgroundNode(color: self.presentationData.theme.rootController.navigationBar.blurredBackgroundColor) @@ -198,7 +193,10 @@ final class PeerSelectionControllerNode: ASDisplayNode { }, forwardSelectedMessages: { }, forwardCurrentForwardMessages: { }, forwardMessages: { _ in - }, updateForwardMessageHideSendersNames: { _ in + }, updateForwardMessageHideSendersNames: { [weak self] value in + if let strongSelf = self { + strongSelf.updateChatPresentationInterfaceState(animated: true, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageHideSendersNames(value) }) }) + } }, shareSelectedMessages: { }, updateTextInputStateAndMode: { [weak self] f in if let strongSelf = self { @@ -336,6 +334,11 @@ final class PeerSelectionControllerNode: ASDisplayNode { func beginSelection() { if let _ = self.textInputPanelNode { } else { + let forwardAccessoryPanelNode = ForwardAccessoryPanelNode(context: self.context, messageIds: self.forwardedMessageIds, theme: self.presentationData.theme, strings: self.presentationData.strings, fontSize: self.presentationData.chatFontSize, nameDisplayOrder: self.presentationData.nameDisplayOrder, hideSendersNames: false) + forwardAccessoryPanelNode.interfaceInteraction = self.interfaceInteraction + self.addSubnode(forwardAccessoryPanelNode) + self.forwardAccessoryPanelNode = forwardAccessoryPanelNode + let textInputPanelNode = PeerSelectionTextInputPanelNode(presentationInterfaceState: self.presentationInterfaceState, presentController: { [weak self] c in self?.present(c, nil) }) textInputPanelNode.interfaceInteraction = self.interfaceInteraction textInputPanelNode.sendMessage = { [weak self] mode in @@ -343,10 +346,13 @@ final class PeerSelectionControllerNode: ASDisplayNode { return } + let effectiveInputText = strongSelf.presentationInterfaceState.interfaceState.composeInputState.inputText + let hideSendersNames = strongSelf.presentationInterfaceState.interfaceState.forwardMessageHideSendersNames + if strongSelf.contactListActive { strongSelf.contactListNode?.multipleSelection = true let selectedContactPeers = strongSelf.contactListNode?.selectedPeers ?? [] - let effectiveInputText = strongSelf.presentationInterfaceState.interfaceState.composeInputState.inputText + var selectedPeers: [Peer] = [] var selectedPeerMap: [PeerId: Peer] = [:] for contactPeer in selectedContactPeers { @@ -356,7 +362,7 @@ final class PeerSelectionControllerNode: ASDisplayNode { } } if !selectedPeers.isEmpty { - strongSelf.requestSend?(selectedPeers, selectedPeerMap, effectiveInputText, mode) + strongSelf.requestSend?(selectedPeers, selectedPeerMap, effectiveInputText, mode, hideSendersNames) } } else { var selectedPeerIds: [PeerId] = [] @@ -367,14 +373,13 @@ final class PeerSelectionControllerNode: ASDisplayNode { return state } if !selectedPeerIds.isEmpty { - let effectiveInputText = strongSelf.presentationInterfaceState.interfaceState.composeInputState.inputText var selectedPeers: [Peer] = [] for peerId in selectedPeerIds { if let peer = selectedPeerMap[peerId] { selectedPeers.append(peer) } } - strongSelf.requestSend?(selectedPeers, selectedPeerMap, effectiveInputText, mode) + strongSelf.requestSend?(selectedPeers, selectedPeerMap, effectiveInputText, mode, hideSendersNames) } } } @@ -417,6 +422,12 @@ final class PeerSelectionControllerNode: ASDisplayNode { var toolbarHeight: CGFloat = cleanInsets.bottom var textPanelHeight: CGFloat? + var accessoryHeight: CGFloat = 0.0 + + if let forwardAccessoryPanelNode = self.forwardAccessoryPanelNode { + let size = forwardAccessoryPanelNode.calculateSizeThatFits(CGSize(width: layout.size.width - layout.safeInsets.left - layout.safeInsets.right, height: layout.size.height)) + accessoryHeight = size.height + } if let textInputPanelNode = self.textInputPanelNode { var panelTransition = transition @@ -434,15 +445,30 @@ final class PeerSelectionControllerNode: ASDisplayNode { let panelFrame = CGRect(x: 0.0, y: layout.size.height - panelHeight, width: layout.size.width, height: panelHeight) if textInputPanelNode.frame.width.isZero { var initialPanelFrame = panelFrame - initialPanelFrame.origin.y = layout.size.height + initialPanelFrame.origin.y = layout.size.height + accessoryHeight textInputPanelNode.frame = initialPanelFrame } transition.updateFrame(node: textInputPanelNode, frame: panelFrame) } + if let forwardAccessoryPanelNode = self.forwardAccessoryPanelNode { + let size = forwardAccessoryPanelNode.calculateSizeThatFits(CGSize(width: layout.size.width - layout.safeInsets.left - layout.safeInsets.right, height: layout.size.height)) + forwardAccessoryPanelNode.updateState(size: size, interfaceState: self.presentationInterfaceState) + forwardAccessoryPanelNode.updateThemeAndStrings(theme: self.presentationData.theme, strings: self.presentationData.strings, hideSendersNames: self.presentationInterfaceState.interfaceState.forwardMessageHideSendersNames) + let panelFrame = CGRect(x: layout.safeInsets.left, y: layout.size.height - (textPanelHeight ?? 0.0) - size.height, width: size.width - layout.safeInsets.left - layout.safeInsets.right, height: size.height) + + accessoryHeight = size.height + if forwardAccessoryPanelNode.frame.width.isZero { + var initialPanelFrame = panelFrame + initialPanelFrame.origin.y = layout.size.height + forwardAccessoryPanelNode.frame = initialPanelFrame + } + transition.updateFrame(node: forwardAccessoryPanelNode, frame: panelFrame) + } + if let segmentedControlNode = self.segmentedControlNode, let toolbarBackgroundNode = self.toolbarBackgroundNode, let toolbarSeparatorNode = self.toolbarSeparatorNode { if let textPanelHeight = textPanelHeight { - toolbarHeight = textPanelHeight + toolbarHeight = textPanelHeight + accessoryHeight } else { toolbarHeight += 44.0 } diff --git a/submodules/TelegramUI/Sources/StickerPaneTrendingListGridItem.swift b/submodules/TelegramUI/Sources/StickerPaneTrendingListGridItem.swift index 764ced2dba..72522260f3 100644 --- a/submodules/TelegramUI/Sources/StickerPaneTrendingListGridItem.swift +++ b/submodules/TelegramUI/Sources/StickerPaneTrendingListGridItem.swift @@ -166,7 +166,7 @@ private final class FeaturedPackItemNode: ListViewItemNode { self.visibilityStatus = self.visibility != .none } } - + var visibilityStatus: Bool = false { didSet { if self.visibilityStatus != oldValue { @@ -291,7 +291,7 @@ private final class FeaturedPackItemNode: ListViewItemNode { } else { self.containerNode.addSubnode(animatedStickerNode) } - animatedStickerNode.setup(source: AnimatedStickerResourceSource(account: account, resource: resource), width: 80, height: 80, mode: .direct(cachePathPrefix: nil)) + animatedStickerNode.setup(source: AnimatedStickerResourceSource(account: account, resource: resource), width: 128, height: 128, mode: .cached) } animatedStickerNode.visibility = self.visibilityStatus && loopAnimatedStickers } @@ -398,7 +398,7 @@ class StickerPaneTrendingListGridItemNode: GridItemNode { override var isVisibleInGrid: Bool { didSet { - + self.updateVisibility() } } @@ -453,6 +453,10 @@ class StickerPaneTrendingListGridItemNode: GridItemNode { self.setNeedsLayout() } + func updateVisibility() { + + } + override func layout() { super.layout() guard let item = self.item else {