mvm_core_ui/MVMCoreUI/Templates/MoleculeStackTemplate.swift
Pfeil, Scott Robert 0f458d21a3 module molecule
2019-05-15 11:16:08 -04:00

86 lines
3.6 KiB
Swift

//
// 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<MVMCoreErrorObject>) -> 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)
}
}