vds_ios/VDS/Components/SelectorBase/SelectorGroup.swift
Matt Bruce 15d71e41dd added uuid
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2022-08-10 16:25:56 -05:00

126 lines
4.2 KiB
Swift

//
// RadioButtonGroup.swift
// VDS
//
// Created by Matt Bruce on 8/8/22.
//
import Foundation
import UIKit
public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable {
associatedtype SelectorType: SelectorModel
var selectors: [SelectorType] { get set }
}
public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGroupModel {
public var id: UUID = UUID()
public var inputId: String?
public var value: AnyHashable?
public var surface: Surface = .light
public var disabled: Bool = false
public var selectors: [SelectorType]
public init() { selectors = [] }
public init(selectors: [SelectorType]){
self.selectors = selectors
}
}
open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<SelectorType>, SelectorHandlerType: SelectorBase<SelectorType>>: View<SelectorGroupType>, Changable {
public var selectorViews: [SelectorHandlerType] = []
public var selectedModel: SelectorType?
public var onChange: Blocks.ActionBlock?
//--------------------------------------------------
// MARK: - Private Properties
//--------------------------------------------------
private var mainStackView: UIStackView = {
let stackView = UIStackView()
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.alignment = .top
stackView.axis = .vertical
stackView.spacing = 10
return stackView
}()
//--------------------------------------------------
// MARK: - Overrides
//--------------------------------------------------
override public var disabled: Bool {
didSet {
let selectors = model.selectors.compactMap { existing in
return updated(existing){
$0.disabled = disabled
}
}
model.selectors = selectors
}
}
override public var surface: Surface {
didSet {
let selectors = model.selectors.compactMap { existing in
return updated(existing){
$0.surface = surface
}
}
model.selectors = selectors
}
}
open override func setup() {
super.setup()
isAccessibilityElement = true
accessibilityTraits = .button
addSubview(mainStackView)
mainStackView.topAnchor.constraint(equalTo: topAnchor).isActive = true
mainStackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
}
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
return true
}
open override func updateView(viewModel: ModelType) {
print("Selector Group update:")
func findSelectorView(inputId: String) -> SelectorHandlerType? {
return selectorViews.first(where: { existingSelectorView in
return existingSelectorView.model.inputId == inputId
})
}
for selectorModel in viewModel.selectors {
//see if view is there for the model
if let inputId = selectorModel.inputId, let foundSelectorView = findSelectorView(inputId: inputId) {
foundSelectorView.set(with: selectorModel)
} else {
//create view
let newSelectorView = SelectorHandlerType(with: selectorModel)
newSelectorView.didSelect = {[weak self] (inputId) in
guard let self else { return }
self.didSelect(selected: selectorModel)
}
self.selectorViews.append(newSelectorView)
mainStackView.addArrangedSubview(newSelectorView)
}
}
}
public func replace(viewModel: SelectorType){
if let index = model.selectors.firstIndex(where: { element in
return element.id == viewModel.id
}) {
model.selectors[index] = viewModel
}
}
open func didSelect(selected: SelectorType) { }
}