diff --git a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift index 002e7d4..468bf40 100644 --- a/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift +++ b/MVMCore/MVMCore/LoadHandling/MVMCoreLoadRequestOperation+Extension.swift @@ -39,49 +39,37 @@ public enum PopBackError: MVMError, CustomStringConvertible { @objc public extension MVMCoreLoadRequestOperation { + /// Attempt to navigate to the controller with the given load object. Return the controller that we navigated to if successful. @objc @MainActor func goToViewController(loadObject: MVMCoreLoadObject) async -> UIViewController? { guard loadObject.requestParameters?.replaceViewIfOnStackElseLoadWithStyle == true, let pageType = loadObject.pageType else { - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Controller shouldn't be replaced.") + MVMCoreLoggingHandler.logDebugMessage(withDelegate: "\(type(of: self)): A new controller should be made and any existing shouldn't be replaced. pageType:\(String(describing: loadObject.pageType))") return nil } - guard let newVC = MVMCoreViewControllerMappingObject.shared()?.createMFViewController(ofTemplate: loadObject.pageJSON?.optionalStringForKey("template"), pageType: pageType) else { - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Failed to create a new controller") + let template = loadObject.pageJSON?.optionalStringForKey("template") + guard let controllerMappingObject = MVMCoreViewControllerMappingObject.shared()?.getViewControllerMapping(forTemplate: template, pageType: pageType) else { + MVMCoreLoggingHandler.logDebugMessage(withDelegate: "\(type(of: self)): Failed to create a new controller. template:\(String(describing: template)) page:\(pageType)") return nil } - let type = type(of: newVC) - guard let viewController = await NavigationHandler.shared().navigateToViewController(of: pageType, controllerType: type) else { - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: No matching controller found for \(pageType) \(type).") + var controllerType: AnyClass? + if let programmaticMapping = controllerMappingObject as? MVMCoreViewControllerProgrammaticMappingObject { + controllerType = programmaticMapping.viewControllerClass + } else if let newVC = MVMCoreViewControllerMappingObject.shared()?.createMFViewController(ofTemplate: loadObject.pageJSON?.optionalStringForKey("template"), pageType: pageType) { + // Need to create the view controller to fetch the type. + controllerType = type(of: newVC) + } else { + MVMCoreLoggingHandler.logDebugMessage(withDelegate: "\(type(of: self)): Failed to create a new controller. template:\(String(describing: template)) page:\(pageType)") return nil } - MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Navigated to controller of \(pageType) \(type).") + + guard let viewController = await NavigationHandler.shared().navigateToViewController(of: pageType, controllerType: controllerType) else { + MVMCoreLoggingHandler.logDebugMessage(withDelegate: "\(type(of: self)): No matching controller found in the hierarchy. Will need to create a new controller. pageType:\(pageType) controllerType:\(String(describing: controllerType)).") + return nil + } + MVMCoreLoggingHandler.logDebugMessage(withDelegate: "\(type(of: self)): Navigated to controller. pageType:\(pageType) controllerType:\(String(describing: controllerType))") return viewController -// MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil) -// -// -// guard let index = NavigationHandler.shared().navigationController?.viewControllers.firstIndex(where: { controller in -// MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Compare controller pageType:\(pageType) controllerPageType:\((controller as? MVMCoreViewControllerProtocol)?.pageType) type:\(type(of: controller)) newType:\(type(of: newVC))") -// return (controller as? MVMCoreViewControllerProtocol)?.pageType == pageType && type(of: controller) == type(of: newVC) -// }) else { -// MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: No matching controller found.") -// return true -// } -// if index == NavigationHandler.shared().navigationController!.viewControllers.count - 1 { -// MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Controller is already showing.") -// Task { -// MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil) -// } -// } else { -// MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Pop back to controller.") -// guard let operation = try? NavigationHandler.shared().getOperationPopToViewController(with: pageType, navigationController: loadObject.requestParameters?.navigationController, delegateObject: loadObject.delegateObject, animated: !(loadObject.requestParameters?.shouldNotAnimatePush ?? false)) else { return true } -// Task { -// await navigate(with: operation, loadObject: loadObject) -// MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil) -// } -// } -// return false } @objc @@ -117,11 +105,9 @@ public extension MVMCoreLoadRequestOperation { 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().onNavigation - .filter { $0.0 == .willNavigate } + .filter { $0.0 == .willNavigate && navigationOperation == $0.1 } .sink { [weak self] (event, operation) in - if navigationOperation == operation { - self?.stopLoadingAnimationIfNeeded() - } + self?.stopLoadingAnimationIfNeeded() } await NavigationHandler.shared().navigate(with: navigationOperation) cancellable = nil diff --git a/MVMCore/MVMCore/MainProtocols/MVMCoreViewManagerProtocol.h b/MVMCore/MVMCore/MainProtocols/MVMCoreViewManagerProtocol.h index 41438be..6875bb0 100644 --- a/MVMCore/MVMCore/MainProtocols/MVMCoreViewManagerProtocol.h +++ b/MVMCore/MVMCore/MainProtocols/MVMCoreViewManagerProtocol.h @@ -19,7 +19,7 @@ - (nullable NSArray*)getAccessibilityElements; //AccessibilityElements that are owned by Manager. -/// Attempt to navigate to the controller. Return true if navigation occured. +/// Attempt to navigate to the controller. Return the controller that we navigated to if successful. - (void)navigateToViewControllerOfPageType:(nonnull NSString *)pageType controllerType:(_Nullable Class)controllerType completionHandler:(void (^ __nullable)(UIViewController * _Nullable viewController))completionHandler; @optional diff --git a/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.h b/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.h index 27b6078..58e4f2e 100644 --- a/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.h +++ b/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.h @@ -47,6 +47,9 @@ // For pages external to the mobile first framework to be added to the view controller mapping. - (void)addToTemplateViewControllerMapping:(nullable NSDictionary *>*)map; +// Transition function: A mix of new and legacy. +- (nullable NSObject *)getViewControllerMappingForTemplate:(nullable NSString *)templateID pageType:(nullable NSString *)pageType; + // Transition function: A mix of new and legacy. - (nullable UIViewController *)createMFViewControllerOfTemplate:(nullable NSString *)templateID pageType:(nullable NSString *)pageType; diff --git a/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.m b/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.m index f79d501..7d57034 100644 --- a/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.m +++ b/MVMCore/MVMCore/ViewControllerMapping/MVMCoreViewControllerMappingObject.m @@ -46,6 +46,16 @@ } } +- (nullable NSObject *)getViewControllerMappingForTemplate:(nullable NSString *)templateID pageType:(nullable NSString *)pageType { + if (templateID) { + return [self getViewControllerMappingForTemplate:templateID]; + } else if (pageType) { + return [self getViewControllerMappingForPageType:pageType]; + } else { + return nil; + } +} + // Transition function: A mix of new and legacy. - (nullable UIViewController *)createMFViewControllerOfTemplate:(nullable NSString *)templateID pageType:(nullable NSString *)pageType { if (templateID) {