vds_ios/VDS/Components/Label/VDSLabel.swift
Matt Bruce 641ae4d572 refactored code for debounce
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
2022-07-29 13:04:36 -05:00

109 lines
2.8 KiB
Swift

//
// 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
}
}