diff --git a/Apps/Locations/Sources/AppDelegate.swift b/Apps/Locations/Sources/AppDelegate.swift index ae859b7..55a61df 100644 --- a/Apps/Locations/Sources/AppDelegate.swift +++ b/Apps/Locations/Sources/AppDelegate.swift @@ -24,7 +24,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - coordinator.present(animated: true, onDismiss: nil) + coordinator.present(animated: false, onDismiss: nil) return true } diff --git a/Apps/Locations/Sources/Coordinators/LocationsAddCoordinator.swift b/Apps/Locations/Sources/Coordinators/LocationsAddCoordinator.swift index bf4c5b5..61dd9c0 100644 --- a/Apps/Locations/Sources/Coordinators/LocationsAddCoordinator.swift +++ b/Apps/Locations/Sources/Coordinators/LocationsAddCoordinator.swift @@ -9,7 +9,7 @@ import Core import UIKit -class LocationsAddCoordinator: LocationsAddCoordinable { +class LocationsAddCoordinator: Coordinator { // MARK: Properties @@ -26,10 +26,16 @@ class LocationsAddCoordinator: LocationsAddCoordinable { func present(animated: Bool, onDismiss: (() -> Void)?) { router.present( - LocationsAddViewController(viewModel: .init(coordinator: self)), + LocationsAddViewController( + viewModel: LocationsAddViewModel(coordinator: self) + ), animated: animated, onDismiss: onDismiss ) } } + +// MARK: - LocationsAddCoordination + +extension LocationsAddCoordinator: LocationsAddCoordination {} diff --git a/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift b/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift index f7af6dc..a7d2592 100644 --- a/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift +++ b/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift @@ -9,15 +9,15 @@ import Core import UIKit -class LocationsListCoordinator: LocationsListCoordinable { - +class LocationsListCoordinator: Coordinator { + // MARK: Properties - + var children: [Coordinator] = [] var router: Router private var viewController: UIViewController? - + // MARK: Initialisers init(router: Router) { @@ -40,16 +40,25 @@ class LocationsListCoordinator: LocationsListCoordinable { ) } - // MARK: LocationsListCoordinable +} + +// MARK: - LocationsListCoordination + +extension LocationsListCoordinator: LocationsListCoordination { - func showAddLocation() { + // MARK: Functions + + func openAddLocation() { guard let viewController else { return } - let router = ModalNavigationRouter(parentViewController: viewController) - let child = - print("ADD LOCATION PRESSED!") + present( + child: LocationsAddCoordinator( + router: ModalNavigationRouter(parentViewController: viewController) + ), + animated: true + ) } } diff --git a/Apps/Locations/Sources/Coordinators/Protocols/LocationsAddCoordinable.swift b/Apps/Locations/Sources/Protocols/Coordination/LocationsAddCoordination.swift similarity index 56% rename from Apps/Locations/Sources/Coordinators/Protocols/LocationsAddCoordinable.swift rename to Apps/Locations/Sources/Protocols/Coordination/LocationsAddCoordination.swift index dacf48a..6dd5bee 100644 --- a/Apps/Locations/Sources/Coordinators/Protocols/LocationsAddCoordinable.swift +++ b/Apps/Locations/Sources/Protocols/Coordination/LocationsAddCoordination.swift @@ -1,11 +1,9 @@ // -// LocationsAddCoordinable.swift +// LocationsAddCoordination.swift // Locations // // Created by Javier Cicchelli on 11/04/2023. // Copyright © 2023 Röck+Cöde. All rights reserved. // -import Core - -protocol LocationsAddCoordinable: Coordinator {} +protocol LocationsAddCoordination: AnyObject {} diff --git a/Apps/Locations/Sources/Coordinators/Protocols/LocationsListCoordinable.swift b/Apps/Locations/Sources/Protocols/Coordination/LocationsListCoordination.swift similarity index 56% rename from Apps/Locations/Sources/Coordinators/Protocols/LocationsListCoordinable.swift rename to Apps/Locations/Sources/Protocols/Coordination/LocationsListCoordination.swift index ed435e4..bafe329 100644 --- a/Apps/Locations/Sources/Coordinators/Protocols/LocationsListCoordinable.swift +++ b/Apps/Locations/Sources/Protocols/Coordination/LocationsListCoordination.swift @@ -1,17 +1,15 @@ // -// LocationsListCoordinable.swift +// LocationsListCoordination.swift // Locations // // Created by Javier Cicchelli on 11/04/2023. // Copyright © 2023 Röck+Cöde. All rights reserved. // -import Core - -protocol LocationsListCoordinable: Coordinator { +protocol LocationsListCoordination: AnyObject { // MARK: Functions - func showAddLocation() + func openAddLocation() } diff --git a/Apps/Locations/Sources/Protocols/ViewModeling/LocationsAddViewModeling.swift b/Apps/Locations/Sources/Protocols/ViewModeling/LocationsAddViewModeling.swift new file mode 100644 index 0000000..b4e707c --- /dev/null +++ b/Apps/Locations/Sources/Protocols/ViewModeling/LocationsAddViewModeling.swift @@ -0,0 +1,15 @@ +// +// LocationsAddViewModeling.swift +// Locations +// +// Created by Javier Cicchelli on 11/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +protocol LocationsAddViewModeling: AnyObject { + + // MARK: Properties + + var coordinator: LocationsAddCoordination? { get set } + +} diff --git a/Apps/Locations/Sources/Screens/LocationsList/Protocols/LocationsListViewModelable.swift b/Apps/Locations/Sources/Protocols/ViewModeling/LocationsListViewModeling.swift similarity index 54% rename from Apps/Locations/Sources/Screens/LocationsList/Protocols/LocationsListViewModelable.swift rename to Apps/Locations/Sources/Protocols/ViewModeling/LocationsListViewModeling.swift index 6375001..90deeab 100644 --- a/Apps/Locations/Sources/Screens/LocationsList/Protocols/LocationsListViewModelable.swift +++ b/Apps/Locations/Sources/Protocols/ViewModeling/LocationsListViewModeling.swift @@ -1,19 +1,19 @@ // -// LocationsListViewModelable.swift +// LocationsListViewModeling.swift // Locations // // Created by Javier Cicchelli on 11/04/2023. // Copyright © 2023 Röck+Cöde. All rights reserved. // -protocol LocationsListViewModelable { +protocol LocationsListViewModeling: AnyObject { // MARK: Properties - var coordinator: LocationsListCoordinable? { get set } + var coordinator: LocationsListCoordination? { get set } // MARK: Functions - func addLocationPressed() + func openAddLocation() } diff --git a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift index e69b32f..86f4421 100644 --- a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift +++ b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift @@ -9,18 +9,18 @@ import Core import UIKit -class LocationsAddViewController: UIViewController { +class LocationsAddViewController: BaseViewController { // MARK: Properties - var viewModel: LocationsAddViewModel + var viewModel: LocationsAddViewModeling // MARK: Initialisers - init(viewModel: LocationsAddViewModel) { + init(viewModel: LocationsAddViewModeling) { self.viewModel = viewModel - super.init(nibName: nil, bundle: nil) + super.init() } required init?(coder: NSCoder) { @@ -33,8 +33,6 @@ class LocationsAddViewController: UIViewController { super.viewDidLoad() title = "Location Add" - - view.backgroundColor = .white } } diff --git a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift index 692251c..84e9678 100644 --- a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift +++ b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift @@ -13,12 +13,16 @@ class LocationsAddViewModel: ObservableObject { // MARK: Properties - var coordinator: Coordinator + weak var coordinator: LocationsAddCoordination? // MARK: Initialisers - init(coordinator: Coordinator) { + init(coordinator: LocationsAddCoordination) { self.coordinator = coordinator } } + +// MARK: - LocationsAddViewModeling + +extension LocationsAddViewModel: LocationsAddViewModeling {} diff --git a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift index 90267b1..cc35c26 100644 --- a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift +++ b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift @@ -9,18 +9,18 @@ import Core import UIKit -class LocationsListViewController: UIViewController { +class LocationsListViewController: BaseViewController { // MARK: Properties - var viewModel: LocationsListViewModelable + var viewModel: LocationsListViewModeling // MARK: Initialisers - init(viewModel: LocationsListViewModelable) { + init(viewModel: LocationsListViewModeling) { self.viewModel = viewModel - super.init(nibName: nil, bundle: nil) + super.init() } required init?(coder: NSCoder) { @@ -39,8 +39,6 @@ class LocationsListViewController: UIViewController { action: #selector(addLocationPressed) ) title = "Locations" - - view.backgroundColor = .systemBackground } } @@ -48,7 +46,11 @@ class LocationsListViewController: UIViewController { // MARK: - Helpers private extension LocationsListViewController { + + // MARK: Functions + @objc func addLocationPressed() { - viewModel.addLocationPressed() + viewModel.openAddLocation() } + } diff --git a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift index 0448757..c3644fa 100644 --- a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift +++ b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift @@ -9,22 +9,28 @@ import Combine import Core -class LocationsListViewModel: ObservableObject, LocationsListViewModelable { +class LocationsListViewModel: ObservableObject { // MARK: Properties - weak var coordinator: LocationsListCoordinable? + weak var coordinator: LocationsListCoordination? // MARK: Initialisers - init(coordinator: LocationsListCoordinable) { + init(coordinator: LocationsListCoordination) { self.coordinator = coordinator } - - // MARK: Functions - - func addLocationPressed() { - coordinator?.showAddLocation() - } } + +// MARK: - LocationsListViewModeling + +extension LocationsListViewModel: LocationsListViewModeling { + + // MARK: Functions + + func openAddLocation() { + coordinator?.openAddLocation() + } + +} diff --git a/Apps/Locations/Sources/View Controllers/BaseViewController.swift b/Apps/Locations/Sources/View Controllers/BaseViewController.swift new file mode 100644 index 0000000..ea3fec4 --- /dev/null +++ b/Apps/Locations/Sources/View Controllers/BaseViewController.swift @@ -0,0 +1,31 @@ +// +// BaseViewController.swift +// Locations +// +// Created by Javier Cicchelli on 11/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +import UIKit + +class BaseViewController: UIViewController { + + // MARK: Initialisers + + init() { + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: UIViewController + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .systemBackground + } + +} diff --git a/DeepLinking.xcodeproj/project.pbxproj b/DeepLinking.xcodeproj/project.pbxproj index 7f53c13..b824d70 100644 --- a/DeepLinking.xcodeproj/project.pbxproj +++ b/DeepLinking.xcodeproj/project.pbxproj @@ -7,13 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + 02031EBF29E5F949003C108C /* LocationsAddViewModeling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02031EBE29E5F949003C108C /* LocationsAddViewModeling.swift */; }; + 02031EC629E5FEE4003C108C /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02031EC529E5FEE4003C108C /* BaseViewController.swift */; }; 46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */; }; 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */; }; 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */; }; 46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */; }; - 46C3B7D629E5E50500F8F57C /* LocationsListViewModelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */; }; - 46C3B7D829E5E55000F8F57C /* LocationsListCoordinable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */; }; - 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordinable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */; }; + 46C3B7D629E5E50500F8F57C /* LocationsListViewModeling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D529E5E50500F8F57C /* LocationsListViewModeling.swift */; }; + 46C3B7D829E5E55000F8F57C /* LocationsListCoordination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */; }; + 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */; }; 46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */; }; 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */; }; 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */; }; @@ -118,13 +120,15 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 02031EBE29E5F949003C108C /* LocationsAddViewModeling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModeling.swift; sourceTree = ""; }; + 02031EC529E5FEE4003C108C /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinator.swift; sourceTree = ""; }; 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModel.swift; sourceTree = ""; }; 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModel.swift; sourceTree = ""; }; 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewController.swift; sourceTree = ""; }; - 46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModelable.swift; sourceTree = ""; }; - 46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinable.swift; sourceTree = ""; }; - 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinable.swift; sourceTree = ""; }; + 46C3B7D529E5E50500F8F57C /* LocationsListViewModeling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModeling.swift; sourceTree = ""; }; + 46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordination.swift; sourceTree = ""; }; + 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordination.swift; sourceTree = ""; }; 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinator.swift; sourceTree = ""; }; 46EB325829E1BD5C001D5EAF /* Wikipedia.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Wikipedia.xcodeproj; path = Wikipedia/Wikipedia.xcodeproj; sourceTree = ""; }; 46EB331829E1CE04001D5EAF /* Locations.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Locations.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -152,12 +156,46 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 02031EC429E5FEB1003C108C /* View Controllers */ = { + isa = PBXGroup; + children = ( + 02031EC529E5FEE4003C108C /* BaseViewController.swift */, + ); + path = "View Controllers"; + sourceTree = ""; + }; + 0276C96029E5F5DC000B62AF /* Protocols */ = { + isa = PBXGroup; + children = ( + 0276C96229E5F5ED000B62AF /* Coordination */, + 0276C96129E5F5E5000B62AF /* ViewModeling */, + ); + path = Protocols; + sourceTree = ""; + }; + 0276C96129E5F5E5000B62AF /* ViewModeling */ = { + isa = PBXGroup; + children = ( + 02031EBE29E5F949003C108C /* LocationsAddViewModeling.swift */, + 46C3B7D529E5E50500F8F57C /* LocationsListViewModeling.swift */, + ); + path = ViewModeling; + sourceTree = ""; + }; + 0276C96229E5F5ED000B62AF /* Coordination */ = { + isa = PBXGroup; + children = ( + 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */, + 46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */, + ); + path = Coordination; + sourceTree = ""; + }; 46C3B7C429E5BEE900F8F57C /* Coordinators */ = { isa = PBXGroup; children = ( - 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */, 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */, - 46C3B7D929E5E7F900F8F57C /* Protocols */, + 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */, ); path = Coordinators; sourceTree = ""; @@ -165,8 +203,8 @@ 46C3B7C929E5CB8F00F8F57C /* Screens */ = { isa = PBXGroup; children = ( - 46C3B7CC29E5CFBB00F8F57C /* LocationsList */, 46C3B7CD29E5CFCD00F8F57C /* LocationsAdd */, + 46C3B7CC29E5CFBB00F8F57C /* LocationsList */, ); path = Screens; sourceTree = ""; @@ -176,7 +214,6 @@ children = ( 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */, 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */, - 46C3B7DA29E5E80B00F8F57C /* Protocols */, ); path = LocationsList; sourceTree = ""; @@ -190,23 +227,6 @@ path = LocationsAdd; sourceTree = ""; }; - 46C3B7D929E5E7F900F8F57C /* Protocols */ = { - isa = PBXGroup; - children = ( - 46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */, - 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */, - ); - path = Protocols; - sourceTree = ""; - }; - 46C3B7DA29E5E80B00F8F57C /* Protocols */ = { - isa = PBXGroup; - children = ( - 46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */, - ); - path = Protocols; - sourceTree = ""; - }; 46EB325029E1BBD1001D5EAF = { isa = PBXGroup; children = ( @@ -268,9 +288,11 @@ 46EB332F29E1CE1E001D5EAF /* Sources */ = { isa = PBXGroup; children = ( - 46C3B7C929E5CB8F00F8F57C /* Screens */, - 46C3B7C429E5BEE900F8F57C /* Coordinators */, 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */, + 0276C96029E5F5DC000B62AF /* Protocols */, + 46C3B7C429E5BEE900F8F57C /* Coordinators */, + 46C3B7C929E5CB8F00F8F57C /* Screens */, + 02031EC429E5FEB1003C108C /* View Controllers */, ); path = Sources; sourceTree = ""; @@ -478,11 +500,13 @@ files = ( 46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */, 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */, + 02031EC629E5FEE4003C108C /* BaseViewController.swift in Sources */, 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */, + 02031EBF29E5F949003C108C /* LocationsAddViewModeling.swift in Sources */, 46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */, - 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordinable.swift in Sources */, - 46C3B7D829E5E55000F8F57C /* LocationsListCoordinable.swift in Sources */, - 46C3B7D629E5E50500F8F57C /* LocationsListViewModelable.swift in Sources */, + 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordination.swift in Sources */, + 46C3B7D829E5E55000F8F57C /* LocationsListCoordination.swift in Sources */, + 46C3B7D629E5E50500F8F57C /* LocationsListViewModeling.swift in Sources */, 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */, 46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */, 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */,