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 @objc
@MainActor @MainActor
func checkIfNewControllerIsNeeded(loadObject: MVMCoreLoadObject) -> Bool { func goToViewController(loadObject: MVMCoreLoadObject) async -> UIViewController? {
guard loadObject.requestParameters?.replaceViewIfOnStackElseLoadWithStyle == true, guard loadObject.requestParameters?.replaceViewIfOnStackElseLoadWithStyle == true,
let pageType = loadObject.pageType else { let pageType = loadObject.pageType else {
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Controller shouldn't be replaced.") 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 { guard let newVC = MVMCoreViewControllerMappingObject.shared()?.createMFViewController(ofTemplate: loadObject.pageJSON?.optionalStringForKey("template"), pageType: pageType) else {
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Failed to create a new controller") 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 let type = type(of: newVC)
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Compare controller pageType:\(pageType) controllerPageType:\((controller as? MVMCoreViewControllerProtocol)?.pageType) type:\(type(of: controller)) newType:\(type(of: newVC))") guard let viewController = await NavigationHandler.shared().navigateToViewController(of: pageType, controllerType: type) else {
return (controller as? MVMCoreViewControllerProtocol)?.pageType == pageType && type(of: controller) == type(of: newVC) MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: No matching controller found for \(pageType) \(type).")
}) else { return nil
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: No matching controller found.")
return true
} }
if index == NavigationHandler.shared().navigationController!.viewControllers.count - 1 { MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Navigated to controller of \(pageType) \(type).")
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Controller is already showing.") return viewController
Task { // MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil)
MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil) //
} //
} else { // guard let index = NavigationHandler.shared().navigationController?.viewControllers.firstIndex(where: { controller in
MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Pop back to controller.") // MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: Compare controller pageType:\(pageType) controllerPageType:\((controller as? MVMCoreViewControllerProtocol)?.pageType) type:\(type(of: controller)) newType:\(type(of: newVC))")
guard let operation = try? NavigationHandler.shared().getOperationPopToViewController(with: pageType, navigationController: loadObject.requestParameters?.navigationController, delegateObject: loadObject.delegateObject, animated: !(loadObject.requestParameters?.shouldNotAnimatePush ?? false)) else { return true } // return (controller as? MVMCoreViewControllerProtocol)?.pageType == pageType && type(of: controller) == type(of: newVC)
Task { // }) else {
await navigate(with: operation, loadObject: loadObject) // MVMCoreLoggingHandler.logDebugMessage(withDelegate: "CACHEDFEED: No matching controller found.")
MVMCoreLoadRequestOperation.loadFinished(loadObject, loadedViewController: nil, errorObject: nil) // return true
} // }
} // if index == NavigationHandler.shared().navigationController!.viewControllers.count - 1 {
return false // 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 @objc

View File

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

View File

@ -19,6 +19,9 @@
- (nullable NSArray*)getAccessibilityElements; //AccessibilityElements that are owned by Manager. - (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 @optional
/// Notifies the manager that the controller received new data. /// 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) 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 { extension UINavigationController {

View File

@ -24,6 +24,9 @@ public class MVMCoreObject: NSObject {
public var loadingProtocol: MVMCoreLoadingOverlayDelegateProtocol? public var loadingProtocol: MVMCoreLoadingOverlayDelegateProtocol?
public var loggingDelegate: MVMCoreLoggingDelegateProtocol? 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. /// 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? public weak var applicationDelegate: AnyObject?