// // TwoButtonView.swift // MVMCoreUI // // Created by Scott Pfeil on 3/21/19. // Copyright © 2019 Verizon Wireless. All rights reserved. // import UIKit @objcMembers open class TwoButtonView: ButtonView { open var secondaryButton: PrimaryButton? open var viewForButtons = MVMCoreUICommonViewsUtility.commonView() public var heightConstraint: NSLayoutConstraint? public override init() { super.init(frame: .zero) } required public init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } public override init(frame: CGRect) { super.init(frame: frame) } // MARK: - MVMCoreViewProtocol open override func updateView(_ size: CGFloat) { super.updateView(size) MVMCoreDispatchUtility.performBlock(onMainThread: { self.secondaryButton?.updateView(size) }) } // MARK: - MVMCoreUIMoleculeViewProtocol open override func setWithJSON(_ json: [AnyHashable : Any]?, delegate: NSObject?, additionalData: [AnyHashable : Any]?) { super.setWithJSON(json, delegate: delegate, additionalData: additionalData) if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) { backgroundColor = UIColor.mfGet(forHex: backgroundColorString) } let primaryButtonMap = json?.optionalDictionaryForKey("primaryButton") let secondaryButtonMap = json?.optionalDictionaryForKey("secondaryButton") setupUI(withPrimaryButtonMap: primaryButtonMap, secondaryButtonMap: secondaryButtonMap) primaryButton?.setAsStandardCustom() secondaryButton?.setAsSecondaryCustom() primaryButton?.setWithJSON(primaryButtonMap, delegate: delegate, additionalData: additionalData) secondaryButton?.setWithJSON(secondaryButtonMap, delegate: delegate, additionalData: additionalData) } // MARK: - Constraining override func setupButton() { guard viewForButtons.superview != self else { return } addSubview(viewForButtons) setupConstraints(forView: viewForButtons) setupWithTwoButtons() } open func setupWithTwoButtons() { guard viewForButtons != primaryButton?.superview && viewForButtons != secondaryButton?.superview else { return } if let primaryButton = primaryButton { primaryButton.removeFromSuperview() } else { primaryButton = PrimaryButton.button() } if let secondaryButton = secondaryButton { secondaryButton.removeFromSuperview() } else { secondaryButton = PrimaryButton.button() secondaryButton?.bordered = true } guard let primaryButton = primaryButton, let secondaryButton = secondaryButton else { return } viewForButtons.addSubview(primaryButton) viewForButtons.addSubview(secondaryButton) secondaryButton.widthAnchor.constraint(equalTo: primaryButton.widthAnchor, multiplier: 1).isActive = true secondaryButton.topAnchor.constraint(equalTo: viewForButtons.topAnchor).isActive = true primaryButton.topAnchor.constraint(equalTo: viewForButtons.topAnchor).isActive = true viewForButtons.bottomAnchor.constraint(equalTo: secondaryButton.bottomAnchor).isActive = true viewForButtons.bottomAnchor.constraint(equalTo: primaryButton.bottomAnchor).isActive = true NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[leftButton]-10-[rightButton]-0-|", options: NSLayoutConstraint.FormatOptions.alignAllCenterY, metrics: nil, views: ["leftButton": secondaryButton, "rightButton": primaryButton])) } open func setupWithPrimaryButton() { primaryButton?.removeFromSuperview() secondaryButton?.removeFromSuperview() secondaryButton = nil if primaryButton == nil { primaryButton = PrimaryButton.button() } setupWithOneButton(primaryButton!) } open func setupWithSecondaryButton() { primaryButton?.removeFromSuperview() secondaryButton?.removeFromSuperview() primaryButton = nil if secondaryButton == nil { secondaryButton = PrimaryButton.button() secondaryButton?.bordered = true } setupWithOneButton(secondaryButton!) } func setupWithOneButton(_ button: PrimaryButton) { viewForButtons.addSubview(button) button.topAnchor.constraint(equalTo: viewForButtons.topAnchor).isActive = true button.leftAnchor.constraint(equalTo: viewForButtons.leftAnchor).isActive = true viewForButtons.rightAnchor.constraint(equalTo: button.rightAnchor).isActive = true viewForButtons.bottomAnchor.constraint(equalTo: button.bottomAnchor).isActive = true } open func setupUI(withPrimaryButtonMap primaryButtonMap: [AnyHashable: Any]?, secondaryButtonMap: [AnyHashable: Any]?) { if primaryButtonMap != nil, secondaryButtonMap != nil { heightConstraint?.isActive = false setupWithTwoButtons() } else if primaryButtonMap != nil || secondaryButtonMap != nil { heightConstraint?.isActive = false setupWithPrimaryButton() } else { primaryButton?.removeFromSuperview() secondaryButton?.removeFromSuperview() primaryButton = nil secondaryButton = nil if heightConstraint == nil { self.heightConstraint = heightAnchor.constraint(equalToConstant: 0) self.heightConstraint?.isActive = true } } } // MARK: - Legacy open func setup(withButtonMap buttonMap: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: Any]?, buttonDelegate: Any?) { let secondaryButtonMap = buttonMap?.optionalDictionaryForKey(KeySecondaryButton) let primaryButtonMap = buttonMap?.optionalDictionaryForKey(KeyPrimaryButton) setup(primaryButtonMap: primaryButtonMap, secondaryButtonMap: secondaryButtonMap, actionDelegate: actionDelegate, additionalData: additionalData, buttonDelegate: buttonDelegate) } open func setup(primaryButtonMap: [AnyHashable: Any]?, secondaryButtonMap: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: Any]?, buttonDelegate: Any?) { setupUI(withPrimaryButtonMap: primaryButtonMap, secondaryButtonMap: secondaryButtonMap) if primaryButtonMap != nil, secondaryButtonMap != nil { primaryButton?.setWithActionMap(primaryButtonMap, actionDelegate: actionDelegate as? MVMCoreActionDelegateProtocol & NSObjectProtocol, additionalData: additionalData, buttonDelegate: buttonDelegate as? ButtonDelegateProtocol) secondaryButton?.setWithActionMap(secondaryButtonMap, actionDelegate: actionDelegate as? MVMCoreActionDelegateProtocol & NSObjectProtocol, additionalData: additionalData, buttonDelegate: buttonDelegate as? ButtonDelegateProtocol) } else if primaryButtonMap != nil { primaryButton?.setWithActionMap(primaryButtonMap, actionDelegate: actionDelegate as? MVMCoreActionDelegateProtocol & NSObjectProtocol, additionalData: additionalData, buttonDelegate: buttonDelegate as? ButtonDelegateProtocol) } else { primaryButton?.setWithActionMap(secondaryButtonMap, actionDelegate: actionDelegate as? MVMCoreActionDelegateProtocol & NSObjectProtocol, additionalData: additionalData, buttonDelegate: buttonDelegate as? ButtonDelegateProtocol) } } public convenience init(buttonSmall small: Bool, enabled: Bool) { self.init() setupWithPrimaryButton() primaryButton?.setAsSmall(small) primaryButton?.isEnabled = enabled } public convenience init(buttonSmall small: Bool, buttonMap: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: AnyHashable]?, buttonDelegate: Any?) { self.init() setup(withButtonMap: buttonMap, actionDelegate: actionDelegate, additionalData: additionalData, buttonDelegate: buttonMap) primaryButton?.setAsSmall(small) secondaryButton?.setAsSmall(small) } public convenience init(primaryButtonMap: [AnyHashable: Any]?, secondaryButtonMap: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: Any]?, buttonDelegate: Any?) { self.init() setup(primaryButtonMap: primaryButtonMap, secondaryButtonMap: secondaryButtonMap, actionDelegate: actionDelegate, additionalData: additionalData, buttonDelegate: buttonDelegate) } public func hidePrimaryLeftButton() { if let secondaryButton = secondaryButton, !secondaryButton.isHidden { secondaryButton.isHidden = true setupWithPrimaryButton() } } public func hidePrimaryRightButton() { if let primaryButton = primaryButton, !primaryButton.isHidden { primaryButton.isHidden = true setupWithSecondaryButton() } } public func showBothPrimaryButtons() { primaryButton?.isHidden = false secondaryButton?.isHidden = false setupWithTwoButtons() } public func hideBothPrimaryButtons() { primaryButton?.isHidden = true secondaryButton?.isHidden = true } }