mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-15 21:45:19 +00:00
119 lines
4.9 KiB
Swift
119 lines
4.9 KiB
Swift
import Foundation
|
|
import UIKit
|
|
import AsyncDisplayKit
|
|
import Display
|
|
import TelegramCore
|
|
import SwiftSignalKit
|
|
import TelegramPresentationData
|
|
import AccountContext
|
|
|
|
final class InstantPageFeedbackNode: ASDisplayNode, InstantPageNode {
|
|
private let context: AccountContext
|
|
let webPage: TelegramMediaWebpage
|
|
private let openUrl: (InstantPageUrlItem) -> Void
|
|
|
|
private let highlightedBackgroundNode: ASDisplayNode
|
|
private let buttonNode: HighlightableButtonNode
|
|
private let labelNode: ASTextNode
|
|
private let viewsNode: ASTextNode
|
|
|
|
private let resolveDisposable = MetaDisposable()
|
|
|
|
init(context: AccountContext, strings: PresentationStrings, theme: InstantPageTheme, webPage: TelegramMediaWebpage, openUrl: @escaping (InstantPageUrlItem) -> Void) {
|
|
self.context = context
|
|
self.webPage = webPage
|
|
self.openUrl = openUrl
|
|
|
|
self.highlightedBackgroundNode = ASDisplayNode()
|
|
self.highlightedBackgroundNode.isLayerBacked = true
|
|
self.highlightedBackgroundNode.alpha = 0.0
|
|
|
|
self.buttonNode = HighlightableButtonNode()
|
|
|
|
self.labelNode = ASTextNode()
|
|
self.labelNode.isLayerBacked = true
|
|
self.labelNode.maximumNumberOfLines = 2
|
|
|
|
self.viewsNode = ASTextNode()
|
|
self.viewsNode.isLayerBacked = true
|
|
self.viewsNode.maximumNumberOfLines = 2
|
|
|
|
super.init()
|
|
|
|
if case let .Loaded(content) = webPage.content, let views = content.instantPage?.views {
|
|
self.viewsNode.attributedText = NSAttributedString(string: strings.InstantPage_Views(views), font: Font.regular(13.0), textColor: theme.panelSecondaryColor)
|
|
}
|
|
|
|
self.addSubnode(self.highlightedBackgroundNode)
|
|
self.addSubnode(self.buttonNode)
|
|
self.addSubnode(self.labelNode)
|
|
self.addSubnode(self.viewsNode)
|
|
|
|
self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside)
|
|
|
|
self.buttonNode.highligthedChanged = { [weak self] highlighted in
|
|
if let strongSelf = self {
|
|
if highlighted {
|
|
strongSelf.labelNode.layer.removeAnimation(forKey: "opacity")
|
|
strongSelf.labelNode.alpha = 0.4
|
|
} else {
|
|
strongSelf.labelNode.alpha = 1.0
|
|
strongSelf.labelNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
|
|
}
|
|
}
|
|
}
|
|
|
|
self.update(strings: strings, theme: theme)
|
|
}
|
|
|
|
deinit {
|
|
self.resolveDisposable.dispose()
|
|
}
|
|
|
|
@objc func buttonPressed() {
|
|
self.resolveDisposable.set((self.context.engine.peers.resolvePeerByName(name: "previews") |> deliverOnMainQueue).start(next: { [weak self] peer in
|
|
if let strongSelf = self, let _ = peer, let webPageId = strongSelf.webPage.id?.id {
|
|
strongSelf.openUrl(InstantPageUrlItem(url: "https://t.me/previews?start=webpage\(webPageId)", webpageId: nil))
|
|
}
|
|
}))
|
|
}
|
|
|
|
override func layout() {
|
|
super.layout()
|
|
|
|
let size = self.bounds.size
|
|
let inset: CGFloat = 16.0
|
|
|
|
self.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: size.width, height: size.height + UIScreenPixel))
|
|
|
|
|
|
let viewsSize = self.viewsNode.measure(CGSize(width: size.width - inset * 2.0, height: size.height))
|
|
self.viewsNode.frame = CGRect(origin: CGPoint(x: inset, y: floorToScreenPixels((size.height - viewsSize.height) / 2.0)), size: viewsSize)
|
|
|
|
let labelSize = self.labelNode.measure(CGSize(width: size.width - inset * 2.0, height: size.height))
|
|
self.labelNode.frame = CGRect(origin: CGPoint(x: size.width - labelSize.width - inset, y: floorToScreenPixels((size.height - labelSize.height) / 2.0)), size: labelSize)
|
|
|
|
self.buttonNode.frame = CGRect(origin: CGPoint(x: size.width - labelSize.width - inset * 2.0, y: 0.0), size: size)
|
|
}
|
|
|
|
func updateIsVisible(_ isVisible: Bool) {
|
|
}
|
|
|
|
func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) {
|
|
}
|
|
|
|
func transitionNode(media: InstantPageMedia) -> (ASDisplayNode, CGRect, () -> (UIView?, UIView?))? {
|
|
return nil
|
|
}
|
|
|
|
func updateHiddenMedia(media: InstantPageMedia?) {
|
|
}
|
|
|
|
func update(strings: PresentationStrings, theme: InstantPageTheme) {
|
|
self.backgroundColor = theme.panelBackgroundColor
|
|
self.highlightedBackgroundNode.backgroundColor = theme.panelHighlightedBackgroundColor
|
|
self.labelNode.attributedText = NSAttributedString(string: strings.InstantPage_FeedbackButtonShort, font: Font.regular(13.0), textColor: theme.panelSecondaryColor)
|
|
self.viewsNode.attributedText = NSAttributedString(string: self.viewsNode.attributedText?.string ?? "", font: Font.regular(13.0), textColor: theme.panelSecondaryColor)
|
|
}
|
|
}
|