diff --git a/Apps/Locations/Sources/Coordinators/LocationsAddCoordinator.swift b/Apps/Locations/Sources/Coordinators/LocationsAddCoordinator.swift new file mode 100644 index 0000000..bf4c5b5 --- /dev/null +++ b/Apps/Locations/Sources/Coordinators/LocationsAddCoordinator.swift @@ -0,0 +1,35 @@ +// +// LocationsAddCoordinator.swift +// Locations +// +// Created by Javier Cicchelli on 11/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +import Core +import UIKit + +class LocationsAddCoordinator: LocationsAddCoordinable { + + // MARK: Properties + + var children: [Coordinator] = [] + var router: Router + + // MARK: Initialisers + + init(router: Router) { + self.router = router + } + + // MARK: Coordinator + + func present(animated: Bool, onDismiss: (() -> Void)?) { + router.present( + LocationsAddViewController(viewModel: .init(coordinator: self)), + animated: animated, + onDismiss: onDismiss + ) + } + +} diff --git a/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift b/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift index 8efe66e..f7af6dc 100644 --- a/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift +++ b/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift @@ -12,26 +12,44 @@ import UIKit class LocationsListCoordinator: LocationsListCoordinable { // MARK: Properties - + var children: [Coordinator] = [] var router: Router + private var viewController: UIViewController? + // MARK: Initialisers init(router: Router) { self.router = router } - // MARK: Functions + // MARK: Coordinator func present(animated: Bool, onDismiss: (() -> Void)?) { + let navigationController = UINavigationController(rootViewController: LocationsListViewController( + viewModel: LocationsListViewModel(coordinator: self) + )) + + viewController = navigationController + router.present( - UINavigationController(rootViewController: LocationsListViewController( - viewModel: LocationsListViewModel(coordinator: self) - )), + navigationController, animated: animated, onDismiss: onDismiss ) } + // MARK: LocationsListCoordinable + + func showAddLocation() { + guard let viewController else { + return + } + + let router = ModalNavigationRouter(parentViewController: viewController) + let child = + print("ADD LOCATION PRESSED!") + } + } diff --git a/Apps/Locations/Sources/Coordinators/Protocols/LocationsAddCoordinable.swift b/Apps/Locations/Sources/Coordinators/Protocols/LocationsAddCoordinable.swift new file mode 100644 index 0000000..dacf48a --- /dev/null +++ b/Apps/Locations/Sources/Coordinators/Protocols/LocationsAddCoordinable.swift @@ -0,0 +1,11 @@ +// +// LocationsAddCoordinable.swift +// Locations +// +// Created by Javier Cicchelli on 11/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +import Core + +protocol LocationsAddCoordinable: Coordinator {} diff --git a/Apps/Locations/Sources/Coordinators/Protocols/LocationsListCoordinable.swift b/Apps/Locations/Sources/Coordinators/Protocols/LocationsListCoordinable.swift index b805fab..ed435e4 100644 --- a/Apps/Locations/Sources/Coordinators/Protocols/LocationsListCoordinable.swift +++ b/Apps/Locations/Sources/Coordinators/Protocols/LocationsListCoordinable.swift @@ -8,4 +8,10 @@ import Core -protocol LocationsListCoordinable: Coordinator {} +protocol LocationsListCoordinable: Coordinator { + + // MARK: Functions + + func showAddLocation() + +} diff --git a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift index 4dd47c3..e69b32f 100644 --- a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift +++ b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewController.swift @@ -9,15 +9,15 @@ import Core import UIKit -class LocationsAddViewController: UIViewController, View { +class LocationsAddViewController: UIViewController { // MARK: Properties - var viewModel: ViewModel + var viewModel: LocationsAddViewModel // MARK: Initialisers - init(viewModel: ViewModel) { + init(viewModel: LocationsAddViewModel) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) diff --git a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift index 15be2f2..692251c 100644 --- a/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift +++ b/Apps/Locations/Sources/Screens/LocationsAdd/LocationsAddViewModel.swift @@ -9,7 +9,7 @@ import Combine import Core -class LocationsAddViewModel: ObservableObject, ViewModel { +class LocationsAddViewModel: ObservableObject { // MARK: Properties diff --git a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift index 954fb8b..90267b1 100644 --- a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift +++ b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewController.swift @@ -9,15 +9,15 @@ import Core import UIKit -class LocationsListViewController: UIViewController, View { +class LocationsListViewController: UIViewController { // MARK: Properties - var viewModel: ViewModel + var viewModel: LocationsListViewModelable // MARK: Initialisers - init(viewModel: ViewModel) { + init(viewModel: LocationsListViewModelable) { self.viewModel = viewModel super.init(nibName: nil, bundle: nil) @@ -32,9 +32,23 @@ class LocationsListViewController: UIViewController, View { override func viewDidLoad() { super.viewDidLoad() + navigationItem.rightBarButtonItem = UIBarButtonItem( + title: "Add", + style: .plain, + target: self, + action: #selector(addLocationPressed) + ) title = "Locations" - view.backgroundColor = .white + view.backgroundColor = .systemBackground } } + +// MARK: - Helpers + +private extension LocationsListViewController { + @objc func addLocationPressed() { + viewModel.addLocationPressed() + } +} diff --git a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift index dbc29c5..0448757 100644 --- a/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift +++ b/Apps/Locations/Sources/Screens/LocationsList/LocationsListViewModel.swift @@ -9,16 +9,22 @@ import Combine import Core -class LocationsListViewModel: ObservableObject, ViewModel { - +class LocationsListViewModel: ObservableObject, LocationsListViewModelable { + // MARK: Properties - var coordinator: Coordinator + weak var coordinator: LocationsListCoordinable? // MARK: Initialisers - init(coordinator: Coordinator) { + init(coordinator: LocationsListCoordinable) { self.coordinator = coordinator } + + // MARK: Functions + + func addLocationPressed() { + coordinator?.showAddLocation() + } } diff --git a/Apps/Locations/Sources/Screens/LocationsList/Protocols/LocationsListViewModelable.swift b/Apps/Locations/Sources/Screens/LocationsList/Protocols/LocationsListViewModelable.swift new file mode 100644 index 0000000..6375001 --- /dev/null +++ b/Apps/Locations/Sources/Screens/LocationsList/Protocols/LocationsListViewModelable.swift @@ -0,0 +1,19 @@ +// +// LocationsListViewModelable.swift +// Locations +// +// Created by Javier Cicchelli on 11/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +protocol LocationsListViewModelable { + + // MARK: Properties + + var coordinator: LocationsListCoordinable? { get set } + + // MARK: Functions + + func addLocationPressed() + +} diff --git a/DeepLinking.xcodeproj/project.pbxproj b/DeepLinking.xcodeproj/project.pbxproj index 1e86b9a..7f53c13 100644 --- a/DeepLinking.xcodeproj/project.pbxproj +++ b/DeepLinking.xcodeproj/project.pbxproj @@ -11,7 +11,10 @@ 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 */; }; + 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 */; }; 46EB332729E1CE05001D5EAF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 46EB332629E1CE05001D5EAF /* Assets.xcassets */; }; @@ -119,7 +122,10 @@ 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 = ""; }; + 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; }; 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -150,6 +156,7 @@ isa = PBXGroup; children = ( 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */, + 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */, 46C3B7D929E5E7F900F8F57C /* Protocols */, ); path = Coordinators; @@ -169,6 +176,7 @@ children = ( 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */, 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */, + 46C3B7DA29E5E80B00F8F57C /* Protocols */, ); path = LocationsList; sourceTree = ""; @@ -176,8 +184,8 @@ 46C3B7CD29E5CFCD00F8F57C /* LocationsAdd */ = { isa = PBXGroup; children = ( - 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */, 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */, + 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */, ); path = LocationsAdd; sourceTree = ""; @@ -186,6 +194,15 @@ isa = PBXGroup; children = ( 46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */, + 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */, + ); + path = Protocols; + sourceTree = ""; + }; + 46C3B7DA29E5E80B00F8F57C /* Protocols */ = { + isa = PBXGroup; + children = ( + 46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */, ); path = Protocols; sourceTree = ""; @@ -462,7 +479,10 @@ 46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */, 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */, 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */, + 46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */, + 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordinable.swift in Sources */, 46C3B7D829E5E55000F8F57C /* LocationsListCoordinable.swift in Sources */, + 46C3B7D629E5E50500F8F57C /* LocationsListViewModelable.swift in Sources */, 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */, 46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */, 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */,