-
Notifications
You must be signed in to change notification settings - Fork 384
/
Copy pathSelectLocationCoordinator.swift
139 lines (106 loc) · 4.35 KB
/
SelectLocationCoordinator.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
//
// SelectLocationCoordinator.swift
// MullvadVPN
//
// Created by pronebird on 29/01/2023.
// Copyright © 2023 Mullvad VPN AB. All rights reserved.
//
import MullvadREST
import MullvadTypes
import Routing
import UIKit
import MullvadSettings
class SelectLocationCoordinator: Coordinator, Presentable, Presenting, RelayCacheTrackerObserver {
private let tunnelManager: TunnelManager
private let relayCacheTracker: RelayCacheTracker
private var cachedRelays: CachedRelays?
let navigationController: UINavigationController
var presentedViewController: UIViewController {
navigationController
}
var selectLocationViewController: SelectLocationViewController? {
return navigationController.viewControllers.first {
$0 is SelectLocationViewController
} as? SelectLocationViewController
}
var relayFilter: RelayFilter {
switch tunnelManager.settings.relayConstraints.filter {
case .any:
return RelayFilter()
case let .only(filter):
return filter
}
}
var didFinish: ((SelectLocationCoordinator, RelayLocation?) -> Void)?
init(
navigationController: UINavigationController,
tunnelManager: TunnelManager,
relayCacheTracker: RelayCacheTracker
) {
self.navigationController = navigationController
self.tunnelManager = tunnelManager
self.relayCacheTracker = relayCacheTracker
}
func start() {
let selectLocationViewController = SelectLocationViewController()
selectLocationViewController.didSelectRelay = { [weak self] relay in
guard let self else { return }
var relayConstraints = tunnelManager.settings.relayConstraints
relayConstraints.locations = .only(RelayLocations(
locations: [relay],
customListId: nil
))
tunnelManager.updateSettings([.relayConstraints(relayConstraints)]) {
self.tunnelManager.startTunnel()
}
didFinish?(self, relay)
}
selectLocationViewController.navigateToFilter = { [weak self] in
guard let self else { return }
let coordinator = makeRelayFilterCoordinator(forModalPresentation: true)
coordinator.start()
presentChild(coordinator, animated: true)
}
selectLocationViewController.didUpdateFilter = { [weak self] filter in
guard let self else { return }
var relayConstraints = tunnelManager.settings.relayConstraints
relayConstraints.filter = .only(filter)
tunnelManager.updateSettings([.relayConstraints(relayConstraints)])
}
selectLocationViewController.didFinish = { [weak self] in
guard let self else { return }
didFinish?(self, nil)
}
relayCacheTracker.addObserver(self)
if let cachedRelays = try? relayCacheTracker.getCachedRelays() {
self.cachedRelays = cachedRelays
selectLocationViewController.setCachedRelays(cachedRelays, filter: relayFilter)
}
selectLocationViewController.relayLocation =
tunnelManager.settings.relayConstraints.locations.value?.locations.first
navigationController.pushViewController(selectLocationViewController, animated: false)
}
private func makeRelayFilterCoordinator(forModalPresentation isModalPresentation: Bool)
-> RelayFilterCoordinator {
let navigationController = CustomNavigationController()
let relayFilterCoordinator = RelayFilterCoordinator(
navigationController: navigationController,
tunnelManager: tunnelManager,
relayCacheTracker: relayCacheTracker
)
relayFilterCoordinator.didFinish = { [weak self] coordinator, filter in
if let cachedRelays = self?.cachedRelays, let filter {
self?.selectLocationViewController?.setCachedRelays(cachedRelays, filter: filter)
}
coordinator.dismiss(animated: true)
}
return relayFilterCoordinator
}
func relayCacheTracker(
_ tracker: RelayCacheTracker,
didUpdateCachedRelays cachedRelays: CachedRelays
) {
self.cachedRelays = cachedRelays
selectLocationViewController?.setCachedRelays(cachedRelays, filter: relayFilter)
}
}