fix: searching deeplink handler in navigation stack

This commit is contained in:
Nikita Semenov 2023-01-11 13:25:20 +03:00
parent 3d5aa7a41d
commit caeded9561
3 changed files with 51 additions and 6 deletions

View File

@ -25,13 +25,53 @@ import UIKit
public typealias DeeplinkHandlerViewController = DeeplinkHandler & UIViewController
public extension UIViewController {
func findHandler(for deeplink: DeeplinkType) -> DeeplinkHandlerViewController? {
if let deeplinksHandler = self as? DeeplinkHandlerViewController,
deeplinksHandler.canHandle(deeplink: deeplink) {
return deeplinksHandler
}
let deeplinksHandler = presentedViewController?.findHandler(for: deeplink)
return deeplinksHandler
if let deeplinksHandler = presentedViewController?.findHandler(for: deeplink) {
return deeplinksHandler
}
return findHandlerInViewHierarchy(for: deeplink)
}
private func findHandlerInViewHierarchy(for deeplink: DeeplinkType) -> DeeplinkHandlerViewController? {
switch self {
case let navController as UINavigationController:
return navController.viewControllers.reversed().findHadler(for: deeplink)
case let tabController as UITabBarController:
if let deeplinksHandler = tabController.selectedViewController?.findHandler(for: deeplink) {
return deeplinksHandler
} else if var tabControllers = tabController.viewControllers {
if tabController.selectedIndex != NSNotFound {
tabControllers.remove(at: tabController.selectedIndex)
}
if let deeplinksHandler = tabControllers.findHadler(for: deeplink) {
return deeplinksHandler
}
}
default:
return nil
}
return nil
}
}
private extension Sequence where Element: UIViewController {
func findHadler(for deeplink: DeeplinkType) -> DeeplinkHandlerViewController? {
for controller in self {
if let deeplinksHandler = controller.findHandler(for: deeplink) {
return deeplinksHandler
}
}
return nil
}
}

View File

@ -33,7 +33,7 @@ public final class TIDeeplinksService {
private var pendingDeeplink: DeeplinkType?
private(set) var isProcessDeeplink = false
private(set) var isProcessingDeeplink = false
// MARK: - Public properties
@ -48,6 +48,11 @@ public final class TIDeeplinksService {
// MARK: - Public methods
public func configure(mapper: DeeplinkMapper, handler: DeeplinkHandler) {
deeplinkMapper = mapper
deeplinkHandler = handler
}
@discardableResult
public func deferredHandle(url: URL) -> Bool {
pendingDeeplink = deeplinkMapper?.map(url: url)
@ -57,7 +62,7 @@ public final class TIDeeplinksService {
public func reset() {
operationQueue.cancelAllOperations()
pendingDeeplink = nil
isProcessDeeplink = false
isProcessingDeeplink = false
}
public func tryHandle() {
@ -76,13 +81,13 @@ public final class TIDeeplinksService {
}
operationQueue.addOperation { [weak self] in
self?.isProcessDeeplink = true
self?.isProcessingDeeplink = true
self?.pendingDeeplink = nil
}
operationQueue.addOperations(lastOperation.flattenDependencies + [lastOperation],
waitUntilFinished: false)
operationQueue.addOperation { [weak self] in
self?.isProcessDeeplink = false
self?.isProcessingDeeplink = false
}
}
}