Skip to content

Commit 2a3efd6

Browse files
committed
Add locations to custom list
1 parent 861f497 commit 2a3efd6

15 files changed

+679
-47
lines changed

ios/MullvadVPN.xcodeproj/project.pbxproj

+16
Original file line numberDiff line numberDiff line change
@@ -809,13 +809,17 @@
809809
E1187ABD289BBB850024E748 /* OutOfTimeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */; };
810810
E158B360285381C60002F069 /* String+AccountFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = E158B35F285381C60002F069 /* String+AccountFormatting.swift */; };
811811
E1FD0DF528AA7CE400299DB4 /* StatusActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FD0DF428AA7CE400299DB4 /* StatusActivityView.swift */; };
812+
F006CCFC2B99CC8400C6C2AC /* EditLocationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F006CCFB2B99CC8400C6C2AC /* EditLocationsCoordinator.swift */; };
812813
F0164EBA2B4456D30020268D /* AccessMethodRepositoryStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EB92B4456D30020268D /* AccessMethodRepositoryStub.swift */; };
813814
F0164EBC2B482E430020268D /* AppStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EBB2B482E430020268D /* AppStorage.swift */; };
814815
F0164EBE2B4BFF940020268D /* ShadowsocksLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EBD2B4BFF940020268D /* ShadowsocksLoader.swift */; };
815816
F0164EC32B4C49D30020268D /* ShadowsocksLoaderStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EC22B4C49D30020268D /* ShadowsocksLoaderStub.swift */; };
816817
F0164ED12B4F2DCB0020268D /* AccessMethodIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164ED02B4F2DCB0020268D /* AccessMethodIterator.swift */; };
817818
F028A56A2A34D4E700C0CAA3 /* RedeemVoucherViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */; };
818819
F028A56C2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */; };
820+
F02F41A02B9723AF00625A4F /* AddLocationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419A2B9723AE00625A4F /* AddLocationsViewController.swift */; };
821+
F02F41A12B9723AF00625A4F /* AddLocationsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419B2B9723AE00625A4F /* AddLocationsDataSource.swift */; };
822+
F02F41A22B9723AF00625A4F /* AddLocationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419C2B9723AF00625A4F /* AddLocationsCoordinator.swift */; };
819823
F02F41A42B9723AF00625A4F /* AddLocationCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419E2B9723AF00625A4F /* AddLocationCellViewModel.swift */; };
820824
F02F41A52B9723AF00625A4F /* AddLocationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419F2B9723AF00625A4F /* AddLocationCell.swift */; };
821825
F03580252A13842C00E5DAFD /* IncreasedHitButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */; };
@@ -1958,13 +1962,17 @@
19581962
E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeContentView.swift; sourceTree = "<group>"; };
19591963
E158B35F285381C60002F069 /* String+AccountFormatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+AccountFormatting.swift"; sourceTree = "<group>"; };
19601964
E1FD0DF428AA7CE400299DB4 /* StatusActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusActivityView.swift; sourceTree = "<group>"; };
1965+
F006CCFB2B99CC8400C6C2AC /* EditLocationsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditLocationsCoordinator.swift; sourceTree = "<group>"; };
19611966
F0164EB92B4456D30020268D /* AccessMethodRepositoryStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessMethodRepositoryStub.swift; sourceTree = "<group>"; };
19621967
F0164EBB2B482E430020268D /* AppStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStorage.swift; sourceTree = "<group>"; };
19631968
F0164EBD2B4BFF940020268D /* ShadowsocksLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksLoader.swift; sourceTree = "<group>"; };
19641969
F0164EC22B4C49D30020268D /* ShadowsocksLoaderStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksLoaderStub.swift; sourceTree = "<group>"; };
19651970
F0164ED02B4F2DCB0020268D /* AccessMethodIterator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessMethodIterator.swift; sourceTree = "<group>"; };
19661971
F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedeemVoucherViewController.swift; sourceTree = "<group>"; };
19671972
F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCreditSucceededViewController.swift; sourceTree = "<group>"; };
1973+
F02F419A2B9723AE00625A4F /* AddLocationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationsViewController.swift; sourceTree = "<group>"; };
1974+
F02F419B2B9723AE00625A4F /* AddLocationsDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationsDataSource.swift; sourceTree = "<group>"; };
1975+
F02F419C2B9723AF00625A4F /* AddLocationsCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationsCoordinator.swift; sourceTree = "<group>"; };
19681976
F02F419E2B9723AF00625A4F /* AddLocationCellViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationCellViewModel.swift; sourceTree = "<group>"; };
19691977
F02F419F2B9723AF00625A4F /* AddLocationCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationCell.swift; sourceTree = "<group>"; };
19701978
F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncreasedHitButton.swift; sourceTree = "<group>"; };
@@ -3495,6 +3503,9 @@
34953503
7A6389D72B7E3BD6008E77E1 /* AddCustomListCoordinator.swift */,
34963504
F02F419F2B9723AF00625A4F /* AddLocationCell.swift */,
34973505
F02F419E2B9723AF00625A4F /* AddLocationCellViewModel.swift */,
3506+
F02F419C2B9723AF00625A4F /* AddLocationsCoordinator.swift */,
3507+
F02F419B2B9723AE00625A4F /* AddLocationsDataSource.swift */,
3508+
F02F419A2B9723AE00625A4F /* AddLocationsViewController.swift */,
34983509
7A6389D22B7E3BD6008E77E1 /* CustomListCellConfiguration.swift */,
34993510
7A6389D42B7E3BD6008E77E1 /* CustomListDataSourceConfiguration.swift */,
35003511
7A6389DA2B7E3BD6008E77E1 /* CustomListInteractor.swift */,
@@ -3504,6 +3515,7 @@
35043515
7A6389E62B7E42BE008E77E1 /* CustomListViewController.swift */,
35053516
7A6389D32B7E3BD6008E77E1 /* CustomListViewModel.swift */,
35063517
7A6389E42B7E4247008E77E1 /* EditCustomListCoordinator.swift */,
3518+
F006CCFB2B99CC8400C6C2AC /* EditLocationsCoordinator.swift */,
35073519
7AB2B66F2BA1EB8C00B03E3B /* ListCustomListCoordinator.swift */,
35083520
7AB2B66E2BA1EB8C00B03E3B /* ListCustomListViewController.swift */,
35093521
);
@@ -5205,6 +5217,7 @@
52055217
58EE2E3B272FF814003BFF93 /* SettingsDataSourceDelegate.swift in Sources */,
52065218
5823FA5426CE49F700283BF8 /* TunnelObserver.swift in Sources */,
52075219
5888AD87227B17950051EB06 /* LocationViewController.swift in Sources */,
5220+
F006CCFC2B99CC8400C6C2AC /* EditLocationsCoordinator.swift in Sources */,
52085221
58293FB3251241B4005D0BB5 /* CustomTextView.swift in Sources */,
52095222
586A950E290125F3007BAF2B /* ProductsRequestOperation.swift in Sources */,
52105223
7AF9BE902A39F26000DBFEDB /* Collection+Sorting.swift in Sources */,
@@ -5281,6 +5294,7 @@
52815294
5878A26F2907E7E00096FC88 /* ProblemReportInteractor.swift in Sources */,
52825295
7AB4CCBB2B691BBB006037F5 /* IPOverrideInteractor.swift in Sources */,
52835296
7A3353912AAA014400F0A71C /* SimulatorVPNConnection.swift in Sources */,
5297+
F02F41A22B9723AF00625A4F /* AddLocationsCoordinator.swift in Sources */,
52845298
F028A56A2A34D4E700C0CAA3 /* RedeemVoucherViewController.swift in Sources */,
52855299
7A5869C52B5A899C00640D27 /* MethodSettingsCellConfiguration.swift in Sources */,
52865300
58E11188292FA11F009FCA84 /* SettingsMigrationUIHandler.swift in Sources */,
@@ -5415,11 +5429,13 @@
54155429
5827B0C52B14D3E800CCBBA1 /* NSDiffableDataSourceSnapshot+Reconfigure.swift in Sources */,
54165430
58A8EE5E2976DB00009C0F8D /* StorePaymentManagerError+Display.swift in Sources */,
54175431
58A8EE5A2976BFBB009C0F8D /* SKError+Localized.swift in Sources */,
5432+
F02F41A12B9723AF00625A4F /* AddLocationsDataSource.swift in Sources */,
54185433
58EFC76E2AFB3BDA00E9F4CB /* ListAccessMethodCoordinator.swift in Sources */,
54195434
5827B0B92B14A1C700CCBBA1 /* MethodTestingStatusCellContentConfiguration.swift in Sources */,
54205435
7A42DEC92A05164100B209BE /* SettingsInputCell.swift in Sources */,
54215436
5803B4B22940A48700C23744 /* TunnelStore.swift in Sources */,
54225437
586A950F29012BEE007BAF2B /* AddressCacheTracker.swift in Sources */,
5438+
F02F41A02B9723AF00625A4F /* AddLocationsViewController.swift in Sources */,
54235439
587B753D2666468F00DEF7E9 /* NotificationController.swift in Sources */,
54245440
);
54255441
runOnlyForDeploymentPostprocessing = 0;

ios/MullvadVPN/Classes/AccessbilityIdentifier.swift

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public enum AccessibilityIdentifier: String {
5353

5454
// Views
5555
case accountView
56+
case addLocationsView
5657
case alertContainerView
5758
case alertTitle
5859
case changeLogAlert

ios/MullvadVPN/Coordinators/CustomLists/AddCustomListCoordinator.swift

+27-7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import UIKit
1414
class AddCustomListCoordinator: Coordinator, Presentable, Presenting {
1515
let navigationController: UINavigationController
1616
let interactor: CustomListInteractorProtocol
17+
let nodes: [LocationNode]
18+
let subject = CurrentValueSubject<CustomListViewModel, Never>(
19+
CustomListViewModel(id: UUID(), name: "", locations: [], tableSections: [.name, .addLocations])
20+
)
1721

1822
var presentedViewController: UIViewController {
1923
navigationController
@@ -23,17 +27,15 @@ class AddCustomListCoordinator: Coordinator, Presentable, Presenting {
2327

2428
init(
2529
navigationController: UINavigationController,
26-
interactor: CustomListInteractorProtocol
30+
interactor: CustomListInteractorProtocol,
31+
nodes: [LocationNode]
2732
) {
2833
self.navigationController = navigationController
2934
self.interactor = interactor
35+
self.nodes = nodes
3036
}
3137

3238
func start() {
33-
let subject = CurrentValueSubject<CustomListViewModel, Never>(
34-
CustomListViewModel(id: UUID(), name: "", locations: [], tableSections: [.name, .addLocations])
35-
)
36-
3739
let controller = CustomListViewController(
3840
interactor: interactor,
3941
subject: subject,
@@ -75,7 +77,25 @@ extension AddCustomListCoordinator: CustomListViewControllerDelegate {
7577
// No op.
7678
}
7779

78-
func showLocations() {
79-
// TODO: Show view controller for locations.
80+
func showLocations(_ list: CustomList) {
81+
let coordinator = AddLocationsCoordinator(
82+
navigationController: navigationController,
83+
nodes: nodes,
84+
customList: list
85+
)
86+
87+
coordinator.didFinish = { customList in
88+
self.subject.send(CustomListViewModel(
89+
id: customList.id,
90+
name: customList.name,
91+
locations: customList.locations,
92+
tableSections: self.subject.value.tableSections
93+
))
94+
self.removeFromParent()
95+
}
96+
97+
coordinator.start()
98+
99+
addChild(coordinator)
80100
}
81101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//
2+
// AddLocationsCoordinator.swift
3+
// MullvadVPN
4+
//
5+
// Created by Mojgan on 2024-03-04.
6+
// Copyright © 2024 Mullvad VPN AB. All rights reserved.
7+
//
8+
9+
import Combine
10+
import Foundation
11+
import MullvadSettings
12+
import MullvadTypes
13+
import Routing
14+
import UIKit
15+
16+
class AddLocationsCoordinator: Coordinator, Presentable, Presenting {
17+
private let navigationController: UINavigationController
18+
private let nodes: [LocationNode]
19+
private var customList: CustomList
20+
21+
var didFinish: ((CustomList) -> Void)?
22+
23+
var presentedViewController: UIViewController {
24+
navigationController
25+
}
26+
27+
init(
28+
navigationController: UINavigationController,
29+
nodes: [LocationNode],
30+
customList: CustomList
31+
) {
32+
self.navigationController = navigationController
33+
self.nodes = nodes
34+
self.customList = customList
35+
}
36+
37+
func start() {
38+
let controller = AddLocationsViewController(
39+
allLocationsNodes: nodes,
40+
customList: customList
41+
)
42+
controller.delegate = self
43+
44+
controller.navigationItem.title = NSLocalizedString(
45+
"ADD_LOCATIONS_NAVIGATION_TITLE",
46+
tableName: "AddLocations",
47+
value: "Add locations",
48+
comment: ""
49+
)
50+
51+
navigationController.pushViewController(controller, animated: false)
52+
}
53+
}
54+
55+
extension AddLocationsCoordinator: AddLocationsViewControllerDelegate {
56+
func didUpdateSelectedLocations(locations: [RelayLocation]) {
57+
didFinish?(CustomList(id: customList.id, name: customList.name, locations: locations))
58+
}
59+
}

0 commit comments

Comments
 (0)