// // MoleculeStackTemplate.swift // MVMCoreUI // // Created by Scott Pfeil on 2/11/19. // Copyright © 2019 Verizon Wireless. All rights reserved. // import UIKit public class MoleculeStackTemplate: ThreeLayerViewController { public override func shouldFinishProcessingLoad(_ loadObject: MVMCoreLoadObject, error: AutoreleasingUnsafeMutablePointer) -> Bool { var shouldFinish = super.shouldFinishProcessingLoad(loadObject, error: error) if shouldFinish, let firstError = modulesNeeded().errors?.first { // Don't continue if there was an error loading needed modules. error.pointee = firstError shouldFinish = false } return shouldFinish } public override func spaceBetweenTopAndMiddle() -> CGFloat? { return 0 } public override func viewForTop() -> UIView? { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("header"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeForStack(withJSON: moleculeJSON, delegateObject: delegateObject()) else { return nil } return molecule } public override func viewForMiddle() -> UIView? { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("moleculeStack") else { return nil } return MoleculeStackView(withJSON: moleculeJSON, delegateObject: delegateObject(), additionalData: nil) } override public func viewForBottom() -> UIView? { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("footer"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeForStack(withJSON: moleculeJSON, delegateObject: delegateObject()) else { return nil } return molecule } // MARK: - cache handling public override func pageTypesToListenFor() -> [Any]? { guard let pageType = self.pageType else { return super.pageTypesToListenFor() } return [pageType] } public override func modulesToListenFor() -> [Any]? { // Get all of the molecules that need modules. return modulesNeeded().modules } // MARK: - Module Molecule Handling func addModule(for moduleMolecule: [AnyHashable: Any]?, modules: inout [String], errors: inout [MVMCoreErrorObject]) { var error: MVMCoreErrorObject? if let moleculeName = MVMCoreUIMoleculeMappingObject.getMoleculeName(forModuleMolecule: moduleMolecule, moduleMap: loadObject?.modulesJSON, error: &error) { modules.append(moleculeName) if let errorObject = error { MVMCoreLoggingHandler.shared()?.addError(toLog: errorObject) errors.append(errorObject) } } } func modulesNeeded() -> (modules: [String]?, errors: [MVMCoreErrorObject]?) { var modules: [String] = [] var errors: [MVMCoreErrorObject] = [] addModule(for: loadObject?.pageJSON?.optionalDictionaryForKey("header"), modules: &modules, errors: &errors) addModule(for: loadObject?.pageJSON?.optionalDictionaryForKey("footer"), modules: &modules, errors: &errors) if let molecules = loadObject?.pageJSON?.optionalArrayForChainOfKeysOrIndexes(["moleculeStack","molecules"]) as? [[AnyHashable: Any]] { for molecule in molecules { addModule(for: molecule, modules: &modules, errors: &errors) } } return (modules.count > 0 ? modules : nil, errors.count > 0 ? errors : nil) } }