feat: update findHandler method to findAction

This commit is contained in:
Nikita Semenov 2023-04-01 17:46:13 +03:00
parent 270ac1a4d5
commit a99c29ea73
2 changed files with 24 additions and 23 deletions

View File

@ -25,21 +25,20 @@ import UIKit
open class BaseNavigationStackDeeplinkHandler: DeeplinkHandler {
public var rootViewControllerKeeper: UIViewController
public var rootViewController: UIViewController
public init(rootViewControllerKeeper: UIViewController) {
self.rootViewControllerKeeper = rootViewControllerKeeper
public init(rootViewController: UIViewController) {
self.rootViewController = rootViewController
}
// MARK: - DeeplinkHandler
open func handle(deeplink: Deeplink) -> Operation? {
let handler = findHandler(for: deeplink)
return handler?.handle(deeplink: deeplink)
findAction(for: deeplink)
}
// MARK: - Open methods
open func findHandler(for deeplink: Deeplink) -> DeeplinkHandler? {
rootViewControllerKeeper.findHandler(for: deeplink)
open func findAction(for deeplink: Deeplink) -> Operation? {
rootViewController.findAction(for: deeplink)
}
}

View File

@ -23,35 +23,36 @@
import UIKit
public extension UIViewController {
func findHandler(for deeplink: Deeplink) -> DeeplinkHandler? {
func findAction(for deeplink: Deeplink) -> Operation? {
if let deeplinksHandler = self as? DeeplinkHandler,
let _ = deeplinksHandler.handle(deeplink: deeplink) {
return deeplinksHandler
let operation = deeplinksHandler.handle(deeplink: deeplink) {
return operation
}
if let deeplinksHandler: DeeplinkHandler = presentedViewController?.findHandler(for: deeplink) {
return deeplinksHandler
if let operation = presentedViewController?.findAction(for: deeplink) {
return operation
}
return findHandlerInViewHierarchy(for: deeplink)
return findActionInViewHierarchy(for: deeplink)
}
private func findHandlerInViewHierarchy(for deeplink: Deeplink) -> DeeplinkHandler? {
private func findActionInViewHierarchy(for deeplink: Deeplink) -> Operation? {
switch self {
case let navController as UINavigationController:
let deeplinksHandler = navController.viewControllers.reversed().findHandler(for: deeplink)
return deeplinksHandler
let operation = navController.viewControllers.reversed().findAction(for: deeplink)
return operation
case let tabController as UITabBarController:
if let deeplinksHandler = tabController.selectedViewController?.findHandler(for: deeplink) {
return deeplinksHandler
if let operation = tabController.selectedViewController?.findAction(for: deeplink) {
return operation
} else if var tabControllers = tabController.viewControllers {
if tabController.selectedIndex != NSNotFound {
tabControllers.remove(at: tabController.selectedIndex)
}
if let deeplinksHandler = tabControllers.findHandler(for: deeplink) {
return deeplinksHandler
if let operation = tabControllers.findAction(for: deeplink) {
return operation
}
}
@ -64,10 +65,11 @@ public extension UIViewController {
}
private extension Sequence where Element: UIViewController {
func findHandler(for deeplink: Deeplink) -> DeeplinkHandler? {
func findAction(for deeplink: Deeplink) -> Operation? {
for controller in self {
if let deeplinksHandler = controller.findHandler(for: deeplink) {
return deeplinksHandler
if let operation = controller.findAction(for: deeplink) {
return operation
}
}
return nil