// // TextEntryFieldViewController.swift // VDSSample // // Created by Matt Bruce on 10/3/22. // import Foundation import UIKit import VDS import VDSColorTokens import Combine class InputFieldViewController: BaseViewController { lazy var helperTextPlacementPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: HelperTextPlacement.allCases) }() var disabledSwitch = Toggle() var requiredSwitch = Toggle() var labelTextField = TextField() var errorTextField = TextField() var successTextField = TextField() var helperTextField = TextField() var widthTextField = NumericField() var showErrorSwitch = Toggle() var showSuccessSwitch = Toggle() var tooltipTitleTextField = TextField() var tooltipContentTextField = TextField() var textEntryField = InputField() override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: textEntryField) setupForm() setupPicker() setupModel() } override func allTextFields() -> [TextField]? { [labelTextField, errorTextField, successTextField, helperTextField, widthTextField, tooltipTitleTextField, tooltipContentTextField] } func setupForm(){ addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Required", view: .makeWrapper(for: 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: .makeWrapper(for: showErrorSwitch)) addFormRow(label: "Error Text", view: errorTextField) addFormRow(label: "Success", view: .makeWrapper(for: showSuccessSwitch)) addFormRow(label: "Success Text", view: successTextField) addFormRow(label: "Width", view: widthTextField) addFormRow(label: "ToolTip Title", view: tooltipTitleTextField) addFormRow(label: "ToolTip Content", view: tooltipContentTextField) 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 guard let self else { return } self.textEntryField.showError = sender.isOn if self.textEntryField.showError != sender.isOn { self.showErrorSwitch.isOn = self.textEntryField.showError } }.store(in: &subscribers) showSuccessSwitch .publisher(for: .valueChanged) .sink { [weak self] sender in guard let self else { return } self.textEntryField.showSuccess = sender.isOn if self.textEntryField.showSuccess != sender.isOn { self.showSuccessSwitch.isOn = self.textEntryField.showSuccess } }.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() { textEntryField.type = .text textEntryField.width = 328 textEntryField.labelText = "Street Address" textEntryField.helperText = "For example: 123 Verizon St" textEntryField.errorText = "Enter a valid address." textEntryField.successText = "Good job entering a valid address!" textEntryField.tooltipTitle = "Check the formatting of your address" textEntryField.tooltipContent = "House/Building number then street name" 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 = textEntryField.surface.rawValue helperTextPlacementPickerSelectorView.text = textEntryField.helperTextPlacement.rawValue disabledSwitch.isOn = textEntryField.disabled requiredSwitch.isOn = textEntryField.required labelTextField.text = textEntryField.labelText helperTextField.text = textEntryField.helperText showErrorSwitch.isOn = textEntryField.showError errorTextField.text = textEntryField.errorText showSuccessSwitch.isOn = textEntryField.showSuccess successTextField.text = textEntryField.successText tooltipTitleTextField.text = textEntryField.tooltipTitle tooltipContentTextField.text = textEntryField.tooltipContent if let width = textEntryField.width { widthTextField.text = String(describing: width) } } //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 } } }