Newer
Older
final class SearchRightController: UIViewController {
@Dependency var coordinator: SearchCoordinating
lazy private var screenView = SearchRightView()
private var cancellables = Set<AnyCancellable>()
private let cameraController = CameraController()
override func loadView() {
view = screenView
}
override func viewDidLoad() {
super.viewDidLoad()
screenView.layer.insertSublayer(cameraController.previewLayer, at: 0)
setupBindings()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
cameraController.previewLayer.frame = screenView.bounds
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
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
private func setupBindings() {
cameraController
.dataPublisher
.receive(on: DispatchQueue.main)
.sink { [unowned self] in viewModel.didScan(data: $0) }
.store(in: &cancellables)
viewModel.cameraSemaphorePublisher
.removeDuplicates()
.receive(on: DispatchQueue.global())
.sink { [unowned self] setOn in
if setOn {
cameraController.start()
} else {
cameraController.stop()
}
}.store(in: &cancellables)
viewModel.foundPublisher
.receive(on: DispatchQueue.main)
.delay(for: 1, scheduler: DispatchQueue.main)
.sink { [unowned self] in coordinator.toContact($0, from: self) }
.store(in: &cancellables)
viewModel.statusPublisher
.receive(on: DispatchQueue.main)
.removeDuplicates()
.sink { [unowned self] in screenView.update(status: $0) }
.store(in: &cancellables)
screenView.actionButton
.publisher(for: .touchUpInside)
.receive(on: DispatchQueue.main)
.sink { [unowned self] in
switch viewModel.statusSubject.value {
case .failed(.cameraPermission):
guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
UIApplication.shared.open(url, options: [:])
case .failed(.requestOpened):
coordinator.toRequests(from: self)
case .failed(.alreadyFriends):
coordinator.toContacts(from: self)
default:
break
}
}.store(in: &cancellables)