-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCLEViewController.swift
More file actions
62 lines (53 loc) · 2.32 KB
/
CLEViewController.swift
File metadata and controls
62 lines (53 loc) · 2.32 KB
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
import UIKit
import Combine
final class CLEViewController<ContentViewState: Equatable>: UIViewController {
private let viewModel: CLEViewModel<ContentViewState>
private let contentViewControllerBuilder: (ContentViewState) -> UIViewController
private let errorViewControllerBuilder: (@escaping () -> Void) -> UIViewController
private let loadingViewControllerBuilder: () -> UIViewController
private var cancellables = Set<AnyCancellable>()
init(
viewModel: CLEViewModel<ContentViewState>,
contentViewControllerBuilder: @escaping (ContentViewState) -> UIViewController,
errorViewControllerBuilder: @escaping (@escaping () -> Void) -> UIViewController,
loadingViewControllerBuilder: @escaping () -> UIViewController
) {
self.viewModel = viewModel
self.contentViewControllerBuilder = contentViewControllerBuilder
self.errorViewControllerBuilder = errorViewControllerBuilder
self.loadingViewControllerBuilder = loadingViewControllerBuilder
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .clear
viewModel.viewStatePublisher
.map { [unowned self] state -> UIViewController in
switch state {
case let .content(contentViewState):
return self.contentViewControllerBuilder(contentViewState)
case .loading:
return self.loadingViewControllerBuilder()
case .error:
return self.errorViewControllerBuilder(self.viewModel.fetchData)
}
}
.receive(on: DispatchQueue.main)
.sink { [weak self] viewController in
self?.children.forEach { $0.detach() }
self?.embed(viewController: viewController)
self?.setNeedsStatusBarAppearanceUpdate()
}
.store(in: &cancellables)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
viewModel.fetchData()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
children.first?.preferredStatusBarStyle ?? .default
}
}