From 2e3c63ad5ced256491f2e5d032d9e2ca5feb50ef Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 10 Aug 2022 16:07:04 -0500 Subject: [PATCH] refactored under the hood Signed-off-by: Matt Bruce --- VDS/Classes/Control.swift | 6 +-- VDS/Classes/View.swift | 6 +-- VDS/Components/Label/Label.swift | 6 +-- VDS/Components/RadioButton/RadioButton.swift | 39 +++++++++++++------ .../SelectorBase/SelectorBase.swift | 2 +- .../SelectorBase/SelectorGroup.swift | 12 +++--- VDS/Components/Toggle/Toggle.swift | 1 + 7 files changed, 44 insertions(+), 28 deletions(-) diff --git a/VDS/Classes/Control.swift b/VDS/Classes/Control.swift index 7154ec1c..85a2bc44 100644 --- a/VDS/Classes/Control.swift +++ b/VDS/Classes/Control.swift @@ -13,7 +13,7 @@ import Combine open class Control: UIControl, ModelHandlerable, ViewProtocol, Resettable { @Published public var model: ModelType - private var cancellable: AnyCancellable? + public var cancellables = Set() open func shouldUpdateView(viewModel: ModelType) -> Bool { fatalError("Implement shouldUpdateView") @@ -69,14 +69,14 @@ open class Control: 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() } } diff --git a/VDS/Classes/View.swift b/VDS/Classes/View.swift index 6d44f688..d7db4c7a 100644 --- a/VDS/Classes/View.swift +++ b/VDS/Classes/View.swift @@ -13,7 +13,7 @@ import Combine open class View: UIView, ModelHandlerable, ViewProtocol, Resettable { @Published public var model: ModelType - private var cancellable: AnyCancellable? + public var cancellables = Set() open func shouldUpdateView(viewModel: ModelType) -> Bool { fatalError("Implement shouldUpdateView") @@ -69,14 +69,14 @@ open class View: 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() } } diff --git a/VDS/Components/Label/Label.swift b/VDS/Components/Label/Label.swift index 48dae20b..8d579eaf 100644 --- a/VDS/Components/Label/Label.swift +++ b/VDS/Components/Label/Label.swift @@ -18,7 +18,7 @@ open class LabelBase: UILabel, ModelHandlerable, Initable // MARK: - Combine Properties //-------------------------------------------------- @Published public var model: ModelType - private var cancellable: AnyCancellable? + public var cancellables = Set() //-------------------------------------------------- // MARK: - Properties @@ -98,14 +98,14 @@ open class LabelBase: 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() } diff --git a/VDS/Components/RadioButton/RadioButton.swift b/VDS/Components/RadioButton/RadioButton.swift index 9fed7906..2a4e5e25 100644 --- a/VDS/Components/RadioButton/RadioButton.swift +++ b/VDS/Components/RadioButton/RadioButton.swift @@ -14,7 +14,7 @@ public class RadioButton: RadioButtonBase{ //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 { - 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") } } diff --git a/VDS/Components/SelectorBase/SelectorBase.swift b/VDS/Components/SelectorBase/SelectorBase.swift index 87b39758..cd840e4c 100644 --- a/VDS/Components/SelectorBase/SelectorBase.swift +++ b/VDS/Components/SelectorBase/SelectorBase.swift @@ -65,7 +65,7 @@ open class SelectorBase: Control, Changable view.translatesAutoresizingMaskIntoConstraints = false return view }() - public var didSelect: ((String?) -> ())? + public var didSelect: ((ModelType) -> ())? public var onChange: Blocks.ActionBlock? @Proxy(\.model.id) diff --git a/VDS/Components/SelectorBase/SelectorGroup.swift b/VDS/Components/SelectorBase/SelectorGroup.swift index e379acf3..5d74e553 100644 --- a/VDS/Components/SelectorBase/SelectorGroup.swift +++ b/VDS/Components/SelectorBase/SelectorGroup.swift @@ -14,7 +14,7 @@ public protocol SelectorGroupModel: Modelable, FormFieldable { var selectors: [SelectorType] { get set } } -public struct DefaultSelectorGroupModel: SelectorGroupModel{ +public struct DefaultSelectorGroupModel: SelectorGroupModel { public var inputId: String? public var value: AnyHashable? public var surface: Surface = .light @@ -29,7 +29,7 @@ public struct DefaultSelectorGroupModel: SelectorGr open class SelectorGroup, SelectorHandlerType: SelectorBase>: View, 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 SelectorHandlerType? { return selectorViews.first(where: { existingSelectorView in return existingSelectorView.model.inputId == inputId @@ -103,9 +103,7 @@ open class SelectorGroup: Control, Changable { toggleView.centerXAnchor.constraint(equalTo: toggleContainerView.centerXAnchor).isActive = true toggleView.centerYAnchor.constraint(equalTo: toggleContainerView.centerYAnchor).isActive = true + } public override func reset() {