-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
BetaToolsFooterView.swift
179 lines (139 loc) · 4.8 KB
/
BetaToolsFooterView.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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import Library
import Prelude
import UIKit
protocol BetaToolsFooterViewDelegate: AnyObject {
func betaToolsFooterViewDelegateDidTapFeedbackButton()
}
final class BetaToolsFooterView: UIView {
// MARK: - Properties
private let appVersionDetailTextView: UITextView = { UITextView(frame: .zero) }()
private let appVersionStackView: UIStackView = { UIStackView(frame: .zero) }()
private let appVersionTitleLabel: UILabel = { UILabel(frame: .zero) }()
private let betaFeedbackButton = UIButton(type: .custom)
private let deviceIdentifierDetailTextView: UITextView = { UITextView(frame: .zero) }()
private let deviceIdentifierStackView: UIStackView = { UIStackView(frame: .zero) }()
private let deviceIdentifierTitleLabel: UILabel = { UILabel(frame: .zero) }()
private let rootStackView: UIStackView = { UIStackView(frame: .zero) }()
internal weak var delegate: BetaToolsFooterViewDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
self.configureViews()
self.bindStyles()
self.setupConstraints()
self.betaFeedbackButton.addTarget(
self, action: #selector(self.betaFeedbackButtonTapped),
for: .touchUpInside
)
}
required init?(coder _: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Configuration
private func configureViews() {
_ = (self.rootStackView, self)
|> ksr_addSubviewToParent()
|> ksr_constrainViewToMarginsInParent()
_ = ([self.appVersionTitleLabel, self.appVersionDetailTextView], self.appVersionStackView)
|> ksr_addArrangedSubviewsToStackView()
_ = (
[self.deviceIdentifierTitleLabel, self.deviceIdentifierDetailTextView],
self.deviceIdentifierStackView
)
|> ksr_addArrangedSubviewsToStackView()
_ = (
[self.betaFeedbackButton, self.appVersionStackView, self.deviceIdentifierStackView],
self.rootStackView
)
|> ksr_addArrangedSubviewsToStackView()
}
private func setupConstraints() {
NSLayoutConstraint.activate([
self.betaFeedbackButton.heightAnchor
.constraint(greaterThanOrEqualToConstant: Styles.minTouchSize.height)
|> \.priority .~ .defaultHigh
])
}
// MARK: - Styles
override func bindStyles() {
super.bindStyles()
_ = self.appVersionDetailTextView
|> appVersionDetailTextViewStyle
_ = self.appVersionStackView
|> appVersionStackViewStyle
_ = self.appVersionTitleLabel
|> appVersionTitleLabelStyle
_ = self.betaFeedbackButton
|> betaFeedbackButtonStyle
_ = self.deviceIdentifierDetailTextView
|> deviceIdentifierDetailTextViewStyle
_ = self.deviceIdentifierStackView
|> deviceIdentifierStackViewStyle
_ = self.deviceIdentifierTitleLabel
|> deviceIdentifierTitleLabelStyle
_ = self.rootStackView
|> rootStackViewStyle
}
// MARK: - Selectors
@objc private func betaFeedbackButtonTapped() {
self.delegate?.betaToolsFooterViewDelegateDidTapFeedbackButton()
}
}
// MARK: - Styles
private let appVersionDetailTextViewStyle: TextViewStyle = { textView in
textView
|> baseTextViewStyle
|> \.text .~ AppEnvironment.current.mainBundle.appVersionString
}
private let appVersionStackViewStyle: StackViewStyle = { stackView in
stackView
|> verticalStackViewStyle
}
private let appVersionTitleLabelStyle: LabelStyle = { label in
label
|> baseTitleLabelStyle
|> \.text .~ (Strings.App_version() + ": ")
}
private let betaFeedbackButtonStyle: ButtonStyle = { button in
button
|> greenButtonStyle
|> UIButton.lens.title(for: .normal) .~ "Submit feedback for beta"
}
private let deviceIdentifierDetailTextViewStyle: TextViewStyle = { textView in
_ = textView
|> baseTextViewStyle
|> \.text .~ AppEnvironment.current.device.identifierForVendor?.uuidString
return textView
}
private let deviceIdentifierStackViewStyle: StackViewStyle = { stackView in
stackView
|> verticalStackViewStyle
}
private let deviceIdentifierTitleLabelStyle: LabelStyle = { label in
label
|> baseTitleLabelStyle
|> \.text .~ "Device identifier: "
}
private let rootStackViewStyle: StackViewStyle = { stackView in
stackView
|> verticalStackViewStyle
|> \.spacing .~ Styles.grid(2)
}
private let baseTextViewStyle: TextViewStyle = { textView in
_ = textView
|> \.font .~ .ksr_headline(size: 15)
|> \.textColor .~ .ksr_support_400
|> \.isScrollEnabled .~ false
_ = textView
|> \.textContainerInset .~ UIEdgeInsets.zero
|> \.textContainer.lineFragmentPadding .~ 0
|> \.isEditable .~ false
|> \.isUserInteractionEnabled .~ true
|> \.adjustsFontForContentSizeCategory .~ true
return textView
}
private let baseTitleLabelStyle: LabelStyle = { label in
label
|> \.textColor .~ .ksr_support_700
|> \.font .~ .ksr_subhead()
|> \.textAlignment .~ .left
}