Skip to content

Commit 848a1a2

Browse files
committed
Merge branch 'adjust-ui-to-allow-adding-elements-to-a-custom-list-ios-490'
2 parents b86fc46 + 0993e71 commit 848a1a2

27 files changed

+985
-330
lines changed

ios/MullvadVPN.xcodeproj/project.pbxproj

+26
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@
531531
7A6389EB2B7FAD7A008E77E1 /* SettingsFieldValidationErrorContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6389EA2B7FAD7A008E77E1 /* SettingsFieldValidationErrorContentView.swift */; };
532532
7A6389ED2B7FADA1008E77E1 /* SettingsFieldValidationErrorConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6389EC2B7FADA1008E77E1 /* SettingsFieldValidationErrorConfiguration.swift */; };
533533
7A6389F82B864CDF008E77E1 /* LocationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6389F72B864CDF008E77E1 /* LocationNode.swift */; };
534+
7A6652B82BB44C3E0042D848 /* LocationDiffableDataSourceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6652B62BB44B120042D848 /* LocationDiffableDataSourceProtocol.swift */; };
534535
7A6B4F592AB8412E00123853 /* TunnelMonitorTimings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6B4F582AB8412E00123853 /* TunnelMonitorTimings.swift */; };
535536
7A6F2FA52AFA3CB2006D0856 /* AccountExpiryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F2FA42AFA3CB2006D0856 /* AccountExpiryTests.swift */; };
536537
7A6F2FA72AFBB9AE006D0856 /* AccountExpiry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F2FA62AFBB9AE006D0856 /* AccountExpiry.swift */; };
@@ -818,14 +819,20 @@
818819
E1187ABD289BBB850024E748 /* OutOfTimeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */; };
819820
E158B360285381C60002F069 /* String+AccountFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = E158B35F285381C60002F069 /* String+AccountFormatting.swift */; };
820821
E1FD0DF528AA7CE400299DB4 /* StatusActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FD0DF428AA7CE400299DB4 /* StatusActivityView.swift */; };
822+
F006CCFC2B99CC8400C6C2AC /* EditLocationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F006CCFB2B99CC8400C6C2AC /* EditLocationsCoordinator.swift */; };
821823
F0164EBA2B4456D30020268D /* AccessMethodRepositoryStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EB92B4456D30020268D /* AccessMethodRepositoryStub.swift */; };
822824
F0164EBC2B482E430020268D /* AppStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EBB2B482E430020268D /* AppStorage.swift */; };
823825
F0164EBE2B4BFF940020268D /* ShadowsocksLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EBD2B4BFF940020268D /* ShadowsocksLoader.swift */; };
824826
F0164EC32B4C49D30020268D /* ShadowsocksLoaderStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164EC22B4C49D30020268D /* ShadowsocksLoaderStub.swift */; };
825827
F0164ED12B4F2DCB0020268D /* AccessMethodIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0164ED02B4F2DCB0020268D /* AccessMethodIterator.swift */; };
826828
F028A56A2A34D4E700C0CAA3 /* RedeemVoucherViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */; };
827829
F028A56C2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */; };
830+
F02F41A02B9723AF00625A4F /* AddLocationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419A2B9723AE00625A4F /* AddLocationsViewController.swift */; };
831+
F02F41A12B9723AF00625A4F /* AddLocationsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419B2B9723AE00625A4F /* AddLocationsDataSource.swift */; };
832+
F02F41A22B9723AF00625A4F /* AddLocationsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02F419C2B9723AF00625A4F /* AddLocationsCoordinator.swift */; };
828833
F03580252A13842C00E5DAFD /* IncreasedHitButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */; };
834+
F04413612BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04413602BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift */; };
835+
F04413622BA45CE30018A6EE /* CustomListLocationNodeBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04413602BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift */; };
829836
F04F95A12B21D24400431E08 /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = F04F95A02B21D24400431E08 /* shadowsocks.h */; settings = {ATTRIBUTES = (Private, ); }; };
830837
F04FBE612A8379EE009278D7 /* AppPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04FBE602A8379EE009278D7 /* AppPreferences.swift */; };
831838
F050AE4E2B70D7F8003F4EDB /* LocationCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F050AE4D2B70D7F8003F4EDB /* LocationCellViewModel.swift */; };
@@ -1789,6 +1796,7 @@
17891796
7A6389EA2B7FAD7A008E77E1 /* SettingsFieldValidationErrorContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsFieldValidationErrorContentView.swift; sourceTree = "<group>"; };
17901797
7A6389EC2B7FADA1008E77E1 /* SettingsFieldValidationErrorConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsFieldValidationErrorConfiguration.swift; sourceTree = "<group>"; };
17911798
7A6389F72B864CDF008E77E1 /* LocationNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationNode.swift; sourceTree = "<group>"; };
1799+
7A6652B62BB44B120042D848 /* LocationDiffableDataSourceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationDiffableDataSourceProtocol.swift; sourceTree = "<group>"; };
17921800
7A6B4F582AB8412E00123853 /* TunnelMonitorTimings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelMonitorTimings.swift; sourceTree = "<group>"; };
17931801
7A6F2FA42AFA3CB2006D0856 /* AccountExpiryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountExpiryTests.swift; sourceTree = "<group>"; };
17941802
7A6F2FA62AFBB9AE006D0856 /* AccountExpiry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountExpiry.swift; sourceTree = "<group>"; };
@@ -1972,14 +1980,19 @@
19721980
E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeContentView.swift; sourceTree = "<group>"; };
19731981
E158B35F285381C60002F069 /* String+AccountFormatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+AccountFormatting.swift"; sourceTree = "<group>"; };
19741982
E1FD0DF428AA7CE400299DB4 /* StatusActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusActivityView.swift; sourceTree = "<group>"; };
1983+
F006CCFB2B99CC8400C6C2AC /* EditLocationsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditLocationsCoordinator.swift; sourceTree = "<group>"; };
19751984
F0164EB92B4456D30020268D /* AccessMethodRepositoryStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessMethodRepositoryStub.swift; sourceTree = "<group>"; };
19761985
F0164EBB2B482E430020268D /* AppStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStorage.swift; sourceTree = "<group>"; };
19771986
F0164EBD2B4BFF940020268D /* ShadowsocksLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksLoader.swift; sourceTree = "<group>"; };
19781987
F0164EC22B4C49D30020268D /* ShadowsocksLoaderStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksLoaderStub.swift; sourceTree = "<group>"; };
19791988
F0164ED02B4F2DCB0020268D /* AccessMethodIterator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessMethodIterator.swift; sourceTree = "<group>"; };
19801989
F028A5692A34D4E700C0CAA3 /* RedeemVoucherViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedeemVoucherViewController.swift; sourceTree = "<group>"; };
19811990
F028A56B2A34D8E600C0CAA3 /* AddCreditSucceededViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddCreditSucceededViewController.swift; sourceTree = "<group>"; };
1991+
F02F419A2B9723AE00625A4F /* AddLocationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationsViewController.swift; sourceTree = "<group>"; };
1992+
F02F419B2B9723AE00625A4F /* AddLocationsDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationsDataSource.swift; sourceTree = "<group>"; };
1993+
F02F419C2B9723AF00625A4F /* AddLocationsCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddLocationsCoordinator.swift; sourceTree = "<group>"; };
19821994
F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncreasedHitButton.swift; sourceTree = "<group>"; };
1995+
F04413602BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomListLocationNodeBuilder.swift; sourceTree = "<group>"; };
19831996
F04F95A02B21D24400431E08 /* shadowsocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shadowsocks.h; sourceTree = "<group>"; };
19841997
F04FBE602A8379EE009278D7 /* AppPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreferences.swift; sourceTree = "<group>"; };
19851998
F050AE4D2B70D7F8003F4EDB /* LocationCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationCellViewModel.swift; sourceTree = "<group>"; };
@@ -2430,12 +2443,14 @@
24302443
isa = PBXGroup;
24312444
children = (
24322445
F050AE5F2B73A41E003F4EDB /* AllLocationDataSource.swift */,
2446+
F04413602BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift */,
24332447
F050AE612B74DBAC003F4EDB /* CustomListsDataSource.swift */,
24342448
F0A92B3B2B8E44F900DC7B37 /* InMemoryCustomListRepository.swift */,
24352449
5888AD82227B11080051EB06 /* LocationCell.swift */,
24362450
F050AE4D2B70D7F8003F4EDB /* LocationCellViewModel.swift */,
24372451
583DA21325FA4B5C00318683 /* LocationDataSource.swift */,
24382452
F050AE5D2B739A73003F4EDB /* LocationDataSourceProtocol.swift */,
2453+
7A6652B62BB44B120042D848 /* LocationDiffableDataSourceProtocol.swift */,
24392454
7A6389F72B864CDF008E77E1 /* LocationNode.swift */,
24402455
F050AE512B70DFC0003F4EDB /* LocationSection.swift */,
24412456
F0BE65362B9F136A005CC385 /* LocationSectionHeaderView.swift */,
@@ -3504,6 +3519,9 @@
35043519
isa = PBXGroup;
35053520
children = (
35063521
7A6389D72B7E3BD6008E77E1 /* AddCustomListCoordinator.swift */,
3522+
F02F419C2B9723AF00625A4F /* AddLocationsCoordinator.swift */,
3523+
F02F419B2B9723AE00625A4F /* AddLocationsDataSource.swift */,
3524+
F02F419A2B9723AE00625A4F /* AddLocationsViewController.swift */,
35073525
7A6389D22B7E3BD6008E77E1 /* CustomListCellConfiguration.swift */,
35083526
7A6389D42B7E3BD6008E77E1 /* CustomListDataSourceConfiguration.swift */,
35093527
7A6389DA2B7E3BD6008E77E1 /* CustomListInteractor.swift */,
@@ -3513,6 +3531,7 @@
35133531
7A6389E62B7E42BE008E77E1 /* CustomListViewController.swift */,
35143532
7A6389D32B7E3BD6008E77E1 /* CustomListViewModel.swift */,
35153533
7A6389E42B7E4247008E77E1 /* EditCustomListCoordinator.swift */,
3534+
F006CCFB2B99CC8400C6C2AC /* EditLocationsCoordinator.swift */,
35163535
7AB2B66F2BA1EB8C00B03E3B /* ListCustomListCoordinator.swift */,
35173536
7AB2B66E2BA1EB8C00B03E3B /* ListCustomListViewController.swift */,
35183537
);
@@ -4951,6 +4970,7 @@
49514970
A9A5FA2D2ACB05160083449F /* DurationTests.swift in Sources */,
49524971
A9A5FA2E2ACB05160083449F /* FileCacheTests.swift in Sources */,
49534972
A9A5FA2F2ACB05160083449F /* FixedWidthIntegerArithmeticsTests.swift in Sources */,
4973+
F04413622BA45CE30018A6EE /* CustomListLocationNodeBuilder.swift in Sources */,
49544974
A9A5FA302ACB05160083449F /* InputTextFormatterTests.swift in Sources */,
49554975
F0B0E6972AFE6E7E001DC66B /* XCTest+Async.swift in Sources */,
49564976
449EB9FF2B95FF2500DFA4EB /* AccountMock.swift in Sources */,
@@ -5224,6 +5244,7 @@
52245244
58EE2E3B272FF814003BFF93 /* SettingsDataSourceDelegate.swift in Sources */,
52255245
5823FA5426CE49F700283BF8 /* TunnelObserver.swift in Sources */,
52265246
5888AD87227B17950051EB06 /* LocationViewController.swift in Sources */,
5247+
F006CCFC2B99CC8400C6C2AC /* EditLocationsCoordinator.swift in Sources */,
52275248
58293FB3251241B4005D0BB5 /* CustomTextView.swift in Sources */,
52285249
586A950E290125F3007BAF2B /* ProductsRequestOperation.swift in Sources */,
52295250
7AF9BE902A39F26000DBFEDB /* Collection+Sorting.swift in Sources */,
@@ -5267,6 +5288,7 @@
52675288
7A28826A2BA8336600FD9F20 /* VPNSettingsCoordinator.swift in Sources */,
52685289
7A6389DE2B7E3BD6008E77E1 /* CustomListItemIdentifier.swift in Sources */,
52695290
58C76A082A33850E00100D75 /* ApplicationTarget.swift in Sources */,
5291+
F04413612BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift in Sources */,
52705292
58CEB3042AFD36CE00E6E088 /* SwitchCellContentView.swift in Sources */,
52715293
F07BF2622A26279100042943 /* RedeemVoucherOperation.swift in Sources */,
52725294
585E820327F3285E00939F0E /* SendStoreReceiptOperation.swift in Sources */,
@@ -5300,6 +5322,7 @@
53005322
5878A26F2907E7E00096FC88 /* ProblemReportInteractor.swift in Sources */,
53015323
7AB4CCBB2B691BBB006037F5 /* IPOverrideInteractor.swift in Sources */,
53025324
7A3353912AAA014400F0A71C /* SimulatorVPNConnection.swift in Sources */,
5325+
F02F41A22B9723AF00625A4F /* AddLocationsCoordinator.swift in Sources */,
53035326
F028A56A2A34D4E700C0CAA3 /* RedeemVoucherViewController.swift in Sources */,
53045327
7A5869C52B5A899C00640D27 /* MethodSettingsCellConfiguration.swift in Sources */,
53055328
58E11188292FA11F009FCA84 /* SettingsMigrationUIHandler.swift in Sources */,
@@ -5329,6 +5352,7 @@
53295352
58607A4D2947287800BC467D /* AccountExpiryInAppNotificationProvider.swift in Sources */,
53305353
58C8191829FAA2C400DEB1B4 /* NotificationConfiguration.swift in Sources */,
53315354
58FF9FE82B07650A00E4C97D /* ButtonCellContentConfiguration.swift in Sources */,
5355+
7A6652B82BB44C3E0042D848 /* LocationDiffableDataSourceProtocol.swift in Sources */,
53325356
5827B0A82B0F49EF00CCBBA1 /* ProxyConfigurationInteractorProtocol.swift in Sources */,
53335357
7A5869B92B56E7F000640D27 /* IPOverrideViewControllerDelegate.swift in Sources */,
53345358
586C0D7A2B039CE300E7CDD7 /* ShadowsocksCipherPicker.swift in Sources */,
@@ -5433,11 +5457,13 @@
54335457
5827B0C52B14D3E800CCBBA1 /* NSDiffableDataSourceSnapshot+Reconfigure.swift in Sources */,
54345458
58A8EE5E2976DB00009C0F8D /* StorePaymentManagerError+Display.swift in Sources */,
54355459
58A8EE5A2976BFBB009C0F8D /* SKError+Localized.swift in Sources */,
5460+
F02F41A12B9723AF00625A4F /* AddLocationsDataSource.swift in Sources */,
54365461
58EFC76E2AFB3BDA00E9F4CB /* ListAccessMethodCoordinator.swift in Sources */,
54375462
5827B0B92B14A1C700CCBBA1 /* MethodTestingStatusCellContentConfiguration.swift in Sources */,
54385463
7A42DEC92A05164100B209BE /* SettingsInputCell.swift in Sources */,
54395464
5803B4B22940A48700C23744 /* TunnelStore.swift in Sources */,
54405465
586A950F29012BEE007BAF2B /* AddressCacheTracker.swift in Sources */,
5466+
F02F41A02B9723AF00625A4F /* AddLocationsViewController.swift in Sources */,
54415467
587B753D2666468F00DEF7E9 /* NotificationController.swift in Sources */,
54425468
);
54435469
runOnlyForDeploymentPostprocessing = 0;

ios/MullvadVPN/Classes/AccessbilityIdentifier.swift

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

6464
// Views
6565
case accountView
66+
case addLocationsView
6667
case alertContainerView
6768
case alertTitle
6869
case changeLogAlert

ios/MullvadVPN/Coordinators/ApplicationCoordinator.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,6 @@ final class ApplicationCoordinator: Coordinator, Presenting, RootContainerViewCo
4343
*/
4444
private let secondaryNavigationContainer = RootContainerViewController()
4545

46-
private var customListRepository: CustomListRepositoryProtocol {
47-
#if DEBUG
48-
InMemoryCustomListRepository()
49-
#else
50-
CustomListRepository()
51-
#endif
52-
}
53-
5446
/// Posts `preferredAccountNumber` notification when user inputs the account number instead of voucher code
5547
private let preferredAccountNumberSubject = PassthroughSubject<String, Never>()
5648

@@ -719,7 +711,7 @@ final class ApplicationCoordinator: Coordinator, Presenting, RootContainerViewCo
719711
navigationController: navigationController,
720712
tunnelManager: tunnelManager,
721713
relayCacheTracker: relayCacheTracker,
722-
customListRepository: customListRepository
714+
customListRepository: CustomListRepository()
723715
)
724716

725717
locationCoordinator.didFinish = { [weak self] _ in

ios/MullvadVPN/Coordinators/CustomLists/AddCustomListCoordinator.swift

+35-11
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,28 @@ 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
2024
}
2125

22-
var didFinish: (() -> Void)?
26+
var didFinish: ((AddCustomListCoordinator) -> Void)?
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,
@@ -57,8 +59,11 @@ class AddCustomListCoordinator: Coordinator, Presentable, Presenting {
5759

5860
controller.navigationItem.leftBarButtonItem = UIBarButtonItem(
5961
systemItem: .cancel,
60-
primaryAction: UIAction(handler: { _ in
61-
self.didFinish?()
62+
primaryAction: UIAction(handler: { [weak self] _ in
63+
guard let self else {
64+
return
65+
}
66+
didFinish?(self)
6267
})
6368
)
6469

@@ -68,14 +73,33 @@ class AddCustomListCoordinator: Coordinator, Presentable, Presenting {
6873

6974
extension AddCustomListCoordinator: CustomListViewControllerDelegate {
7075
func customListDidSave(_ list: CustomList) {
71-
didFinish?()
76+
didFinish?(self)
7277
}
7378

7479
func customListDidDelete(_ list: CustomList) {
7580
// No op.
7681
}
7782

78-
func showLocations() {
79-
// TODO: Show view controller for locations.
83+
func showLocations(_ list: CustomList) {
84+
let coordinator = AddLocationsCoordinator(
85+
navigationController: navigationController,
86+
nodes: nodes,
87+
customList: list
88+
)
89+
90+
coordinator.didFinish = { [weak self] locationsCoordinator, customList in
91+
guard let self else { return }
92+
subject.send(CustomListViewModel(
93+
id: customList.id,
94+
name: customList.name,
95+
locations: customList.locations,
96+
tableSections: subject.value.tableSections
97+
))
98+
locationsCoordinator.removeFromParent()
99+
}
100+
101+
coordinator.start()
102+
103+
addChild(coordinator)
80104
}
81105
}

0 commit comments

Comments
 (0)