testing bug fixes for navigation

This commit is contained in:
Scott Pfeil 2023-08-22 13:33:07 -04:00
parent 64535c6b21
commit f2a5586061
2 changed files with 28 additions and 15 deletions

View File

@ -45,10 +45,13 @@ public extension MVMCoreLoadRequestOperation {
guard let popBackPageType = loadObject.pageJSON?.optionalStringForKey("popBackPageType") else { guard let popBackPageType = loadObject.pageJSON?.optionalStringForKey("popBackPageType") else {
throw PopBackError.noPageType throw PopBackError.noPageType
} }
try await NavigationHandler.shared().popToViewController(with: popBackPageType, navigationController: loadObject.requestParameters?.navigationController, delegateObject: loadObject.delegateObject, animated: !(loadObject.requestParameters?.shouldNotAnimatePush ?? false)) let operation = try await NavigationHandler.shared().getOperationPopToViewController(with: popBackPageType, navigationController: loadObject.requestParameters?.navigationController, delegateObject: loadObject.delegateObject, animated: !(loadObject.requestParameters?.shouldNotAnimatePush ?? false))
await navigate(with: operation, loadObject: loadObject)
MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil) MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil)
} catch { } catch {
MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: MVMCoreErrorObject.createErrorObject(for: error, location: MVMCoreLoadHandler.sharedGlobal()?.errorLocation(forRequest: loadObject))) let error = MVMCoreErrorObject.createErrorObject(for: error, location: MVMCoreLoadHandler.sharedGlobal()?.errorLocation(forRequest: loadObject))!
MVMCoreLoadHandler.sharedGlobal()?.attachLoadInformation(loadObject, toError: error)
MVMCoreLoadRequestOperation.loadAbortedWithError(error, loadObject: loadObject)
} }
} }
} }
@ -60,32 +63,41 @@ public extension MVMCoreLoadRequestOperation {
completionHandler() completionHandler()
return return
} }
// stop any loading animation we may have started if we are about to display await navigate(with: navigationOperation, loadObject: loadObject)
cancellable = NavigationHandler.shared().onNavigationWillBegin.sink(receiveValue: { operation in
if navigationOperation == operation,
!self.backgroundLoad,
!(loadObject?.requestParameters?.noloadingOverlay ?? false) {
MVMCoreLoadingOverlayHandler.sharedLoadingOverlay()?.stopLoading(false)
}
})
await NavigationHandler.shared().navigate(with: navigationOperation)
cancellable = nil
completionHandler() completionHandler()
} }
} }
func navigate(with navigationOperation: NavigationOperation, loadObject: MVMCoreLoadObject?) async {
// stop any loading animation we may have started if we are about to display
cancellable = NavigationHandler.shared().onNavigationWillBegin.sink(receiveValue: { operation in
if navigationOperation == operation,
!self.backgroundLoad,
!(loadObject?.requestParameters?.noloadingOverlay ?? false) {
MVMCoreLoadingOverlayHandler.sharedLoadingOverlay()?.stopLoading(false)
}
})
await NavigationHandler.shared().navigate(with: navigationOperation)
cancellable = nil
}
} }
public extension NavigationHandler { public extension NavigationHandler {
func popToViewController(with pageType: String, navigationController: UINavigationController? = nil, delegateObject: DelegateObject? = nil, animated: Bool = true) async throws { @MainActor
func getOperationPopToViewController(with pageType: String, navigationController: UINavigationController? = nil, delegateObject: DelegateObject? = nil, animated: Bool = true) throws -> NavigationOperation {
guard let navigationController = navigationController ?? NavigationHandler.shared().navigationController else { guard let navigationController = navigationController ?? NavigationHandler.shared().navigationController else {
throw PopBackError.noNavigationHandler throw PopBackError.noNavigationHandler
} }
guard let viewController = await navigationController.viewControllers.first(where: { viewController in guard let viewController = navigationController.viewControllers.first(where: { viewController in
(viewController as? MVMCoreViewManagerProtocol)?.containsPage(withPageType: pageType) == true || (viewController as? MVMCoreViewManagerProtocol)?.containsPage(withPageType: pageType) == true ||
(viewController as? MVMCoreViewControllerProtocol)?.pageType == pageType (viewController as? MVMCoreViewControllerProtocol)?.pageType == pageType
}) else { }) else {
throw PopBackError.noViewController throw PopBackError.noViewController
} }
await NavigationHandler.shared().navigate(with: .popTo(viewController: viewController, navigationController: navigationController, animated: animated), delegateObject: delegateObject) return NavigationOperation(with: .popTo(viewController: viewController, navigationController: navigationController, animated: animated), delegate: delegateObject?.presentationDelegate)
}
func popToViewController(with pageType: String, navigationController: UINavigationController? = nil, delegateObject: DelegateObject? = nil, animated: Bool = true) async throws {
try await NavigationHandler.shared().navigate(with: getOperationPopToViewController(with: pageType, navigationController: navigationController, delegateObject: delegateObject, animated: animated))
} }
} }

View File

@ -177,6 +177,7 @@ open class NavigationOperation: MVMCoreOperation, UINavigationControllerDelegate
open func present(viewController: UIViewController, onController: UIViewController, animated: Bool = true) { open func present(viewController: UIViewController, onController: UIViewController, animated: Bool = true) {
NavigationHandler.shared().onNavigationWillBegin.send(self) NavigationHandler.shared().onNavigationWillBegin.send(self)
guard !checkAndHandleForCancellation() else { return } guard !checkAndHandleForCancellation() else { return }
viewController.modalPresentationStyle = .fullScreen
onController.getViewControllerToPresentOn().present(viewController, animated: animated) { [self] in onController.getViewControllerToPresentOn().present(viewController, animated: animated) { [self] in
NavigationHandler.shared().onNavigationDidFinish.send(self) NavigationHandler.shared().onNavigationDidFinish.send(self)
markAsFinished() markAsFinished()