// // MoleculeStackTemplate.swift // MVMCoreUI // // Created by Scott Pfeil on 2/11/19. // Copyright © 2019 Verizon Wireless. All rights reserved. // import UIKit public class MoleculeStackTemplate: ThreeLayerViewController { var modulesRequired: NSMutableArray? public override func shouldFinishProcessingLoad(_ loadObject: MVMCoreLoadObject, error: AutoreleasingUnsafeMutablePointer) -> Bool { var shouldFinish = super.shouldFinishProcessingLoad(loadObject, error: error) if shouldFinish, let firstError = modulesNeeded().errors?.firstObject as? MVMCoreErrorObject { // 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()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, constrainIfNeeded: true) else { return nil } return molecule } public override func viewForMiddle() -> UIView? { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("moleculeStack") else { return nil } let stack = MoleculeStackView(frame: .zero) stack.useStackSpacingBeforeFirstItem = true stack.setWithJSON(moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, additionalData: nil) return stack } override public func viewForBottom() -> UIView? { guard let moleculeJSON = loadObject?.pageJSON?.optionalDictionaryForKey("footer"), let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject() as? MVMCoreUIDelegateObject, constrainIfNeeded: true) 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 as? [Any] } /// Gets the modules needed. func modulesNeeded() -> (modules: NSMutableArray?, errors: NSMutableArray?) { let modules: NSMutableArray = [] let errors: NSMutableArray = [] let delegate = delegateObject() as? MVMCoreUIDelegateObject MVMCoreUIMoleculeMappingObject.addRequiredModules(forJSON: loadObject?.pageJSON?.optionalDictionaryForKey("header"), delegateObject: delegate, moduleList: modules, errorList: errors) MVMCoreUIMoleculeMappingObject.addRequiredModules(forJSON: loadObject?.pageJSON?.optionalDictionaryForKey("footer"), delegateObject: delegate, moduleList: modules, errorList: errors) MVMCoreUIMoleculeMappingObject.addRequiredModules(forJSON: loadObject?.pageJSON?.optionalDictionaryForKey("moleculeStack"), delegateObject: delegate, moduleList: modules, errorList: errors) modulesRequired = modules return (modules.count > 0 ? modules : nil, errors.count > 0 ? errors : nil) } }