From 558bedb57ed5c22b07c6798a8f3b98cc5e82324a Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Thu, 21 Mar 2024 23:51:02 +0100 Subject: [PATCH] Implemented the SheetRouter router in the Coordination library. --- .../Kit/Sources/Routers/SheetRouter.swift | 103 ++++++++++++++++++ Libraries/Package.swift | 1 + 2 files changed, 104 insertions(+) create mode 100644 Libraries/Coordination/Kit/Sources/Routers/SheetRouter.swift diff --git a/Libraries/Coordination/Kit/Sources/Routers/SheetRouter.swift b/Libraries/Coordination/Kit/Sources/Routers/SheetRouter.swift new file mode 100644 index 0000000..a748efb --- /dev/null +++ b/Libraries/Coordination/Kit/Sources/Routers/SheetRouter.swift @@ -0,0 +1,103 @@ +// +// SheetRouter.swift +// ReviewsCoordinationKit +// +// Created by Javier Cicchelli on 21/03/2024. +// Copyright © 2024 Röck+Cöde. All rights reserved. +// + +import ReviewsUIKit +import UIKit + +public class SheetRouter: BaseNavigationRouter { + + // MARK: Properties + public unowned let parentViewController: UIViewController + + // MARK: Initialisers + public init(parentViewController: UIViewController) { + self.parentViewController = parentViewController + + super.init(navigationController: .init()) + } + +} + +// MARK: - Router +extension SheetRouter: Router { + + // MARK: Functions + public func present( + _ viewController: UIViewController, + animated: Bool, + onDismiss: Router.OnDismissClosure? + ) { + onDismissForViewController[viewController] = onDismiss + + if navigationController.viewControllers.isEmpty { + presentModally( + viewController, + animated: animated + ) + } else { + navigationController.pushViewController( + viewController, + animated: animated + ) + } + } + + public func dismiss(animated: Bool) { + guard let firstViewController = navigationController.viewControllers.first else { + return + } + + performOnDismiss(for: firstViewController) + + parentViewController.dismiss(animated: animated) + } + +} + +// MARK: - Helpers +private extension SheetRouter { + + // MARK: Actions + @objc func onCancelPressed() { + guard let firstViewController = navigationController.viewControllers.first else { + return + } + + dismiss(animated: true) + + performOnDismiss(for: firstViewController) + } + + // MARK: Functions + func presentModally( + _ viewController: UIViewController, + animated: Bool + ) { + viewController.navigationItem.rightBarButtonItem = UIBarButtonItem( + image: .Icon.close, + style: .plain, + target: self, + action: #selector(onCancelPressed) + ) + + if #available(iOS 15.0, *) { + navigationController.sheetPresentationController?.detents = [.medium(), .large()] + } + + navigationController.setViewControllers( + [viewController], + animated: false + ) + + parentViewController.present( + navigationController, + animated: animated + ) + } + +} diff --git a/Libraries/Package.swift b/Libraries/Package.swift index e0327a1..09d51be 100644 --- a/Libraries/Package.swift +++ b/Libraries/Package.swift @@ -25,6 +25,7 @@ let package = Package( name: .Target.coordination.kit, dependencies: [ .byName(name: .Target.foundation.kit), + .byName(name: .Target.ui.kit), ], path: "Coordination/Kit" ),