// // ModuleMolecule.swift // MVMCoreUI // // Created by Scott Pfeil on 6/25/19. // Copyright © 2019 Verizon Wireless. All rights reserved. // import UIKit open class ModuleMolecule: ViewConstrainingView, ModelMoleculeViewProtocol { open var moduleMolecule: (UIView & MVMCoreUIMoleculeViewProtocol)? open override func updateView(_ size: CGFloat) { super.updateView(size) moduleMolecule?.updateView(size) } public func setWithModel(_ model: MoleculeProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [String: AnyHashable]?) { #warning("This below call should be repaced with super.setWithModel once we get rid of ViewConstrainingView.") //TODO: This below call should be repaced with super.setWithModel once we get rid of ViewConstrainingView. setUpWithModel(model, delegateObject, additionalData) guard let moduleMoleculeModel = model as? ModuleMoleculeModel, let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleMoleculeModel.moduleName) else { // Critical error return } // if moduleMolecule == nil { // MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(<#T##model: MoleculeProtocol##MoleculeProtocol#>, <#T##delegateObject: MVMCoreUIDelegateObject?##MVMCoreUIDelegateObject?#>, <#T##constrainIfNeeded: Bool##Bool#>) // if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: module, delegateObject: delegateObject, constrainIfNeeded: true) { // addSubview(moleculeView) // NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: false).values)) // moduleMolecule = moleculeView // // isAccessibilityElement = false // if moleculeView.accessibilityElements != nil { // accessibilityElements = moleculeView.accessibilityElements // } else { // accessibilityElements = [moleculeView] // } // } // } else { // moduleMolecule?.setWithJSON(module, delegateObject: delegateObject, additionalData: additionalData) // } } // // MARK: - MVMCoreUIMoleculeViewProtocol // open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { // super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) // // guard let moduleName = json?.optionalStringForKey("moduleName"), // let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) else { // // Critical error // return // } // // if moduleMolecule == nil { // if let moleculeView = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: module, delegateObject: delegateObject, constrainIfNeeded: true) { // addSubview(moleculeView) // NSLayoutConstraint.activate(Array(NSLayoutConstraint.pinView(toSuperview: moleculeView, useMargins: false).values)) // moduleMolecule = moleculeView // // isAccessibilityElement = false // if moleculeView.accessibilityElements != nil { // accessibilityElements = moleculeView.accessibilityElements // } else { // accessibilityElements = [moleculeView] // } // } // } else { // moduleMolecule?.setWithJSON(module, delegateObject: delegateObject, additionalData: additionalData) // } // } open override func setAsMolecule() { super.setAsMolecule() moduleMolecule?.setAsMolecule?() } open override func reset() { super.reset() moduleMolecule?.reset?() } public override class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { guard let moduleName = json?.optionalStringForKey("moduleName"), let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) else { // Critical error return 0 } return MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: module)?.estimatedHeight?(forRow: module, delegateObject: delegateObject) ?? 0 } public override class func name(forReuse molecule: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? { guard let moduleName = molecule?.optionalStringForKey("moduleName"), let module = delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) else { // Critical error return "moduleMolecule<>" } return "moduleMolecule<" + (MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: module)?.name?(forReuse: module, delegateObject: delegateObject) ?? module.stringForkey(KeyMoleculeName)) + ">" } public override class func requiredModules(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> [String]? { let moduleName = json?.optionalStringForKey("moduleName") if moduleName == nil || delegateObject?.moleculeDelegate?.getModuleWithName(moduleName) == nil { if let errorObject = MVMCoreErrorObject(title: nil, message: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorUnableToProcess), code: CoreUIErrorCode.ErrorCodeModuleMolecule.rawValue, domain: ErrorDomainNative, location: String(describing: self)) { error?.pointee = errorObject MVMCoreUILoggingHandler.shared()?.addError(toLog: errorObject) } } if let moduleName = moduleName { return [moduleName] } return nil } // MARK: - MVMCoreUIViewConstrainingProtocol open override func useStandardConstraints() -> Bool { return (moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.useStandardConstraints?() ?? true } open override func alignHorizontal(_ alignment: UIStackView.Alignment) { (moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.alignHorizontal?(alignment) } open override func alignVertical(_ alignment: UIStackView.Alignment) { (moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.alignVertical?(alignment) } open override func shouldSetHorizontalMargins(_ shouldSet: Bool) { (moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetHorizontalMargins?(shouldSet) } open override func shouldSetVerticalMargins(_ shouldSet: Bool) { (moduleMolecule as? MVMCoreUIViewConstrainingProtocol)?.shouldSetVerticalMargins?(shouldSet) } }