refactored under the hood
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
c368f275cb
commit
2e3c63ad5c
@ -13,7 +13,7 @@ import Combine
|
|||||||
open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProtocol, Resettable {
|
open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProtocol, Resettable {
|
||||||
|
|
||||||
@Published public var model: ModelType
|
@Published public var model: ModelType
|
||||||
private var cancellable: AnyCancellable?
|
public var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
open func shouldUpdateView(viewModel: ModelType) -> Bool {
|
open func shouldUpdateView(viewModel: ModelType) -> Bool {
|
||||||
fatalError("Implement shouldUpdateView")
|
fatalError("Implement shouldUpdateView")
|
||||||
@ -69,14 +69,14 @@ open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProto
|
|||||||
if !initialSetupPerformed {
|
if !initialSetupPerformed {
|
||||||
initialSetupPerformed = true
|
initialSetupPerformed = true
|
||||||
//setup viewUpdate
|
//setup viewUpdate
|
||||||
cancellable = $model.filter { viewModel in
|
$model.filter { viewModel in
|
||||||
return self.shouldUpdateView(viewModel: viewModel)
|
return self.shouldUpdateView(viewModel: viewModel)
|
||||||
|
|
||||||
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
self.updateView(viewModel: viewModel)
|
self.updateView(viewModel: viewModel)
|
||||||
|
|
||||||
}
|
}.store(in: &cancellables)
|
||||||
setup()
|
setup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import Combine
|
|||||||
open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, Resettable {
|
open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, Resettable {
|
||||||
|
|
||||||
@Published public var model: ModelType
|
@Published public var model: ModelType
|
||||||
private var cancellable: AnyCancellable?
|
public var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
open func shouldUpdateView(viewModel: ModelType) -> Bool {
|
open func shouldUpdateView(viewModel: ModelType) -> Bool {
|
||||||
fatalError("Implement shouldUpdateView")
|
fatalError("Implement shouldUpdateView")
|
||||||
@ -69,14 +69,14 @@ open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, R
|
|||||||
if !initialSetupPerformed {
|
if !initialSetupPerformed {
|
||||||
initialSetupPerformed = true
|
initialSetupPerformed = true
|
||||||
//setup viewUpdate
|
//setup viewUpdate
|
||||||
cancellable = $model.filter { viewModel in
|
$model.filter { viewModel in
|
||||||
return self.shouldUpdateView(viewModel: viewModel)
|
return self.shouldUpdateView(viewModel: viewModel)
|
||||||
|
|
||||||
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
self.updateView(viewModel: viewModel)
|
self.updateView(viewModel: viewModel)
|
||||||
|
|
||||||
}
|
}.store(in: &cancellables)
|
||||||
setup()
|
setup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,7 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
|
|||||||
// MARK: - Combine Properties
|
// MARK: - Combine Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@Published public var model: ModelType
|
@Published public var model: ModelType
|
||||||
private var cancellable: AnyCancellable?
|
public var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
@ -98,14 +98,14 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
|
|||||||
accessibilityTraits = .staticText
|
accessibilityTraits = .staticText
|
||||||
|
|
||||||
//setup viewUpdate
|
//setup viewUpdate
|
||||||
cancellable = $model.filter { viewModel in
|
$model.filter { viewModel in
|
||||||
return self.shouldUpdateView(viewModel: viewModel)
|
return self.shouldUpdateView(viewModel: viewModel)
|
||||||
|
|
||||||
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
self.updateView(viewModel: viewModel)
|
self.updateView(viewModel: viewModel)
|
||||||
|
|
||||||
}
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
setup()
|
setup()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ public class RadioButton: RadioButtonBase<DefaultRadioButtonModel>{
|
|||||||
//this is where the code would go for the controller
|
//this is where the code would go for the controller
|
||||||
public override func toggleAndAction() {
|
public override func toggleAndAction() {
|
||||||
if let didSelect = self.didSelect {
|
if let didSelect = self.didSelect {
|
||||||
didSelect(model.inputId)
|
didSelect(model)
|
||||||
} else {
|
} else {
|
||||||
super.toggleAndAction()
|
super.toggleAndAction()
|
||||||
}
|
}
|
||||||
@ -35,23 +35,40 @@ public struct RadioButtonGroupModel: SelectorGroupModel{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class RadioButtonGroup: SelectorGroup<DefaultRadioButtonModel, RadioButtonGroupModel, RadioButton> {
|
public class RadioButtonGroup: SelectorGroup<DefaultRadioButtonModel, RadioButtonGroupModel, RadioButton> {
|
||||||
public override func didSelect(selector: RadioButton) {
|
|
||||||
//deselect current selector
|
private func replace(viewModel: DefaultRadioButtonModel){
|
||||||
// if let selectedView = selectedView {
|
guard let viewModelInputId = viewModel.inputId else { return }
|
||||||
// model.selectors.first(where: {$0.inputId == selectedView.model.inputId })?.selected = false
|
if let index = model.selectors.firstIndex(where: { radio in
|
||||||
// }
|
if let cachedInputId = radio.inputId {
|
||||||
// model.selectors.first(where: {$0.inputId == selector.model.inputId })?.selected = true
|
return cachedInputId == viewModelInputId
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
model.selectors[index] = viewModel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override func didSelect(selected: DefaultRadioButtonModel) {
|
||||||
for selectorModel in model.selectors {
|
for selectorModel in model.selectors {
|
||||||
print("Pre Cached Selector: \(selectorModel.inputId): \(selectorModel.selected)")
|
print("Pre Cached Selector: \(selectorModel.inputId): \(selectorModel.selected)")
|
||||||
}
|
}
|
||||||
self.selectedView?.isSelected = false
|
|
||||||
selector.isSelected = true
|
if var oldSelectedModel = selectedModel {
|
||||||
self.selectedView = selector
|
oldSelectedModel.selected = false
|
||||||
print("Change Selector: \(selector.model.inputId): \(selector.model.selected)")
|
replace(viewModel: oldSelectedModel)
|
||||||
|
}
|
||||||
|
|
||||||
|
var newSelectedModel = selected
|
||||||
|
newSelectedModel.selected = true
|
||||||
|
replace(viewModel: newSelectedModel)
|
||||||
|
|
||||||
|
selectedModel = newSelectedModel
|
||||||
|
|
||||||
for selectorModel in model.selectors {
|
for selectorModel in model.selectors {
|
||||||
print("Post Cached Selector: \(selectorModel.inputId): \(selectorModel.selected)")
|
print("Post Cached Selector: \(selectorModel.inputId): \(selectorModel.selected)")
|
||||||
}
|
}
|
||||||
|
|
||||||
print("\n")
|
print("\n")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,7 +65,7 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
|
|||||||
view.translatesAutoresizingMaskIntoConstraints = false
|
view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
return view
|
return view
|
||||||
}()
|
}()
|
||||||
public var didSelect: ((String?) -> ())?
|
public var didSelect: ((ModelType) -> ())?
|
||||||
public var onChange: Blocks.ActionBlock?
|
public var onChange: Blocks.ActionBlock?
|
||||||
|
|
||||||
@Proxy(\.model.id)
|
@Proxy(\.model.id)
|
||||||
|
|||||||
@ -14,7 +14,7 @@ public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable {
|
|||||||
var selectors: [SelectorType] { get set }
|
var selectors: [SelectorType] { get set }
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGroupModel{
|
public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGroupModel {
|
||||||
public var inputId: String?
|
public var inputId: String?
|
||||||
public var value: AnyHashable?
|
public var value: AnyHashable?
|
||||||
public var surface: Surface = .light
|
public var surface: Surface = .light
|
||||||
@ -29,7 +29,7 @@ public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGr
|
|||||||
open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<SelectorType>, SelectorHandlerType: SelectorBase<SelectorType>>: View<SelectorGroupType>, Changable {
|
open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<SelectorType>, SelectorHandlerType: SelectorBase<SelectorType>>: View<SelectorGroupType>, Changable {
|
||||||
|
|
||||||
public var selectorViews: [SelectorHandlerType] = []
|
public var selectorViews: [SelectorHandlerType] = []
|
||||||
public var selectedView: SelectorHandlerType?
|
public var selectedModel: SelectorType?
|
||||||
public var onChange: Blocks.ActionBlock?
|
public var onChange: Blocks.ActionBlock?
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -87,7 +87,7 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
|
|||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
@ -103,9 +103,7 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
|
|||||||
let newSelectorView = SelectorHandlerType(with: selectorModel)
|
let newSelectorView = SelectorHandlerType(with: selectorModel)
|
||||||
newSelectorView.didSelect = {[weak self] (inputId) in
|
newSelectorView.didSelect = {[weak self] (inputId) in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
if let inputId = selectorModel.inputId, let selector = findSelectorView(inputId: inputId) {
|
self.didSelect(selected: selectorModel)
|
||||||
self.didSelect(selector: selector)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
self.selectorViews.append(newSelectorView)
|
self.selectorViews.append(newSelectorView)
|
||||||
mainStackView.addArrangedSubview(newSelectorView)
|
mainStackView.addArrangedSubview(newSelectorView)
|
||||||
@ -114,5 +112,5 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open func didSelect(selector: SelectorHandlerType) { }
|
open func didSelect(selected: SelectorType) { }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -292,6 +292,7 @@ open class ToggleBase<ModelType: ToggleModel>: Control<ModelType>, Changable {
|
|||||||
|
|
||||||
toggleView.centerXAnchor.constraint(equalTo: toggleContainerView.centerXAnchor).isActive = true
|
toggleView.centerXAnchor.constraint(equalTo: toggleContainerView.centerXAnchor).isActive = true
|
||||||
toggleView.centerYAnchor.constraint(equalTo: toggleContainerView.centerYAnchor).isActive = true
|
toggleView.centerYAnchor.constraint(equalTo: toggleContainerView.centerYAnchor).isActive = true
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override func reset() {
|
public override func reset() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user