// // 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: UIView? 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) } public func setDefaultCustom() { primaryButton?.setAsStandardCustom() secondaryButton?.setAsSecondaryCustom() } // 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]?, delegateObject: DelegateObject?, additionalData: [AnyHashable: Any]?) { super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) if let backgroundColorString = json?.optionalStringForKey(KeyBackgroundColor) { backgroundColor = UIColor.mfGet(forHex: backgroundColorString) } let primaryButtonMap = json?.optionalDictionaryForKey("primaryButton") let secondaryButtonMap = json?.optionalDictionaryForKey("secondaryButton") set(primaryButtonJSON: primaryButtonMap, secondaryButtonJSON: secondaryButtonMap, delegateObject: delegateObject, additionalData: additionalData) } // MARK: - Constraining override func setupButton() { setupWithTwoButtons() } func createPrimaryButton() { if primaryButton == nil { primaryButton = PrimaryButton.button() } } func createSecondaryButton() { if secondaryButton == nil { secondaryButton = PrimaryButton.button() secondaryButton?.bordered = true } } func removeButtons() { viewForButtons?.removeFromSuperview() primaryButton?.removeFromSuperview() secondaryButton?.removeFromSuperview() viewForButtons = nil secondaryButton = nil primaryButton = nil } open func setupConstraintsForViewWithButtons() { guard let viewForButtons = viewForButtons, 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])) } func setupWithTwoButtons() { guard self.viewForButtons == nil else { return } let viewForButtons = MVMCoreUICommonViewsUtility.commonView() addSubview(viewForButtons) self.viewForButtons = viewForButtons setupConstraints(forView: viewForButtons) alignCenter() createPrimaryButton() createSecondaryButton() setupConstraintsForViewWithButtons() } open func setupWithPrimaryButton() { guard self.primaryButton == nil else { return } createPrimaryButton() if let primaryButton = primaryButton { addSubview(primaryButton) setupConstraints(forView: primaryButton) alignCenter() } } // Sets up the number of buttons based on the maps. Doesn't set the buttons with the maps because legacy code handles differently from modern code... func setupUI(withPrimaryButtonMap primaryButtonMap: [AnyHashable: Any]?, secondaryButtonMap: [AnyHashable: Any]?, legacy: Bool) { if primaryButtonMap != nil, secondaryButtonMap != nil { heightConstraint?.isActive = false if primaryButton == nil || secondaryButton == nil { removeButtons() setupWithTwoButtons() } } else if primaryButtonMap != nil || (secondaryButtonMap != nil && legacy) { // Only legacy sets up the primary button with a secondary map heightConstraint?.isActive = false if primaryButton == nil || secondaryButton != nil { removeButtons() setupWithPrimaryButton() } } else { removeButtons() if heightConstraint == nil { heightConstraint = heightAnchor.constraint(equalToConstant: 0) heightConstraint?.isActive = true } } } open func set(primaryButtonJSON: [AnyHashable: Any]?, secondaryButtonJSON: [AnyHashable: Any]?, delegateObject: DelegateObject?, additionalData: [AnyHashable: Any]?) { setupUI(withPrimaryButtonMap: primaryButtonJSON, secondaryButtonMap: secondaryButtonJSON, legacy: false) setDefaultCustom() primaryButton?.setWithJSON(primaryButtonJSON, delegateObject: delegateObject, additionalData: additionalData) secondaryButton?.setWithJSON(secondaryButtonJSON, delegateObject: delegateObject, additionalData: additionalData) } // MARK: - Legacy public convenience init(buttonSmall small: Bool, enabled: Bool) { self.init() removeButtons() setupWithPrimaryButton() primaryButton?.setAsSmall(small) primaryButton?.isEnabled = enabled } public func hidePrimaryLeftButton() { guard let secondaryButton = secondaryButton, !secondaryButton.isHidden else { return } secondaryButton.isHidden = true if let primaryButton = primaryButton { primaryButton.removeFromSuperview() viewForButtons?.addSubview(primaryButton) NSLayoutConstraint.constraintPinSubview(toSuperview: primaryButton) } } public func hidePrimaryRightButton() { guard let primaryButton = primaryButton, !primaryButton.isHidden else { return } primaryButton.isHidden = true if let secondaryButton = secondaryButton { secondaryButton.removeFromSuperview() viewForButtons?.addSubview(secondaryButton) NSLayoutConstraint.constraintPinSubview(toSuperview: secondaryButton) } } public func showBothPrimaryButtons() { primaryButton?.isHidden = false secondaryButton?.isHidden = false if let primaryButton = primaryButton, let secondaryButton = secondaryButton { primaryButton.removeFromSuperview() secondaryButton.removeFromSuperview() setupConstraintsForViewWithButtons() } } public func hideBothPrimaryButtons() { primaryButton?.isHidden = true secondaryButton?.isHidden = true } } // MARK: - Deprecate extension TwoButtonView { @available(*, deprecated) open func setup(primaryButtonMap: [AnyHashable: Any]?, secondaryButtonMap: [AnyHashable: Any]?, actionDelegate: NSObjectProtocol?, additionalData: [AnyHashable: Any]?, buttonDelegate: Any?) { setupUI(withPrimaryButtonMap: primaryButtonMap, secondaryButtonMap: secondaryButtonMap, legacy: true) 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) primaryButton?.bordered = false } else if secondaryButtonMap != nil { primaryButton?.setWithActionMap(secondaryButtonMap, actionDelegate: actionDelegate as? MVMCoreActionDelegateProtocol & NSObjectProtocol, additionalData: additionalData, buttonDelegate: buttonDelegate as? ButtonDelegateProtocol) primaryButton?.bordered = true } } @available(*, deprecated) 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) } @available(*, deprecated) 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: buttonDelegate) primaryButton?.setAsSmall(small) secondaryButton?.setAsSmall(small) } @available(*, deprecated) 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) } }