// // VDSLabel.swift // VDS // // Created by Matt Bruce on 7/28/22. // import Foundation import UIKit import VDSColorTokens import Combine open class DefaultLabelModel: VDSLabelModel { public var fontCategory: VDSFontCategory = .body public var fontSize: VDSFontSize = .large public var fontWeight: VDSFontWeight = .regular public var textPosition: VDSTextPosition = .left public var surface: Surface = .light required public init(){} } open class VDSLabel: UILabel, Modelable { @Published public var model: VDSLabelModel = DefaultLabelModel() private var cancellable: AnyCancellable? public var fontSize: VDSFontSize { get { model.fontSize } set { if model.fontSize != newValue { model.fontSize = newValue } } } public var textPosition: VDSTextPosition { get { model.textPosition } set { if model.textPosition != newValue { model.textPosition = newValue } } } public var fontWeight: VDSFontWeight { get { model.fontWeight } set { if model.fontWeight != newValue { model.fontWeight = newValue } } } public var fontCategory: VDSFontCategory { get { model.fontCategory } set { if model.fontCategory != newValue { model.fontCategory = newValue } } } public var surface: Surface { get { model.surface } set { if model.surface != newValue { model.surface = newValue } } } //Initializers public convenience init() { self.init(frame: .zero) } public override init(frame: CGRect) { super.init(frame: frame) setup() } required public init?(coder: NSCoder) { super.init(coder: coder) setup() } func setup() { cancellable = $model.debounce(for: .seconds(ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in self?.onStateChange(viewModel: viewModel) } } //functions private func onStateChange(viewModel: VDSLabelModel) { textAlignment = viewModel.textPosition.textAlignment textColor = viewModel.surface == .dark ? VDSColor.elementsPrimaryOndark : VDSColor.elementsPrimaryOnlight guard let vdsFont = try? VDSFontStyle.font(for: viewModel.fontCategory, fontWeight: viewModel.fontWeight, fontSize: viewModel.fontSize) else { font = VDSFontStyle.RegularBodyLarge.font return } font = vdsFont } //Modelable public func set(with model: VDSLabelModel) { self.model = model } }