diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Utils/TempBox.swift b/submodules/TelegramCore/Sources/TelegramEngine/Utils/TempBox.swift index c678eaef24..96d018b164 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Utils/TempBox.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Utils/TempBox.swift @@ -5,4 +5,5 @@ public typealias EngineTempBox = TempBox public extension EngineTempBox { typealias File = TempBoxFile + typealias Directory = TempBoxDirectory } diff --git a/submodules/TelegramUI/BUILD b/submodules/TelegramUI/BUILD index d3ea8e12a5..641edc1441 100644 --- a/submodules/TelegramUI/BUILD +++ b/submodules/TelegramUI/BUILD @@ -350,6 +350,15 @@ swift_library( "//submodules/TelegramUI/Components/Chat/EditableTokenListNode", "//submodules/TelegramUI/Components/Chat/ChatInputTextNode", "//submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode", + "//submodules/TelegramUI/Components/Chat/ChatOverscrollControl", + "//submodules/TelegramUI/Components/AudioWaveformNode", + "//submodules/TelegramUI/Components/Chat/ChatBotInfoItem", + "//submodules/TelegramUI/Components/Chat/ChatInputPanelNode", + "//submodules/TelegramUI/Components/Chat/ChatBotStartInputPanelNode", + "//submodules/TelegramUI/Components/Chat/ChatButtonKeyboardInputNode", + "//submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode", + "//submodules/TelegramUI/Components/Chat/ChatContextResultPeekContent", + "//submodules/TelegramUI/Components/Chat/ChatInputContextPanelNode", ] + select({ "@build_bazel_rules_apple//apple:ios_arm64": appcenter_targets, "//build-system:ios_sim_arm64": [], diff --git a/submodules/TelegramUI/Components/AudioWaveformNode/BUILD b/submodules/TelegramUI/Components/AudioWaveformNode/BUILD new file mode 100644 index 0000000000..7b6c35efc3 --- /dev/null +++ b/submodules/TelegramUI/Components/AudioWaveformNode/BUILD @@ -0,0 +1,20 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "AudioWaveformNode", + module_name = "AudioWaveformNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/AsyncDisplayKit", + "//submodules/Display", + "//submodules/ChatPresentationInterfaceState", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Sources/AudioWaveformNode.swift b/submodules/TelegramUI/Components/AudioWaveformNode/Sources/AudioWaveformNode.swift similarity index 95% rename from submodules/TelegramUI/Sources/AudioWaveformNode.swift rename to submodules/TelegramUI/Components/AudioWaveformNode/Sources/AudioWaveformNode.swift index 0569bcba8f..f1073863bf 100644 --- a/submodules/TelegramUI/Sources/AudioWaveformNode.swift +++ b/submodules/TelegramUI/Components/AudioWaveformNode/Sources/AudioWaveformNode.swift @@ -20,8 +20,8 @@ private final class AudioWaveformNodeParameters: NSObject { } } -final class AudioWaveformNode: ASDisplayNode { - enum Gravity { +public final class AudioWaveformNode: ASDisplayNode { + public enum Gravity { case bottom case center } @@ -30,7 +30,7 @@ final class AudioWaveformNode: ASDisplayNode { private var color: UIColor? private var gravity: Gravity? - var progress: CGFloat? { + public var progress: CGFloat? { didSet { if self.progress != oldValue { self.setNeedsDisplay() @@ -38,13 +38,13 @@ final class AudioWaveformNode: ASDisplayNode { } } - override init() { + override public init() { super.init() self.isOpaque = false } - override var frame: CGRect { + override public var frame: CGRect { get { return super.frame } set(value) { @@ -57,7 +57,7 @@ final class AudioWaveformNode: ASDisplayNode { } } - func setup(color: UIColor, gravity: Gravity, waveform: AudioWaveform?) { + public func setup(color: UIColor, gravity: Gravity, waveform: AudioWaveform?) { if self.color == nil || !self.color!.isEqual(color) || self.waveform != waveform || self.gravity != gravity { self.color = color self.gravity = gravity @@ -66,7 +66,7 @@ final class AudioWaveformNode: ASDisplayNode { } } - override func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { + override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { return AudioWaveformNodeParameters(waveform: self.waveform, color: self.color, gravity: self.gravity, progress: self.progress) } diff --git a/submodules/TelegramUI/Components/Chat/ChatBotInfoItem/BUILD b/submodules/TelegramUI/Components/Chat/ChatBotInfoItem/BUILD new file mode 100644 index 0000000000..85fd55a2df --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatBotInfoItem/BUILD @@ -0,0 +1,32 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatBotInfoItem", + module_name = "ChatBotInfoItem", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/Display", + "//submodules/AsyncDisplayKit", + "//submodules/SSignalKit/SwiftSignalKit", + "//submodules/Postbox", + "//submodules/TelegramCore", + "//submodules/TelegramPresentationData", + "//submodules/TextFormat", + "//submodules/UrlEscaping", + "//submodules/PhotoResources", + "//submodules/AccountContext", + "//submodules/MediaPlayer:UniversalMediaPlayer", + "//submodules/TelegramUniversalVideoContent", + "//submodules/WallpaperBackgroundNode", + "//submodules/TelegramUI/Components/ChatControllerInteraction", + "//submodules/TelegramUI/Components/Chat/ChatMessageBubbleContentNode", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Sources/ChatBotInfoItem.swift b/submodules/TelegramUI/Components/Chat/ChatBotInfoItem/Sources/ChatBotInfoItem.swift similarity index 92% rename from submodules/TelegramUI/Sources/ChatBotInfoItem.swift rename to submodules/TelegramUI/Components/Chat/ChatBotInfoItem/Sources/ChatBotInfoItem.swift index e2198870ae..3c944ccb9a 100644 --- a/submodules/TelegramUI/Sources/ChatBotInfoItem.swift +++ b/submodules/TelegramUI/Components/Chat/ChatBotInfoItem/Sources/ChatBotInfoItem.swift @@ -22,7 +22,7 @@ private let messageItalicFont = Font.italic(17.0) private let messageBoldItalicFont = Font.semiboldItalic(17.0) private let messageFixedFont = UIFont(name: "Menlo-Regular", size: 16.0) ?? UIFont.systemFont(ofSize: 17.0) -final class ChatBotInfoItem: ListViewItem { +public final class ChatBotInfoItem: ListViewItem { fileprivate let title: String fileprivate let text: String fileprivate let photo: TelegramMediaImage? @@ -31,7 +31,7 @@ final class ChatBotInfoItem: ListViewItem { fileprivate let presentationData: ChatPresentationData fileprivate let context: AccountContext - init(title: String, text: String, photo: TelegramMediaImage?, video: TelegramMediaFile?, controllerInteraction: ChatControllerInteraction, presentationData: ChatPresentationData, context: AccountContext) { + public init(title: String, text: String, photo: TelegramMediaImage?, video: TelegramMediaFile?, controllerInteraction: ChatControllerInteraction, presentationData: ChatPresentationData, context: AccountContext) { self.title = title self.text = text self.photo = photo @@ -41,7 +41,7 @@ final class ChatBotInfoItem: ListViewItem { self.context = context } - func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { let configure = { let node = ChatBotInfoItemNode() @@ -66,7 +66,7 @@ final class ChatBotInfoItem: ListViewItem { } } - func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + public func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { Queue.mainQueue().async { if let nodeValue = node() as? ChatBotInfoItemNode { let nodeLayout = nodeValue.asyncLayout() @@ -84,20 +84,20 @@ final class ChatBotInfoItem: ListViewItem { } } -final class ChatBotInfoItemNode: ListViewItemNode { - var controllerInteraction: ChatControllerInteraction? +public final class ChatBotInfoItemNode: ListViewItemNode { + public var controllerInteraction: ChatControllerInteraction? - let offsetContainer: ASDisplayNode - let backgroundNode: ASImageNode - let imageNode: TransformImageNode - var videoNode: UniversalVideoNode? - let titleNode: TextNode - let textNode: TextNode + public let offsetContainer: ASDisplayNode + public let backgroundNode: ASImageNode + public let imageNode: TransformImageNode + public var videoNode: UniversalVideoNode? + public let titleNode: TextNode + public let textNode: TextNode private var linkHighlightingNode: LinkHighlightingNode? private let fetchDisposable = MetaDisposable() - var currentTextAndEntities: (String, [MessageTextEntity])? + public var currentTextAndEntities: (String, [MessageTextEntity])? private var theme: ChatPresentationThemeData? @@ -108,7 +108,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { private var item: ChatBotInfoItem? - init() { + public init() { self.offsetContainer = ASDisplayNode() self.backgroundNode = ASImageNode() @@ -163,7 +163,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { videoNode.play() } - override func didLoad() { + override public func didLoad() { super.didLoad() let recognizer = TapLongTapOrDoubleTapGestureRecognizer(target: self, action: #selector(self.tapLongTapOrDoubleTapGesture(_:))) @@ -190,7 +190,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { self.view.addGestureRecognizer(recognizer) } - override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { + override public func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize) { super.updateAbsoluteRect(rect, within: containerSize) self.absolutePosition = (rect, containerSize) @@ -202,7 +202,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { } } - func asyncLayout() -> (_ item: ChatBotInfoItem, _ width: ListViewItemLayoutParams) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation) -> Void) { + public func asyncLayout() -> (_ item: ChatBotInfoItem, _ width: ListViewItemLayoutParams) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation) -> Void) { let makeImageLayout = self.imageNode.asyncLayout() let makeTitleLayout = TextNode.asyncLayout(self.titleNode) let makeTextLayout = TextNode.asyncLayout(self.textNode) @@ -351,7 +351,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { } } - override func updateTrailingItemSpace(_ height: CGFloat, transition: ContainedViewLayoutTransition) { + override public func updateTrailingItemSpace(_ height: CGFloat, transition: ContainedViewLayoutTransition) { if height.isLessThanOrEqualTo(0.0) { transition.updateFrame(node: self.offsetContainer, frame: CGRect(origin: CGPoint(), size: self.offsetContainer.bounds.size)) } else { @@ -359,25 +359,25 @@ final class ChatBotInfoItemNode: ListViewItemNode { } } - override func animateAdded(_ currentTimestamp: Double, duration: Double) { + override public func animateAdded(_ currentTimestamp: Double, duration: Double) { self.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration * 0.5) } - override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + override public func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { self.layer.animateAlpha(from: 0.0, to: 1.0, duration: duration * 0.5) } - override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + override public func animateRemoved(_ currentTimestamp: Double, duration: Double) { self.layer.animateAlpha(from: 1.0, to: 0.0, duration: duration * 0.5, removeOnCompletion: false) } - override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + override public func point(inside point: CGPoint, with event: UIEvent?) -> Bool { let result = super.point(inside: point, with: event) let extra = self.offsetContainer.frame.contains(point) return result || extra } - func updateTouchesAtPoint(_ point: CGPoint?) { + public func updateTouchesAtPoint(_ point: CGPoint?) { if let item = self.item { var rects: [CGRect]? if let point = point { @@ -419,7 +419,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { } } - func tapActionAtPoint(_ point: CGPoint, gesture: TapLongTapOrDoubleTapGesture, isEstimating: Bool) -> ChatMessageBubbleContentTapAction { + public func tapActionAtPoint(_ point: CGPoint, gesture: TapLongTapOrDoubleTapGesture, isEstimating: Bool) -> ChatMessageBubbleContentTapAction { let textNodeFrame = self.textNode.frame if let (index, attributes) = self.textNode.attributesAtPoint(CGPoint(x: point.x - self.offsetContainer.frame.minX - textNodeFrame.minX, y: point.y - self.offsetContainer.frame.minY - textNodeFrame.minY)) { if let url = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { @@ -444,7 +444,7 @@ final class ChatBotInfoItemNode: ListViewItemNode { } } - @objc func tapLongTapOrDoubleTapGesture(_ recognizer: TapLongTapOrDoubleTapGestureRecognizer) { + @objc private func tapLongTapOrDoubleTapGesture(_ recognizer: TapLongTapOrDoubleTapGestureRecognizer) { switch recognizer.state { case .ended: if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation { diff --git a/submodules/TelegramUI/Components/Chat/ChatBotStartInputPanelNode/BUILD b/submodules/TelegramUI/Components/Chat/ChatBotStartInputPanelNode/BUILD new file mode 100644 index 0000000000..8edacf5a55 --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatBotStartInputPanelNode/BUILD @@ -0,0 +1,27 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatBotStartInputPanelNode", + module_name = "ChatBotStartInputPanelNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/AsyncDisplayKit", + "//submodules/Display", + "//submodules/TelegramCore", + "//submodules/Postbox", + "//submodules/SSignalKit/SwiftSignalKit", + "//submodules/TelegramPresentationData", + "//submodules/ChatPresentationInterfaceState", + "//submodules/SolidRoundedButtonNode", + "//submodules/TooltipUI", + "//submodules/TelegramUI/Components/Chat/ChatInputPanelNode", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Sources/ChatBotStartInputPanelNode.swift b/submodules/TelegramUI/Components/Chat/ChatBotStartInputPanelNode/Sources/ChatBotStartInputPanelNode.swift similarity index 85% rename from submodules/TelegramUI/Sources/ChatBotStartInputPanelNode.swift rename to submodules/TelegramUI/Components/Chat/ChatBotStartInputPanelNode/Sources/ChatBotStartInputPanelNode.swift index ced09c1229..f9a983a911 100644 --- a/submodules/TelegramUI/Sources/ChatBotStartInputPanelNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatBotStartInputPanelNode/Sources/ChatBotStartInputPanelNode.swift @@ -9,15 +9,16 @@ import TelegramPresentationData import ChatPresentationInterfaceState import SolidRoundedButtonNode import TooltipUI +import ChatInputPanelNode -final class ChatBotStartInputPanelNode: ChatInputPanelNode { +public final class ChatBotStartInputPanelNode: ChatInputPanelNode { private let button: SolidRoundedButtonNode private var statusDisposable: Disposable? private var presentationInterfaceState: ChatPresentationInterfaceState? - override var interfaceInteraction: ChatPanelInterfaceInteraction? { + override public var interfaceInteraction: ChatPanelInterfaceInteraction? { didSet { if let _ = self.interfaceInteraction { if self.statusDisposable == nil { @@ -51,7 +52,7 @@ final class ChatBotStartInputPanelNode: ChatInputPanelNode { private var tooltipController: TooltipScreen? private var tooltipDismissed = false - init(theme: PresentationTheme, strings: PresentationStrings) { + public init(theme: PresentationTheme, strings: PresentationStrings) { self.theme = theme self.strings = strings @@ -72,7 +73,7 @@ final class ChatBotStartInputPanelNode: ChatInputPanelNode { self.tooltipController?.dismiss() } - func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) { + public func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) { if self.theme !== theme || self.strings !== strings { self.theme = theme self.strings = strings @@ -81,7 +82,7 @@ final class ChatBotStartInputPanelNode: ChatInputPanelNode { } } - @objc func buttonPressed() { + @objc private func buttonPressed() { guard let _ = self.context, let presentationInterfaceState = self.presentationInterfaceState else { return } @@ -95,7 +96,7 @@ final class ChatBotStartInputPanelNode: ChatInputPanelNode { } } - override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) { + override public func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) { super.updateAbsoluteRect(rect, within: containerSize, transition: transition) let absoluteFrame = self.button.view.convert(self.button.bounds, to: nil) @@ -107,7 +108,7 @@ final class ChatBotStartInputPanelNode: ChatInputPanelNode { } - override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics, isMediaInputExpanded: Bool) -> CGFloat { + override public func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics, isMediaInputExpanded: Bool) -> CGFloat { if self.presentationInterfaceState != interfaceState { self.presentationInterfaceState = interfaceState } @@ -154,7 +155,7 @@ final class ChatBotStartInputPanelNode: ChatInputPanelNode { return panelHeight } - override func minimalHeight(interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { + override public func minimalHeight(interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { return defaultHeight(metrics: metrics) + 27.0 } } diff --git a/submodules/TelegramUI/Components/Chat/ChatButtonKeyboardInputNode/BUILD b/submodules/TelegramUI/Components/Chat/ChatButtonKeyboardInputNode/BUILD new file mode 100644 index 0000000000..8a7107a81e --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatButtonKeyboardInputNode/BUILD @@ -0,0 +1,28 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatButtonKeyboardInputNode", + module_name = "ChatButtonKeyboardInputNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/Display", + "//submodules/AsyncDisplayKit", + "//submodules/Postbox", + "//submodules/TelegramCore", + "//submodules/SSignalKit/SwiftSignalKit", + "//submodules/TelegramPresentationData", + "//submodules/AccountContext", + "//submodules/ChatPresentationInterfaceState", + "//submodules/WallpaperBackgroundNode", + "//submodules/TelegramUI/Components/ChatControllerInteraction", + "//submodules/TelegramUI/Components/ChatInputNode", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Sources/ChatButtonKeyboardInputNode.swift b/submodules/TelegramUI/Components/Chat/ChatButtonKeyboardInputNode/Sources/ChatButtonKeyboardInputNode.swift similarity index 96% rename from submodules/TelegramUI/Sources/ChatButtonKeyboardInputNode.swift rename to submodules/TelegramUI/Components/Chat/ChatButtonKeyboardInputNode/Sources/ChatButtonKeyboardInputNode.swift index a92e298b64..354cb89b23 100644 --- a/submodules/TelegramUI/Sources/ChatButtonKeyboardInputNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatButtonKeyboardInputNode/Sources/ChatButtonKeyboardInputNode.swift @@ -197,7 +197,7 @@ private final class ChatButtonKeyboardInputButtonNode: HighlightTrackingButtonNo } } -final class ChatButtonKeyboardInputNode: ChatInputNode { +public final class ChatButtonKeyboardInputNode: ChatInputNode { private let context: AccountContext private let controllerInteraction: ChatControllerInteraction @@ -212,7 +212,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode { private var theme: PresentationTheme? - init(context: AccountContext, controllerInteraction: ChatControllerInteraction) { + public init(context: AccountContext, controllerInteraction: ChatControllerInteraction) { self.context = context self.controllerInteraction = controllerInteraction @@ -236,7 +236,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode { self.addSubnode(self.separatorNode) } - override func didLoad() { + override public func didLoad() { super.didLoad() if #available(iOSApplicationExtension 11.0, iOS 11.0, *) { @@ -245,7 +245,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode { } private var absoluteRect: (CGRect, CGSize)? - override func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) { + override public func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) { self.absoluteRect = (rect, containerSize) if let backgroundNode = self.backgroundNode { @@ -263,7 +263,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode { } } - override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, layoutMetrics: LayoutMetrics, deviceMetrics: DeviceMetrics, isVisible: Bool, isExpanded: Bool) -> (CGFloat, CGFloat) { + override public func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, standardInputHeight: CGFloat, inputHeight: CGFloat, maximumHeight: CGFloat, inputPanelHeight: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, layoutMetrics: LayoutMetrics, deviceMetrics: DeviceMetrics, isVisible: Bool, isExpanded: Bool) -> (CGFloat, CGFloat) { transition.updateFrame(node: self.separatorNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: width, height: UIScreenPixel))) if self.backgroundNode == nil { @@ -370,7 +370,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode { } } - @objc func buttonPressed(_ button: ASButtonNode) { + @objc private func buttonPressed(_ button: ASButtonNode) { if let button = button as? ChatButtonKeyboardInputButtonNode, let markupButton = button.button { var dismissIfOnce = false switch markupButton.action { diff --git a/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/BUILD b/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/BUILD new file mode 100644 index 0000000000..cc26e420ef --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/BUILD @@ -0,0 +1,29 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatChannelSubscriberInputPanelNode", + module_name = "ChatChannelSubscriberInputPanelNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/AsyncDisplayKit", + "//submodules/Display", + "//submodules/TelegramCore", + "//submodules/Postbox", + "//submodules/SSignalKit/SwiftSignalKit", + "//submodules/TelegramPresentationData", + "//submodules/AlertUI", + "//submodules/PresentationDataUtils", + "//submodules/PeerInfoUI", + "//submodules/UndoUI", + "//submodules/ChatPresentationInterfaceState", + "//submodules/TelegramUI/Components/Chat/ChatInputPanelNode", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Sources/ChatChannelSubscriberInputPanelNode.swift b/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/Sources/ChatChannelSubscriberInputPanelNode.swift similarity index 96% rename from submodules/TelegramUI/Sources/ChatChannelSubscriberInputPanelNode.swift rename to submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/Sources/ChatChannelSubscriberInputPanelNode.swift index 74276d1072..cc5bd993c5 100644 --- a/submodules/TelegramUI/Sources/ChatChannelSubscriberInputPanelNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatChannelSubscriberInputPanelNode/Sources/ChatChannelSubscriberInputPanelNode.swift @@ -11,6 +11,7 @@ import PresentationDataUtils import PeerInfoUI import UndoUI import ChatPresentationInterfaceState +import ChatInputPanelNode private enum SubscriberAction: Equatable { case join @@ -113,7 +114,7 @@ private func actionForPeer(peer: Peer, interfaceState: ChatPresentationInterface private let badgeFont = Font.regular(14.0) -final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { +public final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { private let button: HighlightableButtonNode private let discussButton: HighlightableButtonNode private let discussButtonText: ImmediateTextNode @@ -133,7 +134,7 @@ final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { private var layoutData: (CGFloat, CGFloat, CGFloat, CGFloat, UIEdgeInsets, CGFloat, Bool, LayoutMetrics)? - override init() { + public override init() { self.button = HighlightableButtonNode() self.discussButton = HighlightableButtonNode() self.activityIndicator = UIActivityIndicatorView(style: .gray) @@ -176,18 +177,18 @@ final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { self.badgeDisposable.dispose() } - override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { if !self.bounds.contains(point) { return nil } return super.hitTest(point, with: event) } - @objc func helpPressed() { + @objc private func helpPressed() { self.interfaceInteraction?.presentGigagroupHelp() } - @objc func buttonPressed() { + @objc private func buttonPressed() { guard let context = self.context, let action = self.action, let presentationInterfaceState = self.presentationInterfaceState, let peer = presentationInterfaceState.renderedPeer?.peer else { return } @@ -269,7 +270,7 @@ final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { } } - override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics, isMediaInputExpanded: Bool) -> CGFloat { + override public func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics, isMediaInputExpanded: Bool) -> CGFloat { return self.updateLayout(width: width, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, additionalSideInsets: additionalSideInsets, maxHeight: maxHeight, isSecondary: isSecondary, transition: transition, interfaceState: interfaceState, metrics: metrics, force: false) } @@ -361,7 +362,7 @@ final class ChatChannelSubscriberInputPanelNode: ChatInputPanelNode { return panelHeight } - override func minimalHeight(interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { + override public func minimalHeight(interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { return defaultHeight(metrics: metrics) } } diff --git a/submodules/TelegramUI/Components/Chat/ChatContextResultPeekContent/BUILD b/submodules/TelegramUI/Components/Chat/ChatContextResultPeekContent/BUILD new file mode 100644 index 0000000000..436d275171 --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatContextResultPeekContent/BUILD @@ -0,0 +1,27 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatContextResultPeekContent", + module_name = "ChatContextResultPeekContent", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/Display", + "//submodules/AsyncDisplayKit", + "//submodules/Postbox", + "//submodules/TelegramCore", + "//submodules/SSignalKit/SwiftSignalKit", + "//submodules/PhotoResources", + "//submodules/AppBundle", + "//submodules/ContextUI", + "//submodules/SoftwareVideo", + "//submodules/TelegramUI/Components/MultiplexedVideoNode", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Sources/ChatContextResultPeekContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatContextResultPeekContent/Sources/ChatContextResultPeekContent.swift similarity index 94% rename from submodules/TelegramUI/Sources/ChatContextResultPeekContentNode.swift rename to submodules/TelegramUI/Components/Chat/ChatContextResultPeekContent/Sources/ChatContextResultPeekContent.swift index c1dd40fcea..d32cd4adf8 100644 --- a/submodules/TelegramUI/Sources/ChatContextResultPeekContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatContextResultPeekContent/Sources/ChatContextResultPeekContent.swift @@ -12,34 +12,34 @@ import ContextUI import SoftwareVideo import MultiplexedVideoNode -final class ChatContextResultPeekContent: PeekControllerContent { - let account: Account - let contextResult: ChatContextResult - let menu: [ContextMenuItem] +public final class ChatContextResultPeekContent: PeekControllerContent { + public let account: Account + public let contextResult: ChatContextResult + public let menu: [ContextMenuItem] - init(account: Account, contextResult: ChatContextResult, menu: [ContextMenuItem]) { + public init(account: Account, contextResult: ChatContextResult, menu: [ContextMenuItem]) { self.account = account self.contextResult = contextResult self.menu = menu } - func presentation() -> PeekControllerContentPresentation { + public func presentation() -> PeekControllerContentPresentation { return .contained } - func menuActivation() -> PeerControllerMenuActivation { + public func menuActivation() -> PeerControllerMenuActivation { return .drag } - func menuItems() -> [ContextMenuItem] { + public func menuItems() -> [ContextMenuItem] { return self.menu } - func node() -> PeekControllerContentNode & ASDisplayNode { + public func node() -> PeekControllerContentNode & ASDisplayNode { return ChatContextResultPeekNode(account: self.account, contextResult: self.contextResult) } - func topAccessoryNode() -> ASDisplayNode? { + public func topAccessoryNode() -> ASDisplayNode? { let arrowNode = ASImageNode() if let image = UIImage(bundleImageName: "Peek/Arrow") { arrowNode.image = image @@ -48,11 +48,11 @@ final class ChatContextResultPeekContent: PeekControllerContent { return arrowNode } - func fullScreenAccessoryNode(blurView: UIVisualEffectView) -> (PeekControllerAccessoryNode & ASDisplayNode)? { + public func fullScreenAccessoryNode(blurView: UIVisualEffectView) -> (PeekControllerAccessoryNode & ASDisplayNode)? { return nil } - func isEqual(to: PeekControllerContent) -> Bool { + public func isEqual(to: PeekControllerContent) -> Bool { if let to = to as? ChatContextResultPeekContent { return self.contextResult == to.contextResult } else { diff --git a/submodules/TelegramUI/Components/Chat/ChatInputContextPanelNode/BUILD b/submodules/TelegramUI/Components/Chat/ChatInputContextPanelNode/BUILD new file mode 100644 index 0000000000..39b8a7ad0b --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatInputContextPanelNode/BUILD @@ -0,0 +1,25 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatInputContextPanelNode", + module_name = "ChatInputContextPanelNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/AsyncDisplayKit", + "//submodules/Display", + "//submodules/TelegramCore", + "//submodules/TelegramPresentationData", + "//submodules/TelegramUIPreferences", + "//submodules/AccountContext", + "//submodules/ChatPresentationInterfaceState", + "//submodules/TelegramUI/Components/ChatControllerInteraction", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Components/Chat/ChatInputContextPanelNode/Sources/ChatInputContextPanelNode.swift b/submodules/TelegramUI/Components/Chat/ChatInputContextPanelNode/Sources/ChatInputContextPanelNode.swift new file mode 100644 index 0000000000..c6818c877d --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatInputContextPanelNode/Sources/ChatInputContextPanelNode.swift @@ -0,0 +1,42 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display +import TelegramCore +import TelegramPresentationData +import TelegramUIPreferences +import AccountContext +import ChatPresentationInterfaceState +import ChatControllerInteraction + +public enum ChatInputContextPanelPlacement { + case overPanels + case overTextInput +} + +open class ChatInputContextPanelNode: ASDisplayNode { + public let context: AccountContext + open var interfaceInteraction: ChatPanelInterfaceInteraction? + open var placement: ChatInputContextPanelPlacement = .overPanels + open var theme: PresentationTheme + open var fontSize: PresentationFontSize + + public init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings, fontSize: PresentationFontSize, chatPresentationContext: ChatPresentationContext) { + self.context = context + self.theme = theme + self.fontSize = fontSize + + super.init() + } + + open func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState) { + } + + open func animateOut(completion: @escaping () -> Void) { + completion() + } + + open var topItemFrame: CGRect? { + return nil + } +} diff --git a/submodules/TelegramUI/Components/Chat/ChatInputPanelNode/BUILD b/submodules/TelegramUI/Components/Chat/ChatInputPanelNode/BUILD new file mode 100644 index 0000000000..57e1434665 --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatInputPanelNode/BUILD @@ -0,0 +1,23 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatInputPanelNode", + module_name = "ChatInputPanelNode", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/AsyncDisplayKit", + "//submodules/Display", + "//submodules/Postbox", + "//submodules/TelegramCore", + "//submodules/AccountContext", + "//submodules/ChatPresentationInterfaceState", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Components/Chat/ChatInputPanelNode/Sources/ChatInputPanelNode.swift b/submodules/TelegramUI/Components/Chat/ChatInputPanelNode/Sources/ChatInputPanelNode.swift new file mode 100644 index 0000000000..3c44da17c2 --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatInputPanelNode/Sources/ChatInputPanelNode.swift @@ -0,0 +1,43 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display +import Postbox +import TelegramCore +import AccountContext +import ChatPresentationInterfaceState + +public protocol ChatInputPanelViewForOverlayContent: UIView { + func maybeDismissContent(point: CGPoint) +} + +open class ChatInputPanelNode: ASDisplayNode { + open var context: AccountContext? + open var interfaceInteraction: ChatPanelInterfaceInteraction? + open var prevInputPanelNode: ChatInputPanelNode? + + open var viewForOverlayContent: ChatInputPanelViewForOverlayContent? + + open func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) { + } + + open func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics, isMediaInputExpanded: Bool) -> CGFloat { + return 0.0 + } + + open func minimalHeight(interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { + return 0.0 + } + + open func defaultHeight(metrics: LayoutMetrics) -> CGFloat { + if case .regular = metrics.widthClass, case .regular = metrics.heightClass { + return 49.0 + } else { + return 45.0 + } + } + + open func canHandleTransition(from prevInputPanelNode: ChatInputPanelNode?) -> Bool { + return false + } +} diff --git a/submodules/TelegramUI/Components/Chat/ChatOverscrollControl/BUILD b/submodules/TelegramUI/Components/Chat/ChatOverscrollControl/BUILD new file mode 100644 index 0000000000..f716408639 --- /dev/null +++ b/submodules/TelegramUI/Components/Chat/ChatOverscrollControl/BUILD @@ -0,0 +1,27 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "ChatOverscrollControl", + module_name = "ChatOverscrollControl", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//submodules/AsyncDisplayKit", + "//submodules/ComponentFlow", + "//submodules/Display", + "//submodules/TelegramCore", + "//submodules/Postbox", + "//submodules/AccountContext", + "//submodules/AvatarNode", + "//submodules/TextFormat", + "//submodules/Markdown", + "//submodules/WallpaperBackgroundNode", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/submodules/TelegramUI/Sources/ChatOverscrollControl.swift b/submodules/TelegramUI/Components/Chat/ChatOverscrollControl/Sources/ChatOverscrollControl.swift similarity index 98% rename from submodules/TelegramUI/Sources/ChatOverscrollControl.swift rename to submodules/TelegramUI/Components/Chat/ChatOverscrollControl/Sources/ChatOverscrollControl.swift index 3d3ff123d8..d93210853e 100644 --- a/submodules/TelegramUI/Sources/ChatOverscrollControl.swift +++ b/submodules/TelegramUI/Components/Chat/ChatOverscrollControl/Sources/ChatOverscrollControl.swift @@ -984,7 +984,7 @@ final class OverscrollContentsComponent: Component { } } -final class ChatOverscrollControl: CombinedComponent { +public final class ChatOverscrollControl: CombinedComponent { let backgroundColor: UIColor let foregroundColor: UIColor let peer: EnginePeer? @@ -997,7 +997,7 @@ final class ChatOverscrollControl: CombinedComponent { let absoluteSize: CGSize let wallpaperNode: WallpaperBackgroundNode? - init( + public init( backgroundColor: UIColor, foregroundColor: UIColor, peer: EnginePeer?, @@ -1023,7 +1023,7 @@ final class ChatOverscrollControl: CombinedComponent { self.wallpaperNode = wallpaperNode } - static func ==(lhs: ChatOverscrollControl, rhs: ChatOverscrollControl) -> Bool { + public static func ==(lhs: ChatOverscrollControl, rhs: ChatOverscrollControl) -> Bool { if !lhs.backgroundColor.isEqual(rhs.backgroundColor) { return false } @@ -1060,7 +1060,7 @@ final class ChatOverscrollControl: CombinedComponent { return true } - static var body: Body { + public static var body: Body { let contents = Child(OverscrollContentsComponent.self) return { context in @@ -1093,12 +1093,12 @@ final class ChatOverscrollControl: CombinedComponent { } } -final class ChatInputPanelOverscrollNode: ASDisplayNode { - let text: (String, [(Int, NSRange)]) - let priority: Int +public final class ChatInputPanelOverscrollNode: ASDisplayNode { + public let text: (String, [(Int, NSRange)]) + public let priority: Int private let titleNode: ImmediateTextNode - init(text: (String, [(Int, NSRange)]), color: UIColor, priority: Int) { + public init(text: (String, [(Int, NSRange)]), color: UIColor, priority: Int) { self.text = text self.priority = priority self.titleNode = ImmediateTextNode() @@ -1113,7 +1113,7 @@ final class ChatInputPanelOverscrollNode: ASDisplayNode { self.addSubnode(self.titleNode) } - func update(size: CGSize) { + public func update(size: CGSize) { let titleSize = self.titleNode.updateLayout(size) self.titleNode.frame = titleSize.centered(in: CGRect(origin: CGPoint(), size: size)) } diff --git a/submodules/TelegramUI/Sources/ChatControllerNode.swift b/submodules/TelegramUI/Sources/ChatControllerNode.swift index f2d1330761..c8aab5249a 100644 --- a/submodules/TelegramUI/Sources/ChatControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatControllerNode.swift @@ -27,6 +27,9 @@ import ChatControllerInteraction import ChatAvatarNavigationNode import AccessoryPanelNode import ForwardAccessoryPanelNode +import ChatOverscrollControl +import ChatInputPanelNode +import ChatInputContextPanelNode final class VideoNavigationControllerDropContentItem: NavigationControllerDropContentItem { let itemNode: OverlayMediaItemNode diff --git a/submodules/TelegramUI/Sources/ChatEditMessageMediaContext.swift b/submodules/TelegramUI/Sources/ChatEditMessageMediaContext.swift deleted file mode 100644 index 0ab47ae01e..0000000000 --- a/submodules/TelegramUI/Sources/ChatEditMessageMediaContext.swift +++ /dev/null @@ -1,31 +0,0 @@ -import Foundation -import SwiftSignalKit -import Postbox -import TelegramCore -import AccountContext - -private final class MessageContext { - let disposable: Disposable - - init(disposable: Disposable) { - self.disposable = disposable - } - - deinit { - self.disposable.dispose() - } -} - -final class ChatEditMessageMediaContext { - private let context: AccountContext - - private let contexts: [MessageId: MessageContext] = [:] - - init(context: AccountContext) { - self.context = context - } - - func update(id: MessageId, text: String, entities: TextEntitiesMessageAttribute?, disableUrlPreview: Bool, media: RequestEditMessageMedia) { - - } -} diff --git a/submodules/TelegramUI/Sources/ChatFeedNavigationInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatFeedNavigationInputPanelNode.swift deleted file mode 100644 index f815821911..0000000000 --- a/submodules/TelegramUI/Sources/ChatFeedNavigationInputPanelNode.swift +++ /dev/null @@ -1,75 +0,0 @@ -import Foundation -import UIKit -import AsyncDisplayKit -import Display -import TelegramCore -import Postbox -import SwiftSignalKit -import TelegramPresentationData -import ChatPresentationInterfaceState - -final class ChatFeedNavigationInputPanelNode: ChatInputPanelNode { - private let button: HighlightableButtonNode - - private var presentationInterfaceState: ChatPresentationInterfaceState? - - private var theme: PresentationTheme - private var strings: PresentationStrings - - init(theme: PresentationTheme, strings: PresentationStrings) { - self.theme = theme - self.strings = strings - - self.button = HighlightableButtonNode() - - super.init() - - self.addSubnode(self.button) - - self.button.setAttributedTitle(NSAttributedString(string: "Show Next", font: Font.regular(17.0), textColor: theme.chat.inputPanel.panelControlAccentColor), for: []) - self.button.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: [.touchUpInside]) - } - - deinit { - } - - func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) { - if self.theme !== theme || self.strings !== strings { - self.theme = theme - self.strings = strings - - self.button.setAttributedTitle(NSAttributedString(string: strings.Conversation_Unblock, font: Font.regular(17.0), textColor: theme.chat.inputPanel.panelControlAccentColor), for: []) - } - } - - override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { - if self.bounds.contains(point) { - return self.button.view - } else { - return nil - } - } - - @objc func buttonPressed() { - self.interfaceInteraction?.navigateFeed() - } - - override func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics, isMediaInputExpanded: Bool) -> CGFloat { - if self.presentationInterfaceState != interfaceState { - self.presentationInterfaceState = interfaceState - } - - let buttonSize = self.button.measure(CGSize(width: width - leftInset - rightInset - 80.0, height: 100.0)) - - let panelHeight = defaultHeight(metrics: metrics) - - self.button.frame = CGRect(origin: CGPoint(x: leftInset + floor((width - leftInset - rightInset - buttonSize.width) / 2.0), y: floor((panelHeight - buttonSize.height) / 2.0)), size: buttonSize) - - return panelHeight - } - - override func minimalHeight(interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { - return defaultHeight(metrics: metrics) - } -} - diff --git a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift index 704a465a0a..b323ae293d 100644 --- a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift @@ -24,6 +24,8 @@ import TelegramNotices import ChatControllerInteraction import TranslateUI import ChatHistoryEntry +import ChatOverscrollControl +import ChatBotInfoItem extension ChatReplyThreadMessage { var effectiveTopId: MessageId { diff --git a/submodules/TelegramUI/Sources/ChatHoleItem.swift b/submodules/TelegramUI/Sources/ChatHoleItem.swift deleted file mode 100644 index f4fca112ee..0000000000 --- a/submodules/TelegramUI/Sources/ChatHoleItem.swift +++ /dev/null @@ -1,119 +0,0 @@ -import Foundation -import UIKit -import Postbox -import AsyncDisplayKit -import Display -import SwiftSignalKit -import TelegramPresentationData -import ChatMessageItemCommon - -private let titleFont = UIFont.systemFont(ofSize: 13.0) - -class ChatHoleItem: ListViewItem { - let index: MessageIndex - let presentationData: ChatPresentationData - //let header: ChatMessageDateHeader - - init(index: MessageIndex, presentationData: ChatPresentationData) { - self.index = index - self.presentationData = presentationData - //self.header = ChatMessageDateHeader(timestamp: index.timestamp, theme: theme, strings: strings) - } - - func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { - async { - let node = ChatHoleItemNode() - node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem) - Queue.mainQueue().async { - completion(node, { - return (nil, { _ in }) - }) - } - } - } - - func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { - Queue.mainQueue().async { - completion(ListViewItemNodeLayout(contentSize: node().contentSize, insets: node().insets), { _ in - }) - } - } -} - -class ChatHoleItemNode: ListViewItemNode { - var item: ChatHoleItem? - let backgroundNode: ASImageNode - let labelNode: TextNode - - private let layoutConstants = ChatMessageItemLayoutConstants.default - - init() { - self.backgroundNode = ASImageNode() - self.backgroundNode.isLayerBacked = true - self.backgroundNode.displayWithoutProcessing = true - self.backgroundNode.displaysAsynchronously = false - - self.labelNode = TextNode() - self.labelNode.isUserInteractionEnabled = false - - super.init(layerBacked: false) - - self.addSubnode(self.backgroundNode) - - self.addSubnode(self.labelNode) - - self.transform = CATransform3DMakeRotation(CGFloat.pi, 0.0, 0.0, 1.0) - } - - override func layoutForParams(_ params: ListViewItemLayoutParams, item: ListViewItem, previousItem: ListViewItem?, nextItem: ListViewItem?) { - if let item = item as? ChatHoleItem { - let dateAtBottom = false//!chatItemsHaveCommonDateHeader(item, nextItem) - let (layout, apply) = self.asyncLayout()(item, params, dateAtBottom) - apply() - self.contentSize = layout.contentSize - self.insets = layout.insets - } - } - - func asyncLayout() -> (_ item: ChatHoleItem, _ params: ListViewItemLayoutParams, _ dateAtBottom: Bool) -> (ListViewItemNodeLayout, () -> Void) { - let labelLayout = TextNode.asyncLayout(self.labelNode) - let layoutConstants = self.layoutConstants - let currentItem = self.item - return { item, params, dateAtBottom in - var updatedBackground: UIImage? - if item.presentationData.theme !== currentItem?.presentationData.theme { - let graphics = PresentationResourcesChat.additionalGraphics(item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper, bubbleCorners: item.presentationData.chatBubbleCorners) - updatedBackground = graphics.chatServiceBubbleFillImage - } - - let serviceColor = serviceMessageColorComponents(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper) - - let (size, apply) = labelLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.presentationData.strings.Channel_NotificationLoading, font: titleFont, textColor: serviceColor.primaryText), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) - - let backgroundSize = CGSize(width: size.size.width + 8.0 + 8.0, height: 20.0) - - return (ListViewItemNodeLayout(contentSize: CGSize(width: params.width, height: 20.0), insets: UIEdgeInsets(top: 4.0 + (dateAtBottom ? layoutConstants.timestampHeaderHeight : 0.0), left: 0.0, bottom: 4.0, right: 0.0)), { [weak self] in - if let strongSelf = self { - strongSelf.item = item - - if let updatedBackground = updatedBackground { - strongSelf.backgroundNode.image = updatedBackground - } - - let _ = apply() - - strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: floorToScreenPixels((params.width - backgroundSize.width) / 2.0), y: 0.0), size: backgroundSize) - strongSelf.labelNode.frame = CGRect(origin: CGPoint(x: strongSelf.backgroundNode.frame.origin.x + 8.0, y: floorToScreenPixels((backgroundSize.height - size.size.height) / 2.0)), size: size.size) - } - }) - } - } - - override public func animateAdded(_ currentTimestamp: Double, duration: Double) { - self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) - } - - override public func animateRemoved(_ currentTimestamp: Double, duration: Double) { - self.layer.animateAlpha(from: 1.0, to: 0.0, duration: duration * 0.5, removeOnCompletion: false) - } -} diff --git a/submodules/TelegramUI/Sources/ChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/ChatInputContextPanelNode.swift deleted file mode 100644 index 2ad8826833..0000000000 --- a/submodules/TelegramUI/Sources/ChatInputContextPanelNode.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation -import UIKit -import AsyncDisplayKit -import Display -import TelegramCore -import TelegramPresentationData -import TelegramUIPreferences -import AccountContext -import ChatPresentationInterfaceState -import ChatControllerInteraction - -enum ChatInputContextPanelPlacement { - case overPanels - case overTextInput -} - -class ChatInputContextPanelNode: ASDisplayNode { - let context: AccountContext - var interfaceInteraction: ChatPanelInterfaceInteraction? - var placement: ChatInputContextPanelPlacement = .overPanels - var theme: PresentationTheme - var fontSize: PresentationFontSize - - init(context: AccountContext, theme: PresentationTheme, strings: PresentationStrings, fontSize: PresentationFontSize, chatPresentationContext: ChatPresentationContext) { - self.context = context - self.theme = theme - self.fontSize = fontSize - - super.init() - } - - func updateLayout(size: CGSize, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState) { - } - - func animateOut(completion: @escaping () -> Void) { - completion() - } - - var topItemFrame: CGRect? { - return nil - } -} diff --git a/submodules/TelegramUI/Sources/ChatInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatInputPanelNode.swift deleted file mode 100644 index c93557a86b..0000000000 --- a/submodules/TelegramUI/Sources/ChatInputPanelNode.swift +++ /dev/null @@ -1,43 +0,0 @@ -import Foundation -import UIKit -import AsyncDisplayKit -import Display -import Postbox -import TelegramCore -import AccountContext -import ChatPresentationInterfaceState - -protocol ChatInputPanelViewForOverlayContent: UIView { - func maybeDismissContent(point: CGPoint) -} - -class ChatInputPanelNode: ASDisplayNode { - var context: AccountContext? - var interfaceInteraction: ChatPanelInterfaceInteraction? - var prevInputPanelNode: ChatInputPanelNode? - - var viewForOverlayContent: ChatInputPanelViewForOverlayContent? - - func updateAbsoluteRect(_ rect: CGRect, within containerSize: CGSize, transition: ContainedViewLayoutTransition) { - } - - func updateLayout(width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, bottomInset: CGFloat, additionalSideInsets: UIEdgeInsets, maxHeight: CGFloat, isSecondary: Bool, transition: ContainedViewLayoutTransition, interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics, isMediaInputExpanded: Bool) -> CGFloat { - return 0.0 - } - - func minimalHeight(interfaceState: ChatPresentationInterfaceState, metrics: LayoutMetrics) -> CGFloat { - return 0.0 - } - - func defaultHeight(metrics: LayoutMetrics) -> CGFloat { - if case .regular = metrics.widthClass, case .regular = metrics.heightClass { - return 49.0 - } else { - return 45.0 - } - } - - func canHandleTransition(from prevInputPanelNode: ChatInputPanelNode?) -> Bool { - return false - } -} diff --git a/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift b/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift index c3e28161a7..d6d9a21b33 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceInputContextPanels.swift @@ -4,6 +4,7 @@ import TelegramCore import AccountContext import ChatPresentationInterfaceState import ChatControllerInteraction +import ChatInputContextPanelNode private func inputQueryResultPriority(_ result: ChatPresentationInputQueryResult) -> (Int, Bool) { switch result { diff --git a/submodules/TelegramUI/Sources/ChatInterfaceInputNodes.swift b/submodules/TelegramUI/Sources/ChatInterfaceInputNodes.swift index 44a66da9e6..fcaad73f80 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceInputNodes.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceInputNodes.swift @@ -8,6 +8,8 @@ import ChatPresentationInterfaceState import ChatControllerInteraction import ChatInputNode import ChatEntityKeyboardInputNode +import ChatInputPanelNode +import ChatButtonKeyboardInputNode func inputNodeForChatPresentationIntefaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, context: AccountContext, currentNode: ChatInputNode?, interfaceInteraction: ChatPanelInterfaceInteraction?, controllerInteraction: ChatControllerInteraction, inputPanelNode: ChatInputPanelNode?, makeMediaInputNode: () -> ChatInputNode?) -> ChatInputNode? { if let inputPanelNode = inputPanelNode, !(inputPanelNode is ChatTextInputPanelNode) { diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift index a99524636c..cd68cbdd24 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift @@ -4,6 +4,9 @@ import AsyncDisplayKit import TelegramCore import AccountContext import ChatPresentationInterfaceState +import ChatInputPanelNode +import ChatBotStartInputPanelNode +import ChatChannelSubscriberInputPanelNode func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, context: AccountContext, currentPanel: ChatInputPanelNode?, currentSecondaryPanel: ChatInputPanelNode?, textInputPanelNode: ChatTextInputPanelNode?, interfaceInteraction: ChatPanelInterfaceInteraction?) -> (primary: ChatInputPanelNode?, secondary: ChatInputPanelNode?) { if let renderedPeer = chatPresentationInterfaceState.renderedPeer, renderedPeer.peer?.restrictionText(platform: "ios", contentSettings: context.currentContentSettings.with { $0 }) != nil { diff --git a/submodules/TelegramUI/Sources/ChatMessageItem.swift b/submodules/TelegramUI/Sources/ChatMessageItem.swift index 082473893b..6c8f9409b4 100644 --- a/submodules/TelegramUI/Sources/ChatMessageItem.swift +++ b/submodules/TelegramUI/Sources/ChatMessageItem.swift @@ -205,8 +205,6 @@ func chatItemsHaveCommonDateHeader(_ lhs: ListViewItem, _ rhs: ListViewItem?) - let rhsHeader: ChatMessageDateHeader? if let lhs = lhs as? ChatMessageItem { lhsHeader = lhs.dateHeader - } else if let _ = lhs as? ChatHoleItem { - lhsHeader = nil } else if let lhs = lhs as? ChatUnreadItem { lhsHeader = lhs.header } else if let lhs = lhs as? ChatReplyCountItem { @@ -217,9 +215,6 @@ func chatItemsHaveCommonDateHeader(_ lhs: ListViewItem, _ rhs: ListViewItem?) - if let rhs = rhs { if let rhs = rhs as? ChatMessageItem { rhsHeader = rhs.dateHeader - } else if let _ = rhs as? ChatHoleItem { - //rhsHeader = rhs.header - rhsHeader = nil } else if let rhs = rhs as? ChatUnreadItem { rhsHeader = rhs.header } else if let rhs = rhs as? ChatReplyCountItem { @@ -564,8 +559,6 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible { if bottom.header.id != self.dateHeader.id { dateAtBottom = true } - } else if let _ = bottom as? ChatHoleItem { - dateAtBottom = true } else { dateAtBottom = true } diff --git a/submodules/TelegramUI/Sources/ChatMessageReportInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatMessageReportInputPanelNode.swift index 507373f8a2..0348668a84 100644 --- a/submodules/TelegramUI/Sources/ChatMessageReportInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageReportInputPanelNode.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import AccountContext import AppBundle import ChatPresentationInterfaceState +import ChatInputPanelNode final class ChatMessageReportInputPanelNode: ChatInputPanelNode { private let reportButton: HighlightableButtonNode diff --git a/submodules/TelegramUI/Sources/ChatMessageSelectionInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatMessageSelectionInputPanelNode.swift index 68799369fc..2e62c8d310 100644 --- a/submodules/TelegramUI/Sources/ChatMessageSelectionInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageSelectionInputPanelNode.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import AccountContext import AppBundle import ChatPresentationInterfaceState +import ChatInputPanelNode final class ChatMessageSelectionInputPanelNode: ChatInputPanelNode { private let deleteButton: HighlightableButtonNode diff --git a/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift index f71207b47d..9ee9c0168b 100644 --- a/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift @@ -13,9 +13,10 @@ import AnimationUI import ManagedAnimationNode import ChatPresentationInterfaceState import ChatSendButtonRadialStatusNode +import AudioWaveformNode +import ChatInputPanelNode extension AudioWaveformNode: CustomMediaPlayerScrubbingForegroundNode { - } final class ChatRecordingPreviewInputPanelNode: ChatInputPanelNode { diff --git a/submodules/TelegramUI/Sources/ChatRestrictedInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatRestrictedInputPanelNode.swift index 25cad550c1..896d08eb1e 100644 --- a/submodules/TelegramUI/Sources/ChatRestrictedInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatRestrictedInputPanelNode.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramStringFormatting import ChatPresentationInterfaceState import TelegramPresentationData +import ChatInputPanelNode final class ChatRestrictedInputPanelNode: ChatInputPanelNode { private let textNode: ImmediateTextNode diff --git a/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift index 5f8c39dff3..c620d0e2c3 100644 --- a/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatSearchInputPanelNode.swift @@ -9,6 +9,7 @@ import TelegramNotices import TelegramPresentationData import ActivityIndicator import ChatPresentationInterfaceState +import ChatInputPanelNode private let labelFont = Font.regular(15.0) diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift index 377a8f710d..78897940cf 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift @@ -39,6 +39,7 @@ import TooltipUI import ChatTextInputMediaRecordingButton import ChatContextQuery import ChatInputTextNode +import ChatInputPanelNode private let accessoryButtonFont = Font.medium(14.0) private let counterFont = Font.with(size: 14.0, design: .regular, traits: [.monospacedNumbers]) diff --git a/submodules/TelegramUI/Sources/ChatUnblockInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatUnblockInputPanelNode.swift index 8d6fd461a2..354a82df60 100644 --- a/submodules/TelegramUI/Sources/ChatUnblockInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatUnblockInputPanelNode.swift @@ -7,6 +7,7 @@ import Postbox import SwiftSignalKit import TelegramPresentationData import ChatPresentationInterfaceState +import ChatInputPanelNode final class ChatUnblockInputPanelNode: ChatInputPanelNode { private let button: HighlightableButtonNode diff --git a/submodules/TelegramUI/Sources/CommandChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/CommandChatInputContextPanelNode.swift index adfad2e4b5..1e5fd7f7f6 100644 --- a/submodules/TelegramUI/Sources/CommandChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/CommandChatInputContextPanelNode.swift @@ -12,6 +12,7 @@ import ChatPresentationInterfaceState import ChatControllerInteraction import ItemListUI import ChatContextQuery +import ChatInputContextPanelNode private struct CommandChatInputContextPanelEntryStableId: Hashable { let command: PeerCommand diff --git a/submodules/TelegramUI/Sources/CommandMenuChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/CommandMenuChatInputContextPanelNode.swift index 0e0a6b9d25..a41da1c749 100644 --- a/submodules/TelegramUI/Sources/CommandMenuChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/CommandMenuChatInputContextPanelNode.swift @@ -12,6 +12,7 @@ import AccountContext import ChatPresentationInterfaceState import ChatControllerInteraction import ChatContextQuery +import ChatInputContextPanelNode private struct CommandMenuChatInputContextPanelEntryStableId: Hashable { let command: PeerCommand diff --git a/submodules/TelegramUI/Sources/DeleteChatInputPanelNode.swift b/submodules/TelegramUI/Sources/DeleteChatInputPanelNode.swift index f5fbf51104..4a456d3ee6 100644 --- a/submodules/TelegramUI/Sources/DeleteChatInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/DeleteChatInputPanelNode.swift @@ -6,6 +6,7 @@ import TelegramCore import Postbox import SwiftSignalKit import ChatPresentationInterfaceState +import ChatInputPanelNode final class DeleteChatInputPanelNode: ChatInputPanelNode { private let button: HighlightableButtonNode diff --git a/submodules/TelegramUI/Sources/DisabledContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/DisabledContextResultsChatInputContextPanelNode.swift index ff4f17d0b7..69025bf1fe 100644 --- a/submodules/TelegramUI/Sources/DisabledContextResultsChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/DisabledContextResultsChatInputContextPanelNode.swift @@ -9,6 +9,7 @@ import TelegramUIPreferences import AccountContext import ChatPresentationInterfaceState import ChatControllerInteraction +import ChatInputContextPanelNode final class DisabledContextResultsChatInputContextPanelNode: ChatInputContextPanelNode { private let containerNode: ASDisplayNode diff --git a/submodules/TelegramUI/Sources/EmojisChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/EmojisChatInputContextPanelNode.swift index cd8f5216be..80c2ecb74d 100644 --- a/submodules/TelegramUI/Sources/EmojisChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/EmojisChatInputContextPanelNode.swift @@ -21,6 +21,7 @@ import StickerPeekUI import UndoUI import Pasteboard import ChatContextQuery +import ChatInputContextPanelNode private enum EmojisChatInputContextPanelEntryStableId: Hashable, Equatable { case symbol(String) diff --git a/submodules/TelegramUI/Sources/HashtagChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/HashtagChatInputContextPanelNode.swift index 456025e761..e755628005 100644 --- a/submodules/TelegramUI/Sources/HashtagChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/HashtagChatInputContextPanelNode.swift @@ -13,6 +13,7 @@ import ItemListUI import ChatPresentationInterfaceState import ChatControllerInteraction import ChatContextQuery +import ChatInputContextPanelNode private struct HashtagChatInputContextPanelEntryStableId: Hashable { let text: String diff --git a/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift index c2daa7b013..0099449916 100644 --- a/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/HorizontalListContextResultsChatInputContextPanelNode.swift @@ -16,6 +16,8 @@ import ChatPresentationInterfaceState import UndoUI import PremiumUI import ChatControllerInteraction +import ChatContextResultPeekContent +import ChatInputContextPanelNode private struct ChatContextResultStableId: Hashable { let result: ChatContextResult diff --git a/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift b/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift index b64eb6a485..8d934b11f3 100755 --- a/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/HorizontalStickersChatContextPanelNode.swift @@ -16,6 +16,7 @@ import ChatPresentationInterfaceState import PremiumUI import UndoUI import ChatControllerInteraction +import ChatInputContextPanelNode final class HorizontalStickersChatContextPanelInteraction { var previewedStickerItem: TelegramMediaFile? diff --git a/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift b/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift index 22f646c30c..4ace9c8922 100644 --- a/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift +++ b/submodules/TelegramUI/Sources/InlineReactionSearchPanel.swift @@ -15,6 +15,7 @@ import ChatPresentationInterfaceState import PremiumUI import UndoUI import ChatControllerInteraction +import ChatInputContextPanelNode private final class InlineReactionSearchStickersNode: ASDisplayNode, UIScrollViewDelegate { private final class DisplayItem { diff --git a/submodules/TelegramUI/Sources/MentionChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/MentionChatInputContextPanelNode.swift index d30cf203bd..f13e9ea36f 100644 --- a/submodules/TelegramUI/Sources/MentionChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/MentionChatInputContextPanelNode.swift @@ -13,6 +13,7 @@ import ItemListUI import ChatPresentationInterfaceState import ChatControllerInteraction import ChatContextQuery +import ChatInputContextPanelNode private struct MentionChatInputContextPanelEntry: Comparable, Identifiable { let index: Int diff --git a/submodules/TelegramUI/Sources/SecretChatHandshakeStatusInputPanelNode.swift b/submodules/TelegramUI/Sources/SecretChatHandshakeStatusInputPanelNode.swift index 0dcdecc376..400e6bd8e3 100644 --- a/submodules/TelegramUI/Sources/SecretChatHandshakeStatusInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/SecretChatHandshakeStatusInputPanelNode.swift @@ -7,6 +7,7 @@ import Postbox import SwiftSignalKit import LocalizedPeerData import ChatPresentationInterfaceState +import ChatInputPanelNode final class SecretChatHandshakeStatusInputPanelNode: ChatInputPanelNode { private let button: HighlightableButtonNode diff --git a/submodules/TelegramUI/Sources/VerticalListContextResultsChatInputContextPanelNode.swift b/submodules/TelegramUI/Sources/VerticalListContextResultsChatInputContextPanelNode.swift index 9e8a8f9da6..d26978cc54 100644 --- a/submodules/TelegramUI/Sources/VerticalListContextResultsChatInputContextPanelNode.swift +++ b/submodules/TelegramUI/Sources/VerticalListContextResultsChatInputContextPanelNode.swift @@ -10,6 +10,7 @@ import AccountContext import SwiftSignalKit import ChatPresentationInterfaceState import ChatControllerInteraction +import ChatInputContextPanelNode private enum VerticalChatContextResultsEntryStableId: Hashable { case action diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index 3a43be9c1b..07fc2330dc 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -46,7 +46,7 @@ final class NetworkBroadcastPartSource: BroadcastPartSource { private var dataSource: AudioBroadcastDataSource? #if DEBUG - private let debugDumpDirectory = EngineTempBox.shared.tempDirectory() + private let debugDumpDirectory: EngineTempBox.Directory? #endif init(queue: Queue, engine: TelegramEngine, callId: Int64, accessHash: Int64, isExternalStream: Bool) { @@ -55,6 +55,10 @@ final class NetworkBroadcastPartSource: BroadcastPartSource { self.callId = callId self.accessHash = accessHash self.isExternalStream = isExternalStream + + #if DEBUG && true + self.debugDumpDirectory = EngineTempBox.shared.tempDirectory() + #endif } func requestTime(completion: @escaping (Int64) -> Void) -> Disposable { @@ -143,9 +147,10 @@ final class NetworkBroadcastPartSource: BroadcastPartSource { } |> deliverOn(self.queue) - /*#if DEBUG + #if DEBUG let debugDumpDirectory = self.debugDumpDirectory - #endif*/ + #endif + return signal.start(next: { result in guard let result = result else { completion(OngoingGroupCallBroadcastPart(timestampMilliseconds: timestampIdMilliseconds, responseTimestamp: Double(timestampIdMilliseconds), status: .notReady, oggData: Data())) @@ -154,11 +159,13 @@ final class NetworkBroadcastPartSource: BroadcastPartSource { let part: OngoingGroupCallBroadcastPart switch result.status { case let .data(dataValue): - /*#if DEBUG - let tempFilePath = debugDumpDirectory.path + "/\(timestampMilliseconds).mp4" - let _ = try? dataValue.subdata(in: 32 ..< dataValue.count).write(to: URL(fileURLWithPath: tempFilePath)) - print("Dump stream part: \(tempFilePath)") - #endif*/ + #if DEBUG + if let debugDumpDirectory { + let tempFilePath = debugDumpDirectory.path + "/\(timestampMilliseconds).mp4" + let _ = try? dataValue.subdata(in: 32 ..< dataValue.count).write(to: URL(fileURLWithPath: tempFilePath)) + print("Dump stream part: \(tempFilePath)") + } + #endif part = OngoingGroupCallBroadcastPart(timestampMilliseconds: timestampIdMilliseconds, responseTimestamp: result.responseTimestamp, status: .success, oggData: dataValue) case .notReady: part = OngoingGroupCallBroadcastPart(timestampMilliseconds: timestampIdMilliseconds, responseTimestamp: result.responseTimestamp, status: .notReady, oggData: Data())