From f2a55860616f674167b19179ebef188520a74027 Mon Sep 17 00:00:00 2001 From: Scott Pfeil Date: Tue, 22 Aug 2023 13:33:07 -0400 Subject: [PATCH] testing bug fixes for navigation --- ...VMCoreLoadRequestOperation+Extension.swift | 42 ++++++++++++------- .../NavigationOperation.swift | 1 + 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift index 2101774..2402b7d 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift @@ -45,10 +45,13 @@ public extension MVMCoreLoadRequestOperation { guard let popBackPageType = loadObject.pageJSON?.optionalStringForKey("popBackPageType") else { 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) } 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() return } - // 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 + await navigate(with: navigationOperation, loadObject: loadObject) 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 { - 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 { 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? MVMCoreViewControllerProtocol)?.pageType == pageType }) else { 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)) } } diff --git a/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift b/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift index 26ef9e5..3292f7b 100644 --- a/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift +++ b/MVMCore/MVMCore/PresentationHandling/NavigationOperation.swift @@ -177,6 +177,7 @@ open class NavigationOperation: MVMCoreOperation, UINavigationControllerDelegate open func present(viewController: UIViewController, onController: UIViewController, animated: Bool = true) { NavigationHandler.shared().onNavigationWillBegin.send(self) guard !checkAndHandleForCancellation() else { return } + viewController.modalPresentationStyle = .fullScreen onController.getViewControllerToPresentOn().present(viewController, animated: animated) { [self] in NavigationHandler.shared().onNavigationDidFinish.send(self) markAsFinished()