refactored under the hood

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2022-08-10 16:07:04 -05:00
parent c368f275cb
commit 2e3c63ad5c
7 changed files with 44 additions and 28 deletions

View File

@ -13,7 +13,7 @@ import Combine
open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProtocol, Resettable {
@Published public var model: ModelType
private var cancellable: AnyCancellable?
public var cancellables = Set<AnyCancellable>()
open func shouldUpdateView(viewModel: ModelType) -> Bool {
fatalError("Implement shouldUpdateView")
@ -69,14 +69,14 @@ open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProto
if !initialSetupPerformed {
initialSetupPerformed = true
//setup viewUpdate
cancellable = $model.filter { viewModel in
$model.filter { viewModel in
return self.shouldUpdateView(viewModel: viewModel)
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
guard let self = self else { return }
self.updateView(viewModel: viewModel)
}
}.store(in: &cancellables)
setup()
}
}

View File

@ -13,7 +13,7 @@ import Combine
open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, Resettable {
@Published public var model: ModelType
private var cancellable: AnyCancellable?
public var cancellables = Set<AnyCancellable>()
open func shouldUpdateView(viewModel: ModelType) -> Bool {
fatalError("Implement shouldUpdateView")
@ -69,14 +69,14 @@ open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, R
if !initialSetupPerformed {
initialSetupPerformed = true
//setup viewUpdate
cancellable = $model.filter { viewModel in
$model.filter { viewModel in
return self.shouldUpdateView(viewModel: viewModel)
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
guard let self = self else { return }
self.updateView(viewModel: viewModel)
}
}.store(in: &cancellables)
setup()
}
}

View File

@ -18,7 +18,7 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
// MARK: - Combine Properties
//--------------------------------------------------
@Published public var model: ModelType
private var cancellable: AnyCancellable?
public var cancellables = Set<AnyCancellable>()
//--------------------------------------------------
// MARK: - Properties
@ -98,14 +98,14 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
accessibilityTraits = .staticText
//setup viewUpdate
cancellable = $model.filter { viewModel in
$model.filter { viewModel in
return self.shouldUpdateView(viewModel: viewModel)
}.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
guard let self = self else { return }
self.updateView(viewModel: viewModel)
}
}.store(in: &cancellables)
setup()
}

View File

@ -14,7 +14,7 @@ public class RadioButton: RadioButtonBase<DefaultRadioButtonModel>{
//this is where the code would go for the controller
public override func toggleAndAction() {
if let didSelect = self.didSelect {
didSelect(model.inputId)
didSelect(model)
} else {
super.toggleAndAction()
}
@ -35,23 +35,40 @@ public struct RadioButtonGroupModel: SelectorGroupModel{
}
public class RadioButtonGroup: SelectorGroup<DefaultRadioButtonModel, RadioButtonGroupModel, RadioButton> {
public override func didSelect(selector: RadioButton) {
//deselect current selector
// if let selectedView = selectedView {
// model.selectors.first(where: {$0.inputId == selectedView.model.inputId })?.selected = false
// }
// model.selectors.first(where: {$0.inputId == selector.model.inputId })?.selected = true
private func replace(viewModel: DefaultRadioButtonModel){
guard let viewModelInputId = viewModel.inputId else { return }
if let index = model.selectors.firstIndex(where: { radio in
if let cachedInputId = radio.inputId {
return cachedInputId == viewModelInputId
} else {
return false
}
}) {
model.selectors[index] = viewModel
}
}
public override func didSelect(selected: DefaultRadioButtonModel) {
for selectorModel in model.selectors {
print("Pre Cached Selector: \(selectorModel.inputId): \(selectorModel.selected)")
}
self.selectedView?.isSelected = false
selector.isSelected = true
self.selectedView = selector
print("Change Selector: \(selector.model.inputId): \(selector.model.selected)")
if var oldSelectedModel = selectedModel {
oldSelectedModel.selected = false
replace(viewModel: oldSelectedModel)
}
var newSelectedModel = selected
newSelectedModel.selected = true
replace(viewModel: newSelectedModel)
selectedModel = newSelectedModel
for selectorModel in model.selectors {
print("Post Cached Selector: \(selectorModel.inputId): \(selectorModel.selected)")
}
print("\n")
}
}

View File

@ -65,7 +65,7 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
public var didSelect: ((String?) -> ())?
public var didSelect: ((ModelType) -> ())?
public var onChange: Blocks.ActionBlock?
@Proxy(\.model.id)

View File

@ -14,7 +14,7 @@ public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable {
var selectors: [SelectorType] { get set }
}
public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGroupModel{
public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGroupModel {
public var inputId: String?
public var value: AnyHashable?
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 {
public var selectorViews: [SelectorHandlerType] = []
public var selectedView: SelectorHandlerType?
public var selectedModel: SelectorType?
public var onChange: Blocks.ActionBlock?
//--------------------------------------------------
@ -87,7 +87,7 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
}
open override func updateView(viewModel: ModelType) {
//print("Selector Group update:")
print("Selector Group update:")
func findSelectorView(inputId: String) -> SelectorHandlerType? {
return selectorViews.first(where: { existingSelectorView in
return existingSelectorView.model.inputId == inputId
@ -103,9 +103,7 @@ open class SelectorGroup<SelectorType, SelectorGroupType: SelectorGroupModel<Sel
let newSelectorView = SelectorHandlerType(with: selectorModel)
newSelectorView.didSelect = {[weak self] (inputId) in
guard let self else { return }
if let inputId = selectorModel.inputId, let selector = findSelectorView(inputId: inputId) {
self.didSelect(selector: selector)
}
self.didSelect(selected: selectorModel)
}
self.selectorViews.append(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) { }
}

View File

@ -292,6 +292,7 @@ open class ToggleBase<ModelType: ToggleModel>: Control<ModelType>, Changable {
toggleView.centerXAnchor.constraint(equalTo: toggleContainerView.centerXAnchor).isActive = true
toggleView.centerYAnchor.constraint(equalTo: toggleContainerView.centerYAnchor).isActive = true
}
public override func reset() {