added Equality to Modelable

added AnyEquality to classes that have an a property with 'any'
added default implementation on shouldUpdateView() to check equality, this can be re-implemented in classes
removed all shouldUpdateView methods everywhere since above was done

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2022-09-16 09:14:27 -05:00
parent a07f86efe3
commit 9e2d5fff47
19 changed files with 110 additions and 111 deletions

View File

@ -90,10 +90,6 @@ open class CollectionView<ModelType: Modelable>: UICollectionView, ModelHandlera
//--------------------------------------------------
// MARK: - Overrides
//--------------------------------------------------
open func shouldUpdateView(viewModel: ModelType) -> Bool {
fatalError("Implement shouldUpdateView")
}
open func updateView(viewModel: ModelType) {
fatalError("Implement updateView")
}

View File

@ -96,10 +96,6 @@ open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProto
//--------------------------------------------------
// MARK: - Overrides
//--------------------------------------------------
open func shouldUpdateView(viewModel: ModelType) -> Bool {
fatalError("Implement shouldUpdateView")
}
open func updateView(viewModel: ModelType) {
fatalError("Implement updateView")
}

View File

@ -84,11 +84,7 @@ open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, R
//--------------------------------------------------
// MARK: - Overrides
//--------------------------------------------------
open func shouldUpdateView(viewModel: ModelType) -> Bool {
fatalError("Implement shouldUpdateView")
}
//--------------------------------------------------
open func updateView(viewModel: ModelType) {
fatalError("Implement updateView")
}

View File

@ -228,19 +228,7 @@ open class CheckboxBase<ModelType: CheckboxModel>: Control<ModelType> {
//--------------------------------------------------
// MARK: - State
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
let update = viewModel.selected != model.selected
|| viewModel.labelText != model.labelText
|| viewModel.childText != model.childText
|| viewModel.hasError != model.hasError
|| viewModel.surface != model.surface
|| viewModel.disabled != model.disabled
return update
}
//--------------------------------------------------
open override func updateView(viewModel: ModelType) {
let enabled = !viewModel.disabled

View File

@ -67,15 +67,7 @@ public class CheckboxGroupBase<GroupModelType: CheckboxGroupModel, ModelHandlerT
mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
}
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
let update = viewModel.selectors.count != model.selectors.count
|| viewModel.hasError != model.hasError
|| viewModel.surface != model.surface
|| viewModel.disabled != model.disabled
return update
}
open override func updateView(viewModel: ModelType) {
for selectorModel in viewModel.selectors {
//see if view is there for the model

View File

@ -91,4 +91,33 @@ public struct DefaultCheckboxModel: CheckboxModel {
public var accessibilityLabelDisabled: String?
public init() {}
public static func == (lhs: DefaultCheckboxModel, rhs: DefaultCheckboxModel) -> Bool {
lhs.isEqual(rhs)
}
public func isEqual(_ equatable: DefaultCheckboxModel) -> Bool {
return id == equatable.id
&& selected == equatable.selected
&& labelText == equatable.labelText
&& labelTextAttributes == equatable.labelTextAttributes
&& childText == equatable.childText
&& childTextAttributes == equatable.childTextAttributes
&& hasError == equatable.hasError
&& errorText == equatable.errorText
&& inputId == equatable.inputId
&& value == equatable.value
&& surface == equatable.surface
&& disabled == equatable.disabled
&& dataAnalyticsTrack == equatable.dataAnalyticsTrack
&& dataClickStream == equatable.dataClickStream
&& dataTrack == equatable.dataTrack
&& accessibilityHintEnabled == equatable.accessibilityHintEnabled
&& accessibilityHintDisabled == equatable.accessibilityHintDisabled
&& accessibilityValueEnabled == equatable.accessibilityValueEnabled
&& accessibilityValueDisabled == equatable.accessibilityValueDisabled
&& accessibilityLabelEnabled == equatable.accessibilityLabelEnabled
&& accessibilityLabelDisabled == equatable.accessibilityLabelDisabled
}
}

View File

@ -130,17 +130,7 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, ViewProt
//--------------------------------------------------
// MARK: - Overrides
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open func shouldUpdateView(viewModel: ModelType) -> Bool {
return viewModel.text != model.text
|| viewModel.disabled != model.disabled
|| viewModel.surface != model.surface
|| viewModel.font != model.font
|| viewModel.textPosition != model.textPosition
}
//--------------------------------------------------
open func updateView(viewModel: ModelType) {
textAlignment = viewModel.textPosition.textAlignment
textColor = textColorConfiguration.getColor(viewModel)

View File

@ -8,12 +8,12 @@
import Foundation
import UIKit
public protocol LabelModel: Modelable, Labelable {
public protocol LabelModel: Modelable, Labelable, Equatable, AnyEquatable {
var text: String? { get set }
var attributes: [any LabelAttributeModel]? { get set }
}
public struct DefaultLabelModel: LabelModel, AnyEquatable, Equatable {
public struct DefaultLabelModel: LabelModel {
public static func == (lhs: DefaultLabelModel, rhs: DefaultLabelModel) -> Bool {
lhs.isEqual(rhs)
}

View File

@ -205,19 +205,7 @@ open class RadioBoxBase<ModelType: RadioBoxModel>: Control<ModelType> {
//--------------------------------------------------
// MARK: - State
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
let update = viewModel.selected != model.selected
|| viewModel.text != model.text
|| viewModel.subText != model.subText
|| viewModel.subTextRight != model.subTextRight
|| viewModel.surface != model.surface
|| viewModel.disabled != model.disabled
return update
}
//--------------------------------------------------
open override func updateView(viewModel: ModelType) {
let enabled = !viewModel.disabled

View File

@ -68,14 +68,6 @@ public class RadioBoxGroupBase<GroupModelType: RadioBoxGroupModel, ModelHandlerT
}
}.store(in: &subscribers)
}
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
let update = viewModel.selectedModel?.inputId != model.selectedModel?.inputId
|| viewModel.selectors.count != model.selectors.count
|| viewModel.surface != model.surface
|| viewModel.disabled != model.disabled
return update
}
open override func updateView(viewModel: ModelType) {
for selectorModel in viewModel.selectors {

View File

@ -86,4 +86,37 @@ public struct DefaultRadioBoxModel: RadioBoxModel {
public var accessibilityLabelDisabled: String?
public init() {}
public static func == (lhs: DefaultRadioBoxModel, rhs: DefaultRadioBoxModel) -> Bool {
lhs.isEqual(rhs)
}
public func isEqual(_ equatable: DefaultRadioBoxModel) -> Bool {
return id == equatable.id
&& selected == equatable.selected
&& text == equatable.text
&& textAttributes == equatable.textAttributes
&& subText == equatable.subText
&& subTextAttributes == equatable.subTextAttributes
&& subTextRight == equatable.subTextRight
&& subTextRightAttributes == equatable.subTextRightAttributes
&& selectedAccentColor == equatable.selectedAccentColor
&& strikethrough == equatable.strikethrough
&& inputId == equatable.inputId
&& value == equatable.value
&& surface == equatable.surface
&& disabled == equatable.disabled
&& dataAnalyticsTrack == equatable.dataAnalyticsTrack
&& dataClickStream == equatable.dataClickStream
&& dataTrack == equatable.dataTrack
&& accessibilityHintEnabled == equatable.accessibilityHintEnabled
&& accessibilityHintDisabled == equatable.accessibilityHintDisabled
&& accessibilityValueEnabled == equatable.accessibilityValueEnabled
&& accessibilityValueDisabled == equatable.accessibilityValueDisabled
&& accessibilityLabelEnabled == equatable.accessibilityLabelEnabled
&& accessibilityLabelDisabled == equatable.accessibilityLabelDisabled
}
}

View File

@ -238,19 +238,7 @@ open class RadioButtonBase<ModelType: RadioButtonModel>: Control<ModelType> {
//--------------------------------------------------
// MARK: - State
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
let update = viewModel.selected != model.selected
|| viewModel.labelText != model.labelText
|| viewModel.childText != model.childText
|| viewModel.hasError != model.hasError
|| viewModel.surface != model.surface
|| viewModel.disabled != model.disabled
return update
}
//--------------------------------------------------
open override func updateView(viewModel: ModelType) {
let enabled = !viewModel.disabled

View File

@ -68,15 +68,6 @@ public class RadioButtonGroupBase<GroupModelType: RadioButtonGroupModel, ModelHa
mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
}
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
let update = viewModel.selectedModel?.inputId != model.selectedModel?.inputId
|| viewModel.selectors.count != model.selectors.count
|| viewModel.hasError != model.hasError
|| viewModel.surface != model.surface
|| viewModel.disabled != model.disabled
return update
}
open override func updateView(viewModel: ModelType) {
for selectorModel in viewModel.selectors {

View File

@ -92,4 +92,37 @@ public struct DefaultRadioButtonModel: RadioButtonModel {
public var accessibilityLabelDisabled: String?
public init() {}
public static func == (lhs: DefaultRadioButtonModel, rhs: DefaultRadioButtonModel) -> Bool {
lhs.isEqual(rhs)
}
public func isEqual(_ equatable: DefaultRadioButtonModel) -> Bool {
return id == equatable.id
&& selected == equatable.selected
&& labelText == equatable.labelText
&& labelTextAttributes == equatable.labelTextAttributes
&& childText == equatable.childText
&& childTextAttributes == equatable.childTextAttributes
&& hasError == equatable.hasError
&& errorText == equatable.errorText
&& inputId == equatable.inputId
&& value == equatable.value
&& surface == equatable.surface
&& disabled == equatable.disabled
&& dataAnalyticsTrack == equatable.dataAnalyticsTrack
&& dataClickStream == equatable.dataClickStream
&& dataTrack == equatable.dataTrack
&& accessibilityHintEnabled == equatable.accessibilityHintEnabled
&& accessibilityHintDisabled == equatable.accessibilityHintDisabled
&& accessibilityValueEnabled == equatable.accessibilityValueEnabled
&& accessibilityValueDisabled == equatable.accessibilityValueDisabled
&& accessibilityLabelEnabled == equatable.accessibilityLabelEnabled
&& accessibilityLabelDisabled == equatable.accessibilityLabelDisabled
}
}

View File

@ -139,14 +139,7 @@ open class RadioSwatchBase<ModelType: RadioSwatchModel>: Control<ModelType> {
//--------------------------------------------------
// MARK: - State
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
let should = viewModel != model
return should
}
//--------------------------------------------------
open override func updateView(viewModel: ModelType) {
let enabled = !viewModel.disabled

View File

@ -124,10 +124,6 @@ public class RadioSwatchGroupBase<GroupModelType: RadioSwatchGroupModel, ModelHa
collectionViewHeight?.constant = CGFloat(height)
}
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
return viewModel != model
}
public override func initialSetup() {
super.initialSetup()
collectionView.delegate = self

View File

@ -328,13 +328,7 @@ open class ToggleBase<ModelType: ToggleModel>: Control<ModelType> {
//--------------------------------------------------
// MARK: - State
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
return true
}
//--------------------------------------------------
open override func updateView(viewModel: ModelType) {
label.set(with: viewModel.label)
updateLabel(viewModel)

View File

@ -32,6 +32,10 @@ extension ModelHandlerable {
}
}
public func shouldUpdateView(viewModel: ModelType) -> Bool {
model != viewModel
}
public func setupUpdateView() {
handlerPublisher()
.subscribe(on: RunLoop.main)

View File

@ -7,7 +7,7 @@
import Foundation
public protocol Modelable: Surfaceable, Disabling, Initable, Withable, Identifiable, CustomDebugStringConvertible where ID == UUID {
public protocol Modelable: Surfaceable, Disabling, Initable, Withable, Identifiable, Equatable, CustomDebugStringConvertible where ID == UUID {
}