This PR contains the work done to define the `Coordinator` and the `Router` public protocols, and also implemented a few concrete router implementations tailored for the **UIKit** framework. To provide further details about the work done: - [x] define a new, dedicated `Coordinator` target in the `Package` file; - [x] define the `Coordinator` and the `Router` public protocols used to implement the coordinator pattern; - [x] implemented some **UIKit** specific routers to use on the **iOS** platform: `ModalNavigationRouter`, `PushNavigationRouter` and the `WindowRouter` concrete routers. Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Reviewed-on: #2
62 lines
1.9 KiB
Swift
62 lines
1.9 KiB
Swift
//
|
|
// Router.swift
|
|
// Coordinator
|
|
//
|
|
// Created by Javier Cicchelli on 11/04/2023.
|
|
// Copyright © 2023 Röck+Cöde. All rights reserved.
|
|
//
|
|
|
|
#if canImport(UIKit)
|
|
import UIKit
|
|
#endif
|
|
|
|
/// This protocol defines how view controllers will be shown and dismissed.
|
|
public protocol Router: AnyObject {
|
|
|
|
// MARK: Typealiases
|
|
|
|
typealias OnDismissedClosure = () -> Void
|
|
|
|
// MARK: Functions
|
|
|
|
#if canImport(UIKit)
|
|
/// Present a view controller animatedly or not, depending on the given `animated` parameter, and also pass a closure that should be called on dismissal.
|
|
/// - Parameters:
|
|
/// - viewController: A `UIViewController` view controller instance to present.
|
|
/// - animated: A boolean that represents whether the view controller should be dismissed animatedly or not.
|
|
/// - onDismiss: A closure to be called or executed when the presented view controller is dismissed.
|
|
func present(
|
|
_ viewController: UIViewController,
|
|
animated: Bool,
|
|
onDismiss: OnDismissedClosure?
|
|
)
|
|
#endif
|
|
|
|
/// Dismiss a view controller animatedly or not, depending on the given `animated` parameter.
|
|
/// - Parameter animated: A boolean that represents whether the view controller should be dismissed animatedly or not.
|
|
func dismiss(animated: Bool)
|
|
|
|
}
|
|
|
|
#if canImport(UIKit)
|
|
// MARK: - Router+Implementations
|
|
|
|
public extension Router {
|
|
|
|
// MARK: Functions
|
|
|
|
/// Present a view controller animatedly or not, depending on the given `animated` parameter.
|
|
/// - Parameters:
|
|
/// - viewController: A `UIViewController` view controller instance to present.
|
|
/// - animated: A boolean that represents whether the view controller should be dismissed animatedly or not.
|
|
func present(_ viewController: UIViewController, animated: Bool) {
|
|
present(
|
|
viewController,
|
|
animated: animated,
|
|
onDismiss: nil
|
|
)
|
|
}
|
|
|
|
}
|
|
#endif
|