import Foundation import UIKit import Display import AsyncDisplayKit import SwiftSignalKit import Postbox import TelegramCore import TelegramPresentationData import TelegramUIPreferences import AccountContext public final class AdInfoScreen: ViewController { private final class Node: ViewControllerTracingNode { private weak var controller: AdInfoScreen? private let context: AccountContext private var presentationData: PresentationData private let titleNode: ImmediateTextNode private final class LinkNode: HighlightableButtonNode { private let backgroundNode: ASImageNode private let textNode: ImmediateTextNode private let action: () -> Void init(text: String, color: UIColor, action: @escaping () -> Void) { self.action = action self.backgroundNode = ASImageNode() self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 10.0, color: nil, strokeColor: color, strokeWidth: 1.0, backgroundColor: nil) self.textNode = ImmediateTextNode() self.textNode.maximumNumberOfLines = 1 self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(16.0), textColor: color) super.init() self.addSubnode(self.backgroundNode) self.addSubnode(self.textNode) self.addTarget(self, action:#selector(self.pressed), forControlEvents: .touchUpInside) } @objc private func pressed() { self.action() } func update(width: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat { let size = CGSize(width: width, height: 44.0) transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size)) let textSize = self.textNode.updateLayout(CGSize(width: width - 8.0 * 2.0, height: 44.0)) transition.updateFrameAdditiveToCenter(node: self.textNode, frame: CGRect(origin: CGPoint(x: floor((size.width - textSize.width) / 2.0), y: floor((size.height - textSize.height) / 2.0)), size: textSize)) return size.height } } private enum Item { case text(ImmediateTextNode) case link(LinkNode) } private let items: [Item] private let scrollNode: ASScrollNode init(controller: AdInfoScreen, context: AccountContext) { self.controller = controller self.context = context self.presentationData = context.sharedContext.currentPresentationData.with { $0 } self.titleNode = ImmediateTextNode() self.titleNode.maximumNumberOfLines = 1 self.titleNode.attributedText = NSAttributedString(string: self.presentationData.strings.SponsoredMessageInfoScreen_Title, font: NavigationBar.titleFont, textColor: self.presentationData.theme.rootController.navigationBar.primaryTextColor) self.scrollNode = ASScrollNode() self.scrollNode.view.showsVerticalScrollIndicator = true self.scrollNode.view.showsHorizontalScrollIndicator = false self.scrollNode.view.scrollsToTop = true self.scrollNode.view.delaysContentTouches = false self.scrollNode.view.canCancelContentTouches = true if #available(iOS 11.0, *) { self.scrollNode.view.contentInsetAdjustmentBehavior = .never } var openUrl: (() -> Void)? let rawText = self.presentationData.strings.SponsoredMessageInfoScreen_Text var items: [Item] = [] var didAddUrl = false for component in rawText.components(separatedBy: "[url]") { var itemText = component if itemText.hasPrefix("\n") { itemText = String(itemText[itemText.index(itemText.startIndex, offsetBy: 1)...]) } if itemText.hasSuffix("\n") { itemText = String(itemText[..