Work done so far in the app architecture setup.

This commit is contained in:
Javier Cicchelli 2023-04-11 21:36:16 +02:00
parent 9b14b79ea2
commit b9417244a4
10 changed files with 148 additions and 19 deletions

View File

@ -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
)
}
}

View File

@ -12,26 +12,44 @@ import UIKit
class LocationsListCoordinator: LocationsListCoordinable { class LocationsListCoordinator: LocationsListCoordinable {
// MARK: Properties // MARK: Properties
var children: [Coordinator] = [] var children: [Coordinator] = []
var router: Router var router: Router
private var viewController: UIViewController?
// MARK: Initialisers // MARK: Initialisers
init(router: Router) { init(router: Router) {
self.router = router self.router = router
} }
// MARK: Functions // MARK: Coordinator
func present(animated: Bool, onDismiss: (() -> Void)?) { func present(animated: Bool, onDismiss: (() -> Void)?) {
let navigationController = UINavigationController(rootViewController: LocationsListViewController(
viewModel: LocationsListViewModel(coordinator: self)
))
viewController = navigationController
router.present( router.present(
UINavigationController(rootViewController: LocationsListViewController( navigationController,
viewModel: LocationsListViewModel(coordinator: self)
)),
animated: animated, animated: animated,
onDismiss: onDismiss onDismiss: onDismiss
) )
} }
// MARK: LocationsListCoordinable
func showAddLocation() {
guard let viewController else {
return
}
let router = ModalNavigationRouter(parentViewController: viewController)
let child =
print("ADD LOCATION PRESSED!")
}
} }

View File

@ -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 {}

View File

@ -8,4 +8,10 @@
import Core import Core
protocol LocationsListCoordinable: Coordinator {} protocol LocationsListCoordinable: Coordinator {
// MARK: Functions
func showAddLocation()
}

View File

@ -9,15 +9,15 @@
import Core import Core
import UIKit import UIKit
class LocationsAddViewController: UIViewController, View { class LocationsAddViewController: UIViewController {
// MARK: Properties // MARK: Properties
var viewModel: ViewModel var viewModel: LocationsAddViewModel
// MARK: Initialisers // MARK: Initialisers
init(viewModel: ViewModel) { init(viewModel: LocationsAddViewModel) {
self.viewModel = viewModel self.viewModel = viewModel
super.init(nibName: nil, bundle: nil) super.init(nibName: nil, bundle: nil)

View File

@ -9,7 +9,7 @@
import Combine import Combine
import Core import Core
class LocationsAddViewModel: ObservableObject, ViewModel { class LocationsAddViewModel: ObservableObject {
// MARK: Properties // MARK: Properties

View File

@ -9,15 +9,15 @@
import Core import Core
import UIKit import UIKit
class LocationsListViewController: UIViewController, View { class LocationsListViewController: UIViewController {
// MARK: Properties // MARK: Properties
var viewModel: ViewModel var viewModel: LocationsListViewModelable
// MARK: Initialisers // MARK: Initialisers
init(viewModel: ViewModel) { init(viewModel: LocationsListViewModelable) {
self.viewModel = viewModel self.viewModel = viewModel
super.init(nibName: nil, bundle: nil) super.init(nibName: nil, bundle: nil)
@ -32,9 +32,23 @@ class LocationsListViewController: UIViewController, View {
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(
title: "Add",
style: .plain,
target: self,
action: #selector(addLocationPressed)
)
title = "Locations" title = "Locations"
view.backgroundColor = .white view.backgroundColor = .systemBackground
} }
} }
// MARK: - Helpers
private extension LocationsListViewController {
@objc func addLocationPressed() {
viewModel.addLocationPressed()
}
}

View File

@ -9,16 +9,22 @@
import Combine import Combine
import Core import Core
class LocationsListViewModel: ObservableObject, ViewModel { class LocationsListViewModel: ObservableObject, LocationsListViewModelable {
// MARK: Properties // MARK: Properties
var coordinator: Coordinator weak var coordinator: LocationsListCoordinable?
// MARK: Initialisers // MARK: Initialisers
init(coordinator: Coordinator) { init(coordinator: LocationsListCoordinable) {
self.coordinator = coordinator self.coordinator = coordinator
} }
// MARK: Functions
func addLocationPressed() {
coordinator?.showAddLocation()
}
} }

View File

@ -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()
}

View File

@ -11,7 +11,10 @@
46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */; }; 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */; };
46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */; }; 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */; };
46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.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 */; }; 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 */; }; 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */; };
46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */; }; 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */; };
46EB332729E1CE05001D5EAF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 46EB332629E1CE05001D5EAF /* Assets.xcassets */; }; 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 = "<group>"; }; 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModel.swift; sourceTree = "<group>"; };
46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModel.swift; sourceTree = "<group>"; }; 46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewModel.swift; sourceTree = "<group>"; };
46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewController.swift; sourceTree = "<group>"; }; 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddViewController.swift; sourceTree = "<group>"; };
46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListViewModelable.swift; sourceTree = "<group>"; };
46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinable.swift; sourceTree = "<group>"; }; 46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordinable.swift; sourceTree = "<group>"; };
46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinable.swift; sourceTree = "<group>"; };
46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinator.swift; sourceTree = "<group>"; };
46EB325829E1BD5C001D5EAF /* Wikipedia.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Wikipedia.xcodeproj; path = Wikipedia/Wikipedia.xcodeproj; sourceTree = "<group>"; }; 46EB325829E1BD5C001D5EAF /* Wikipedia.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Wikipedia.xcodeproj; path = Wikipedia/Wikipedia.xcodeproj; sourceTree = "<group>"; };
46EB331829E1CE04001D5EAF /* Locations.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Locations.app; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = "<group>"; }; 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@ -150,6 +156,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */, 46C3B7C529E5BF1500F8F57C /* LocationsListCoordinator.swift */,
46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */,
46C3B7D929E5E7F900F8F57C /* Protocols */, 46C3B7D929E5E7F900F8F57C /* Protocols */,
); );
path = Coordinators; path = Coordinators;
@ -169,6 +176,7 @@
children = ( children = (
46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */, 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */,
46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */, 46C3B7CA29E5CD3200F8F57C /* LocationsListViewModel.swift */,
46C3B7DA29E5E80B00F8F57C /* Protocols */,
); );
path = LocationsList; path = LocationsList;
sourceTree = "<group>"; sourceTree = "<group>";
@ -176,8 +184,8 @@
46C3B7CD29E5CFCD00F8F57C /* LocationsAdd */ = { 46C3B7CD29E5CFCD00F8F57C /* LocationsAdd */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */,
46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */, 46C3B7D029E5D06D00F8F57C /* LocationsAddViewController.swift */,
46C3B7CE29E5D00E00F8F57C /* LocationsAddViewModel.swift */,
); );
path = LocationsAdd; path = LocationsAdd;
sourceTree = "<group>"; sourceTree = "<group>";
@ -186,6 +194,15 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */, 46C3B7D729E5E55000F8F57C /* LocationsListCoordinable.swift */,
46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordinable.swift */,
);
path = Protocols;
sourceTree = "<group>";
};
46C3B7DA29E5E80B00F8F57C /* Protocols */ = {
isa = PBXGroup;
children = (
46C3B7D529E5E50500F8F57C /* LocationsListViewModelable.swift */,
); );
path = Protocols; path = Protocols;
sourceTree = "<group>"; sourceTree = "<group>";
@ -462,7 +479,10 @@
46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */, 46C3B7C629E5BF1500F8F57C /* LocationsListCoordinator.swift in Sources */,
46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */, 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */,
46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */, 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */,
46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */,
46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordinable.swift in Sources */,
46C3B7D829E5E55000F8F57C /* LocationsListCoordinable.swift in Sources */, 46C3B7D829E5E55000F8F57C /* LocationsListCoordinable.swift in Sources */,
46C3B7D629E5E50500F8F57C /* LocationsListViewModelable.swift in Sources */,
46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */, 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */,
46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */, 46C3B7D129E5D06D00F8F57C /* LocationsAddViewController.swift in Sources */,
46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */, 46C3B7CB29E5CD3200F8F57C /* LocationsListViewModel.swift in Sources */,