Signed-off-by: Matt Bruce <matt.bruce@verizon.com>

This commit is contained in:
Matt Bruce 2022-08-11 10:56:43 -05:00
parent db018ac32b
commit 036d9462a8

View File

@ -7,7 +7,7 @@
import Foundation import Foundation
import UIKit import UIKit
import Combine
public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable { public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable {
associatedtype SelectorType: SelectorModel associatedtype SelectorType: SelectorModel
@ -32,19 +32,19 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
public var selectorViews: [SelectorHandlerType] = [] public var selectorViews: [SelectorHandlerType] = []
public var selectedModel: SelectorType? public var selectedModel: SelectorType?
public var onChange: Blocks.ActionBlock? public var onChange: Blocks.ActionBlock?
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Private Properties // MARK: - Private Properties
//-------------------------------------------------- //--------------------------------------------------
private var mainStackView: UIStackView = { private var mainStackView: UIStackView = {
let stackView = UIStackView() let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.alignment = .top stackView.alignment = .top
stackView.axis = .vertical stackView.axis = .vertical
stackView.spacing = 10 stackView.spacing = 10
return stackView return stackView
}() }()
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Overrides // MARK: - Overrides
//-------------------------------------------------- //--------------------------------------------------
@ -58,7 +58,7 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
model.selectors = selectors model.selectors = selectors
} }
} }
override public var surface: Surface { override public var surface: Surface {
didSet { didSet {
let selectors = model.selectors.compactMap { existing in let selectors = model.selectors.compactMap { existing in
@ -69,29 +69,29 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
model.selectors = selectors model.selectors = selectors
} }
} }
open override func setup() { open override func setup() {
super.setup() super.setup()
isAccessibilityElement = true isAccessibilityElement = true
accessibilityTraits = .button accessibilityTraits = .button
addSubview(mainStackView) addSubview(mainStackView)
mainStackView.topAnchor.constraint(equalTo: topAnchor).isActive = true mainStackView.topAnchor.constraint(equalTo: topAnchor).isActive = true
mainStackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true mainStackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
} }
open override func shouldUpdateView(viewModel: ModelType) -> Bool { open override func shouldUpdateView(viewModel: ModelType) -> Bool {
return true return true
} }
open override func updateView(viewModel: ModelType) { open override func updateView(viewModel: ModelType) {
print("Selector Group update:") print("Selector Group update:")
func findSelectorView(inputId: String) -> SelectorHandlerType? { func findSelectorView(inputId: String) -> SelectorHandlerType? {
return selectorViews.first(where: { existingSelectorView in return selectorViews.first(where: { existingSelectorView in
return existingSelectorView.model.inputId == inputId return existingSelectorView.model.inputId == inputId
}) })
} }
@ -109,8 +109,8 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
self?.didSelect(selected: model) self?.didSelect(selected: model)
}.store(in: &cancellables) }.store(in: &cancellables)
//add model update to the subscribers
newSelectorView.$model.sink { [weak self] model in newSelectorView.$model.sink { [weak self] model in
//should replace
if let cached = self?.getCachedSelector(viewModel: model), newSelectorView.shouldUpdateView(viewModel: cached) { if let cached = self?.getCachedSelector(viewModel: model), newSelectorView.shouldUpdateView(viewModel: cached) {
self?.replace(viewModel: model) self?.replace(viewModel: model)
} }
@ -122,7 +122,7 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
} }
} }
public func getCachedSelector(viewModel: SelectorType) -> SelectorType? { public func getCachedSelector(viewModel: SelectorType) -> SelectorType? {
if let index = model.selectors.firstIndex(where: { element in if let index = model.selectors.firstIndex(where: { element in
return element.id == viewModel.id return element.id == viewModel.id
@ -142,4 +142,5 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
} }
open func didSelect(selected: SelectorType) { } open func didSelect(selected: SelectorType) { }
} }