// // TextEntryFieldViewController.swift // VDSSample // // Created by Matt Bruce on 10/3/22. // import Foundation import UIKit import VDS import VDSColorTokens import Combine class TextEntryFieldViewController: ModelScrollViewController { lazy var helperTextPlacementPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: HelperTextPlacement.allCases) }() var disabledSwitch = UISwitch() var requiredSwitch = UISwitch() var labelTextField = TextField() var errorTextField = TextField() var successTextField = TextField() var helperTextField = TextField() var widthTextField = TextField() var showErrorSwitch = UISwitch() var showSuccessSwitch = UISwitch() var tooltipTitleTextField = TextField() var tooltipContentTextField = TextField() var textEntryField = TextEntryField() override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: textEntryField) setupForm() setupPicker() setupModel(model: getModel()) } func getModel() -> DefaultTextEntryField { var defaultModel = DefaultTextEntryField() defaultModel.type = .text defaultModel.width = 328 defaultModel.labelText = "Street Address" defaultModel.helperText = "For example: 123 Verizon St" defaultModel.errorText = "Enter a valid address." defaultModel.successText = "Good job entering a valid address!" defaultModel.tooltipTitle = "Check the formatting of your address" defaultModel.tooltipContent = "House/Building number then street name" return defaultModel } func setupForm(){ addFormRow(label: "Disabled", view: disabledSwitch) addFormRow(label: "Required", view: requiredSwitch) addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Label Text", view: labelTextField) addFormRow(label: "Helper Text Placement", view: helperTextPlacementPickerSelectorView) addFormRow(label: "Helper Text", view: helperTextField) addFormRow(label: "Error", view: showErrorSwitch) addFormRow(label: "Error Text", view: errorTextField) addFormRow(label: "Success", view: showSuccessSwitch) addFormRow(label: "Success Text", view: successTextField) addFormRow(label: "Width", view: widthTextField) addFormRow(label: "ToolTip Title", view: tooltipTitleTextField) addFormRow(label: "ToolTip Content", view: tooltipContentTextField) textEntryField .handlerPublisher() .sink { [weak self] viewModel in self?.model = viewModel }.store(in: &subscribers) requiredSwitch .publisher(for: .valueChanged) .sink { [weak self] sender in self?.textEntryField.required = sender.isOn }.store(in: &subscribers) showErrorSwitch .publisher(for: .valueChanged) .sink { [weak self] sender in self?.textEntryField.showError = sender.isOn }.store(in: &subscribers) showSuccessSwitch .publisher(for: .valueChanged) .sink { [weak self] sender in self?.textEntryField.showSuccess = sender.isOn }.store(in: &subscribers) disabledSwitch .publisher(for: .valueChanged) .sink { [weak self] sender in self?.textEntryField.disabled = sender.isOn }.store(in: &subscribers) labelTextField .textPublisher .sink { [weak self] text in self?.textEntryField.labelText = text }.store(in: &subscribers) helperTextField .textPublisher .sink { [weak self] text in self?.textEntryField.helperText = text }.store(in: &subscribers) errorTextField .textPublisher .sink { [weak self] text in self?.textEntryField.errorText = text }.store(in: &subscribers) widthTextField .textPublisher .sink { [weak self] width in guard let width = Float(width) else { return } self?.textEntryField.width = CGFloat(width) }.store(in: &subscribers) tooltipTitleTextField .textPublisher .sink { [weak self] text in self?.textEntryField.tooltipTitle = text }.store(in: &subscribers) tooltipContentTextField .textPublisher .sink { [weak self] text in self?.textEntryField.tooltipContent = text }.store(in: &subscribers) } func setupModel(model: DefaultTextEntryField) { set(with: model) textEntryField .handlerPublisher() .sink { [weak self] viewModel in self?.model = viewModel }.store(in: &subscribers) textEntryField .publisher(for: .valueChanged) .sink { textEntryField in if let text = textEntryField.value { print("text entry: \(text)") } else { print("text entry: null") } }.store(in: &subscribers) //setup UI surfacePickerSelectorView.text = model.surface.rawValue disabledSwitch.isOn = model.disabled requiredSwitch.isOn = model.required labelTextField.text = model.labelText helperTextField.text = model.helperText showErrorSwitch.isOn = model.showError errorTextField.text = model.errorText showSuccessSwitch.isOn = model.showSuccess successTextField.text = model.successText tooltipTitleTextField.text = model.tooltipTitle tooltipContentTextField.text = model.tooltipContent if let width = model.width { widthTextField.text = String(describing: width) } } override func updateView(viewModel: ModelType) { print("\(Self.self) updateView(viewModel)") showErrorSwitch.isOn = viewModel.showError disabledSwitch.isOn = viewModel.disabled textEntryField.set(with: viewModel) } //Picker func setupPicker(){ surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.textEntryField.surface = item self?.contentTopView.backgroundColor = item.color } helperTextPlacementPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.textEntryField.helperTextPlacement = item } } }