170 lines
5.0 KiB
Swift
170 lines
5.0 KiB
Swift
//
|
|
// BadgeViewController.swift
|
|
// VDSSample
|
|
//
|
|
// Created by Matt Bruce on 9/22/22.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import VDS
|
|
import VDSCoreTokens
|
|
import Combine
|
|
|
|
class BadgeViewController: BaseViewController<Badge> {
|
|
|
|
enum NumberOfLines: String, CaseIterable {
|
|
case unlimited
|
|
case one
|
|
case two
|
|
case three
|
|
case four
|
|
|
|
var intValue: Int {
|
|
switch self {
|
|
|
|
case .unlimited:
|
|
return 0
|
|
case .one:
|
|
return 1
|
|
case .two:
|
|
return 2
|
|
case .three:
|
|
return 3
|
|
case .four:
|
|
return 4
|
|
}
|
|
}
|
|
}
|
|
|
|
enum FillColor: String, CaseIterable {
|
|
case red, yellow, green, orange, blue, black, white, token, custom
|
|
}
|
|
|
|
enum TextColor: String, CaseIterable {
|
|
case `default`, token, custom
|
|
}
|
|
|
|
lazy var numberOfLinesPickerSelectorView = {
|
|
PickerSelectorView(title: "one",
|
|
picker: self.picker,
|
|
items: NumberOfLines.allCases)
|
|
}()
|
|
|
|
var textField = TextField()
|
|
var maxWidthTextField = NumericField()
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
addContentTopView(view: component, pinTrailing: false)
|
|
setupPicker()
|
|
setupModel()
|
|
}
|
|
|
|
lazy var fillColorSection = {
|
|
TokenColorPickerSection<FillColor>(rowTitle: "Fill Color", picker: self.picker).with {
|
|
$0.onSelected = { [weak self] item in
|
|
guard let self else { return }
|
|
var fillColor: Badge.FillColor = .red
|
|
switch item {
|
|
case .red:
|
|
fillColor = .red
|
|
case .yellow:
|
|
fillColor = .yellow
|
|
case .green:
|
|
fillColor = .green
|
|
case .orange:
|
|
fillColor = .orange
|
|
case .blue:
|
|
fillColor = .blue
|
|
case .black:
|
|
fillColor = .black
|
|
case .white:
|
|
fillColor = .white
|
|
default:
|
|
break
|
|
}
|
|
component.fillColor = fillColor
|
|
}
|
|
$0.onTokenSelected = { [weak self] color in
|
|
guard let self else { return }
|
|
component.fillColor = .token(color)
|
|
}
|
|
$0.onColorSelected = { [weak self] color in
|
|
guard let self else { return }
|
|
component.fillColor = .custom(color)
|
|
}
|
|
}
|
|
}()
|
|
|
|
lazy var textColorSection = {
|
|
TokenColorPickerSection<TextColor>(rowTitle: "Text Color", picker: self.picker).with {
|
|
$0.onSelected = { [weak self] item in
|
|
guard let self else { return }
|
|
component.textColor = nil
|
|
}
|
|
$0.onTokenSelected = { [weak self] color in
|
|
guard let self else { return }
|
|
component.textColor = .token(color)
|
|
}
|
|
$0.onColorSelected = { [weak self] color in
|
|
guard let self else { return }
|
|
component.textColor = .custom(color)
|
|
}
|
|
}
|
|
}()
|
|
|
|
override func setupForm(){
|
|
super.setupForm()
|
|
addFormRow(label: "Surface", view: surfacePickerSelectorView)
|
|
|
|
append(section: fillColorSection)
|
|
append(section: textColorSection)
|
|
|
|
addFormRow(label: "Text", view: textField)
|
|
addFormRow(label: "Max Width", view: maxWidthTextField)
|
|
addFormRow(label: "Number of Lines", view: numberOfLinesPickerSelectorView)
|
|
|
|
textField
|
|
.textPublisher
|
|
.sink { [weak self] text in
|
|
self?.component.text = text
|
|
}.store(in: &subscribers)
|
|
|
|
maxWidthTextField
|
|
.numberPublisher
|
|
.sink { [weak self] number in
|
|
guard let number else { return }
|
|
self?.component.maxWidth = number.cgFloatValue
|
|
}.store(in: &subscribers)
|
|
}
|
|
|
|
func setupModel() {
|
|
component.fillColor = .red
|
|
component.text = "Terms and conditions"
|
|
component.numberOfLines = 1
|
|
|
|
//setup UI
|
|
surfacePickerSelectorView.text = component.surface.rawValue
|
|
textField.text = component.text
|
|
fillColorSection.setDefault(value: .red)
|
|
textColorSection.setDefault(value: .default)
|
|
}
|
|
|
|
func setupPicker(){
|
|
|
|
surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in
|
|
self?.component.surface = item
|
|
self?.contentTopView.backgroundColor = item.color
|
|
}
|
|
}
|
|
}
|
|
|
|
extension BadgeViewController: ComponentSampleable {
|
|
static func makeSample() -> ComponentSample {
|
|
let c = Self()
|
|
c.setupModel()
|
|
return ComponentSample(component: c.component, trailingPinningType: .lessThanOrEqual)
|
|
}
|
|
}
|