Manager updates for navigating to controller.

This commit is contained in:
Scott Pfeil 2024-03-25 13:29:29 -04:00
parent b9097361ab
commit 54e2ecb313
5 changed files with 53 additions and 26 deletions

View File

@ -41,37 +41,47 @@ public extension MVMCoreLoadRequestOperation {
@objc
@MainActor
func checkIfNewControllerIsNeeded(loadObject: MVMCoreLoadObject) -> Bool {
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.")
return true
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")
return true
return 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
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).")
return nil
}
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
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Navigated to controller of \(pageType) \(type).")
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

View File

@ -586,11 +586,15 @@
if (!error.nativeDrivenErrorScreen) {
// Server driven screen, create normally
[MVMCoreDispatchUtility performBlockOnMainThread:^{
if ([loadObject.operation checkIfNewControllerIsNeededWithLoadObject:loadObject]) {
[loadObject.operation goToViewControllerWithLoadObject:loadObject completionHandler:^(UIViewController * _Nullable viewController) {
[MVMCoreDispatchUtility performBlockInBackground:^{
[MVMCoreLoadRequestOperation createViewControllerWithLoadObject:loadObject completionHandler:completionHandler];
if (viewController) {
[MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:viewController errorObject:nil];
} else {
[MVMCoreLoadRequestOperation createViewControllerWithLoadObject:loadObject completionHandler:completionHandler];
}
}];
}
}];
}];
} else {
// Get the proper native error screen from the delegate

View File

@ -19,6 +19,9 @@
- (nullable NSArray*)getAccessibilityElements; //AccessibilityElements that are owned by Manager.
/// Attempt to navigate to the controller. Return true if navigation occured.
- (void)navigateToViewControllerOfPageType:(nonnull NSString *)pageType controllerType:(_Nullable Class)controllerType completionHandler:(void (^ __nullable)(UIViewController * _Nullable viewController))completionHandler;
@optional
/// Notifies the manager that the controller received new data.

View File

@ -189,6 +189,13 @@ public class NavigationHandler {
await navigate(with: .pop(navigationController: navigationController, animated: animated), delegateObject: delegateObject)
}
}
/// Attempts to go to navigate to a viewcontroller of pageType and controllerType. Returns the view controller if successful
@MainActor
func navigateToViewController(of pageType: String, controllerType: AnyClass?) async -> UIViewController? {
// TODO: Need to manage for present view controllers.
return await MVMCoreObject.sharedInstance()?.viewControllerManager?.navigate(toViewControllerOfPageType: pageType, controllerType: controllerType)
}
}
extension UINavigationController {

View File

@ -23,6 +23,9 @@ public class MVMCoreObject: NSObject {
public var globalLoadDelegate: MVMCoreGlobalLoadProtocol?
public var loadingProtocol: MVMCoreLoadingOverlayDelegateProtocol?
public var loggingDelegate: MVMCoreLoggingDelegateProtocol?
/// The main manager of the view controllers in the application.
public weak var viewControllerManager: MVMCoreViewManagerProtocol?
/// A reference to the calling application delegate that should be set. For a normal app, could be the UIApplicationDelegate. For watch, could be WKExtensionDelegate. For iMessage, could be MSMessagesAppViewController. etc, etc. Useful for the framework to call delegate specific functions.
public weak var applicationDelegate: AnyObject?