Swiftgram/TelegramUI/SecureIdAuthHeaderNode.swift
Peter Iakovlev aa60d76fd8 no message
2018-03-27 12:03:25 +04:00

132 lines
6.4 KiB
Swift

import Foundation
import AsyncDisplayKit
import Display
import Postbox
import TelegramCore
import SwiftSignalKit
private let avatarFont: UIFont = UIFont(name: "ArialRoundedMTBold", size: 26.0)!
private let titleFont: UIFont = Font.semibold(16.0)
private let textFont: UIFont = Font.regular(16.0)
final class SecureIdAuthHeaderNode: ASDisplayNode {
private let account: Account
private let theme: PresentationTheme
private let strings: PresentationStrings
private let accountAvatarContainerNode: ASDisplayNode
private let accountAvatarNode: AvatarNode
private let serviceAvatarNode: AvatarNode
private let titleNode: ImmediateTextNode
private let textNode: ImmediateTextNode
private var verificationState: SecureIdAuthControllerVerificationState?
init(account: Account, theme: PresentationTheme, strings: PresentationStrings) {
self.account = account
self.theme = theme
self.strings = strings
self.accountAvatarContainerNode = ASDisplayNode()
self.accountAvatarNode = AvatarNode(font: avatarFont)
self.serviceAvatarNode = AvatarNode(font: avatarFont)
self.titleNode = ImmediateTextNode()
self.titleNode.maximumNumberOfLines = 0
self.titleNode.textAlignment = .center
self.textNode = ImmediateTextNode()
self.textNode.maximumNumberOfLines = 0
self.textNode.textAlignment = .center
super.init()
self.accountAvatarContainerNode.addSubnode(self.accountAvatarNode)
self.addSubnode(self.accountAvatarContainerNode)
self.addSubnode(self.serviceAvatarNode)
self.addSubnode(self.titleNode)
self.addSubnode(self.textNode)
}
func updateState(formData: SecureIdEncryptedFormData, verificationState: SecureIdAuthControllerVerificationState) {
self.accountAvatarNode.setPeer(account: self.account, peer: formData.accountPeer)
self.serviceAvatarNode.setPeer(account: self.account, peer: formData.servicePeer)
self.verificationState = verificationState
self.titleNode.attributedText = NSAttributedString(string: self.strings.SecureId_RequestTitle(formData.servicePeer.displayTitle, formData.servicePeer.displayTitle).0, font: titleFont, textColor: self.theme.list.freeTextColor)
var scopeText = ""
for i in 0 ..< formData.form.requestedFields.count {
if !scopeText.isEmpty {
if i == formData.form.requestedFields.count - 1 {
scopeText.append(self.strings.SecureId_RequestScopeLastJoiner)
} else {
scopeText.append(", ")
}
}
switch formData.form.requestedFields[i] {
case .identity:
scopeText.append(self.strings.SecureId_RequestScopeIdentity)
case .address:
scopeText.append(self.strings.SecureId_RequestScopeAddress)
case .phone:
scopeText.append(self.strings.SecureId_RequestScopePhone)
case .email:
scopeText.append(self.strings.SecureId_RequestScopeEmail)
}
}
self.textNode.attributedText = NSAttributedString(string: self.strings.SecureId_RequestText(scopeText).0, font: textFont, textColor: self.theme.list.freeTextColor)
}
func updateLayout(width: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
var isVerified = false
if let verificationState = self.verificationState, case .verified = verificationState {
isVerified = true
}
let avatarSize = CGSize(width: 70.0, height: 70.0)
if isVerified {
transition.updateAlpha(node: self.accountAvatarContainerNode, alpha: 0.0)
transition.updateSublayerTransformScale(node: self.accountAvatarContainerNode, scale: 0.3)
transition.updateFrame(node: self.accountAvatarNode, frame: CGRect(origin: CGPoint(), size: avatarSize))
let serviceAvatarFrame = CGRect(origin: CGPoint(x: floor((width - avatarSize.width) / 2.0), y: 0.0), size: avatarSize)
transition.updateFrame(node: self.serviceAvatarNode, frame: serviceAvatarFrame)
transition.updateFrame(node: self.accountAvatarContainerNode, frame: serviceAvatarFrame)
} else {
transition.updateAlpha(node: self.accountAvatarContainerNode, alpha: 1.0)
transition.updateSublayerTransformScale(node: self.accountAvatarContainerNode, scale: 1.0)
let avatarSeparation: CGFloat = 44.0
let avatarsWidth = avatarSize.width * 2.0 + avatarSeparation
transition.updateFrame(node: self.accountAvatarContainerNode, frame: CGRect(origin: CGPoint(x: floor((width - avatarsWidth) / 2.0), y: 0.0), size: avatarSize))
transition.updateFrame(node: self.accountAvatarNode, frame: CGRect(origin: CGPoint(), size: avatarSize))
transition.updateFrame(node: self.serviceAvatarNode, frame: CGRect(origin: CGPoint(x: floor((width - avatarsWidth) / 2.0 + avatarSize.width + avatarSeparation), y: 0.0), size: avatarSize))
}
let avatarTitleSpacing: CGFloat = 27.0
let titleTextSpacing: CGFloat = 8.0
let titleSize = self.titleNode.updateLayout(CGSize(width: width - 20.0, height: 1000.0))
let textSize = self.textNode.updateLayout(CGSize(width: width - 20.0, height: 1000.0))
let titleFrame = CGRect(origin: CGPoint(x: floor((width - titleSize.width) / 2.0), y: avatarSize.height + avatarTitleSpacing), size: titleSize)
ContainedViewLayoutTransition.immediate.updateFrame(node: self.titleNode, frame: titleFrame)
let textFrame = CGRect(origin: CGPoint(x: floor((width - textSize.width) / 2.0), y: titleFrame.maxY + titleTextSpacing), size: textSize)
ContainedViewLayoutTransition.immediate.updateFrame(node: self.textNode, frame: textFrame)
var resultHeight: CGFloat = avatarSize.height + avatarTitleSpacing + titleSize.height
if isVerified {
transition.updateAlpha(node: self.textNode, alpha: 0.0)
} else {
transition.updateAlpha(node: self.textNode, alpha: 1.0)
resultHeight += titleTextSpacing + textSize.height
}
return resultHeight
}
}