-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
Copy pathAuthorizationSequenceEmailEntryController.swift
137 lines (106 loc) · 4.78 KB
/
AuthorizationSequenceEmailEntryController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import Foundation
import UIKit
import Display
import AsyncDisplayKit
import TelegramPresentationData
import ProgressNavigationButtonNode
public final class AuthorizationSequenceEmailEntryController: ViewController {
public enum Mode {
case setup
case change
}
private let mode: Mode
private var controllerNode: AuthorizationSequenceEmailEntryControllerNode {
return self.displayNode as! AuthorizationSequenceEmailEntryControllerNode
}
private var validLayout: ContainerViewLayout?
private let presentationData: PresentationData
public var proceedWithEmail: ((String) -> Void)?
public var signInWithApple: (() -> Void)?
private let hapticFeedback = HapticFeedback()
private var appleSignInAllowed = false
public var inProgress: Bool = false {
didSet {
self.updateNavigationItems()
self.controllerNode.inProgress = self.inProgress
}
}
public init(presentationData: PresentationData, mode: Mode, back: @escaping () -> Void) {
self.presentationData = presentationData
self.mode = mode
super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: AuthorizationSequenceController.navigationBarTheme(presentationData.theme), strings: NavigationBarStrings(presentationStrings: presentationData.strings)))
self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait)
self.hasActiveInput = true
self.statusBar.statusBarStyle = presentationData.theme.intro.statusBarStyle.style
self.attemptNavigation = { _ in
return false
}
self.navigationBar?.backPressed = {
back()
}
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override public func loadDisplayNode() {
self.displayNode = AuthorizationSequenceEmailEntryControllerNode(strings: self.presentationData.strings, theme: self.presentationData.theme, mode: self.mode)
self.displayNodeDidLoad()
self.controllerNode.view.disableAutomaticKeyboardHandling = [.forward, .backward]
self.controllerNode.proceedWithEmail = { [weak self] _ in
self?.nextPressed()
}
self.controllerNode.signInWithApple = { [weak self] in
self?.signInWithApple?()
}
self.controllerNode.updateData(appleSignInAllowed: self.appleSignInAllowed)
}
override public func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.controllerNode.activateInput()
}
func updateNavigationItems() {
guard let layout = self.validLayout, layout.size.width < 360.0 else {
return
}
if self.inProgress {
let item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: self.presentationData.theme.rootController.navigationBar.accentTextColor))
self.navigationItem.rightBarButtonItem = item
} else {
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Next, style: .done, target: self, action: #selector(self.nextPressed))
}
}
public func updateData(appleSignInAllowed: Bool) {
var appleSignInAllowed = appleSignInAllowed
if #available(iOS 13.0, *) {
} else {
appleSignInAllowed = false
}
if self.appleSignInAllowed != appleSignInAllowed {
self.appleSignInAllowed = appleSignInAllowed
if self.isNodeLoaded {
self.controllerNode.updateData(appleSignInAllowed: appleSignInAllowed)
}
}
}
override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
super.containerLayoutUpdated(layout, transition: transition)
let hadLayout = self.validLayout != nil
self.validLayout = layout
if !hadLayout {
self.updateNavigationItems()
}
self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationLayout(layout: layout).navigationFrame.maxY, transition: transition)
}
@objc private func nextPressed() {
if self.controllerNode.currentEmail.isEmpty {
if self.appleSignInAllowed {
self.signInWithApple?()
} else {
self.hapticFeedback.error()
self.controllerNode.animateError()
}
} else {
self.proceedWithEmail?(self.controllerNode.currentEmail)
}
}
}