diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index e8105d3e..2c1c44e7 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -12,40 +12,18 @@ import VDS import MVMCore import Combine -open class PillButton: VDS.Button, MVMCoreUIViewConstrainingProtocol, MoleculeViewProtocol, MVMCoreViewProtocol, MFButtonProtocol { - +open class PillButton: VDS.Button, MVMCoreUIViewConstrainingProtocol, MoleculeViewProtocol, MVMCoreViewProtocol, MFButtonProtocol, VDSMoleculeViewProtocol { + //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - open var model: MoleculeModelProtocol? - public var buttonModel: ButtonModel? { - get { model as? ButtonModel } - } - + public var viewModel: ButtonModel! + public var delegateObject: MVMCoreUIDelegateObject? + public var additionalData: [AnyHashable: Any]? + internal var onClickCancellable: Cancellable? - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - required public init() { - super.init(frame: .zero) - } - - public override init(frame: CGRect) { - super.init(frame: .zero) - } - - public required init?(coder: NSCoder) { - super.init(coder: coder) - } - - open override func setup() { - super.setup() - setupView() - } - //-------------------------------------------------- // MARK: - Convenience //-------------------------------------------------- @@ -59,45 +37,45 @@ open class PillButton: VDS.Button, MVMCoreUIViewConstrainingProtocol, MoleculeVi /// The primary styling for a button. Should be used for main buttons open func stylePrimary() { - model = ButtonModel(primaryButtonWith: "", action: ActionNoopModel()) + viewModel = ButtonModel(primaryButtonWith: "", action: ActionNoopModel()) use = .primary } /// The secondary styling for a button. Should be used for secondary buttons open func styleSecondary() { - model = ButtonModel(secondaryButtonWith: "", action: ActionNoopModel()) + viewModel = ButtonModel(secondaryButtonWith: "", action: ActionNoopModel()) use = .secondary } + open override func setup() { + super.setup() + setupView() + } + //-------------------------------------------------- - // MARK: - MoleculeViewProtocol + // MARK: - VDSMoleculeViewProtocol //-------------------------------------------------- - open func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - guard let model = model as? ButtonModel else { return } - self.model = model - - if let accessibilityIdentifier = model.accessibilityIdentifier { + public func viewModelDidUpdate() { + if let accessibilityIdentifier = viewModel.accessibilityIdentifier { self.accessibilityIdentifier = accessibilityIdentifier } - text = model.title - isEnabled = model.enabled - size = model.size -// if let backgroundColor = model.backgroundColor { -// self.backgroundColor = backgroundColor.uiColor -// } - if let accessibilityText = model.accessibilityText { + text = viewModel.title + isEnabled = viewModel.enabled + size = viewModel.size + use = viewModel.style ?? .primary + if let accessibilityText = viewModel.accessibilityText { accessibilityLabel = accessibilityText } - FormValidator.setupValidation(for: model, delegate: delegateObject?.formHolderDelegate) + FormValidator.setupValidation(for: viewModel, delegate: delegateObject?.formHolderDelegate) - set(with: model.action, delegateObject: delegateObject, additionalData: additionalData) + set(with: viewModel.action, delegateObject: delegateObject, additionalData: additionalData) - model.updateUI = { [weak self] in + viewModel.updateUI = { [weak self] in MVMCoreDispatchUtility.performBlock(onMainThread: { - self?.isEnabled = model.enabled + self?.viewModelDidUpdate() }) } } @@ -106,11 +84,6 @@ open class PillButton: VDS.Button, MVMCoreUIViewConstrainingProtocol, MoleculeVi // MARK: - MVMCoreViewProtocol //-------------------------------------------------- - open override func reset() { - super.reset() - //backgroundColor = .clear - } - open class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { return (model as? ButtonModel)?.size.height } @@ -130,13 +103,13 @@ open class PillButton: VDS.Button, MVMCoreUIViewConstrainingProtocol, MoleculeVi //-------------------------------------------------- open func set(with actionModel: ActionModelProtocol?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - onClickCancellable = onClickSubscriber.publisher.sink { [weak self] _ in - guard let self = self, - let actionModel = self.buttonModel?.action else { return } - Task(priority: .userInitiated) { - try await Self.performButtonAction(with: actionModel, button: self, delegateObject: delegateObject, additionalData: additionalData, sourceModel: self.model) + onClickSubscriber = publisher(for: .touchUpInside) + .sink {[weak self] control in + guard let self = self else { return } + Task(priority: .userInitiated) { + try await Self.performButtonAction(with: self.viewModel.action, button: self, delegateObject: delegateObject, additionalData: additionalData, sourceModel: self.viewModel) + } } - } } open class func performButtonAction(with model: ActionModelProtocol, button: MFButtonProtocol, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?, sourceModel: MoleculeModelProtocol? = nil) async throws { diff --git a/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift b/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift index ea462930..369dbb18 100644 --- a/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift +++ b/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift @@ -22,7 +22,7 @@ extension VDS.Button.Size: Codable { let container = try decoder.singleValueContainer() let string = try container.decode(String.self) switch string { - case VDS.Button.Size.large.rawValue: + case VDS.Button.Size.large.rawValue, "standard": self = .large case VDS.Button.Size.small.rawValue, "tiny": self = .small