-
Notifications
You must be signed in to change notification settings - Fork 5
/
LoadErrorViewController.swift
130 lines (107 loc) · 3.86 KB
/
LoadErrorViewController.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
//
// LoadErrorViewController.swift
//
// Made with ❤️ by Novum
//
// Copyright © Telefonica. All rights reserved.
//
import UIKit
/// Manages the view hierarchy for the load error view.
public class LoadErrorViewController: UIViewController {
// MARK: - Properties
public weak var delegate: LoadErrorViewControllerDelegate?
public weak var lifecycleDelegate: LoadErrorViewControllerLifecycleDelegate?
private let titleTextLabel = UILabel()
private let descriptionLabel = UILabel()
private let actionButton: Button
private let titleText: String?
private let descriptionText: String
private let showActionButton: Bool
public init(title: String?,
descriptionText: String,
actionButtonTitle: String,
showActionButton: Bool) {
titleText = title
self.descriptionText = descriptionText
self.showActionButton = showActionButton
actionButton = Button(style: .secondary, title: actionButtonTitle)
super.init(nibName: nil, bundle: Bundle(for: type(of: self)))
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Lifecycle
override public func viewDidLoad() {
super.viewDidLoad()
setUp()
}
override public func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
lifecycleDelegate?.loadErrorViewControllerDidAppear(self)
}
override public var preferredStatusBarStyle: UIStatusBarStyle {
MisticaConfig.brandStyle.preferredStatusBarStyle
}
}
public extension LoadErrorViewController {
func addActivityIndicatorToRetryButton() {
actionButton.isLoading = true
}
func removeActivityIndicatorFromRetryButton() {
actionButton.isLoading = false
}
}
private extension LoadErrorViewController {
enum Constants {
static let contentInset: CGFloat = 24
static let verticalSpacing: CGFloat = 16
}
func setUp() {
view.backgroundColor = .background
setUpTitleText()
setUpDescriptionText()
setUpRetryButton()
setUpStackView()
}
func setUpTitleText() {
titleTextLabel.font = .textPreset4(weight: .cardTitle)
titleTextLabel.textColor = .textPrimary
titleTextLabel.textAlignment = .center
titleTextLabel.numberOfLines = 0
titleTextLabel.text = titleText
}
func setUpDescriptionText() {
descriptionLabel.font = .textPreset3(weight: .regular)
descriptionLabel.textColor = .textSecondary
descriptionLabel.textAlignment = .center
descriptionLabel.numberOfLines = 0
descriptionLabel.text = descriptionText
}
func setUpRetryButton() {
actionButton.addTarget(self, action: #selector(didTapRetryButton), for: .touchUpInside)
}
func setUpStackView() {
var subViews: [UIView] = []
if titleText != nil {
subViews.append(titleTextLabel)
}
subViews.append(descriptionLabel)
if showActionButton {
subViews.append(actionButton)
}
let stackView = UIStackView(arrangedSubviews: subViews)
stackView.axis = .vertical
stackView.spacing = Constants.verticalSpacing
stackView.alignment = .center
view.addSubview(stackView, constraints: [
stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: Constants.contentInset),
stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -Constants.contentInset),
stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
@objc func didTapRetryButton() {
assert(delegate != nil, "Delegate of LoadErrorViewController is nil.")
delegate?.loadErrorViewControllerDidTapRetry(self)
}
}