// // TitleLockupViewController.swift // VDSSample // // Created by Matt Bruce on 12/19/22. // import Foundation import UIKit import VDS import VDSCoreTokens class TitleLockupViewController: BaseViewController { lazy var textAlignmentPickerSelectorView = { PickerSelectorView(title: "left", picker: self.picker, items: TitleLockup.TextAlignment.allCases) }() lazy var titleStandardStylePickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: TitleLockup.TitleStandardStyle.allCases.sorted{ $0.rawValue < $1.rawValue }) }() lazy var otherStandardStylePickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: TitleLockup.OtherStandardStyle.allCases.sorted{ $0.rawValue < $1.rawValue }) }() var titleIsBold = Toggle().with { $0.isOn = true } var eyebrowIsBold = Toggle().with { $0.isOn = true } var eyebrowTextField = TextField() var titleTextField = TextField() var subTitleTextField = TextField() /// ********************************************** /// Text Color lazy var colorPicker: UIColorPickerViewController = { let picker = UIColorPickerViewController() picker.delegate = self return picker }() var currentLabelType: LabelType = .title var colorPickerType: ColorPickerType = .custom enum LabelType { case eyebrow, title, subtitle } enum TitleTextColor: String, CaseIterable { case primary, token, custom } enum TextColor: String, CaseIterable { case primary, secondary, token, custom } enum ColorPickerType { case custom } /// eyebrow var eyebrowTokenFormStackView = FormSection().with { $0.isHidden = true } var eyebrowColorFormStackView = FormSection().with { $0.isHidden = true } lazy var eyebrowColorPickerSelectorView = { PickerSelectorView(title: "primary", picker: self.picker, items: TextColor.allCases) }() lazy var eyebrowTokenColorView = { PickerSelectorView(title: "", picker: self.picker, items: UIColor.VDSColor.allCases) .with { $0.text = UIColor.VDSColor.paletteBlack.rawValue } }() lazy var eyebrowCustomColorView: ColorPickerView = { return .init(with: ColorPickerType.custom, color: .black) { [weak self] picker in self?.colorPickerType = picker.pickerType self?.selectedColorTapped(picker) } }() /// title var titleTokenFormStackView = FormSection().with { $0.isHidden = true } var titleColorFormStackView = FormSection().with { $0.isHidden = true } lazy var titleColorPickerSelectorView = { PickerSelectorView(title: "primary", picker: self.picker, items: TitleTextColor.allCases) }() lazy var titleTokenColorView = { PickerSelectorView(title: "", picker: self.picker, items: UIColor.VDSColor.allCases) .with { $0.text = UIColor.VDSColor.paletteBlack.rawValue } }() lazy var titleCustomColorView: ColorPickerView = { return .init(with: ColorPickerType.custom, color: .black) { [weak self] picker in self?.colorPickerType = picker.pickerType self?.selectedColorTapped(picker) } }() /// subtitle var subtitleTokenFormStackView = FormSection().with { $0.isHidden = true } var subtitleColorFormStackView = FormSection().with { $0.isHidden = true } lazy var subtitleColorPickerSelectorView = { PickerSelectorView(title: "primary", picker: self.picker, items: TextColor.allCases) }() lazy var subtitleTokenColorView = { PickerSelectorView(title: "", picker: self.picker, items: UIColor.VDSColor.allCases) .with { $0.text = UIColor.VDSColor.paletteBlack.rawValue } }() lazy var subtitleCustomColorView: ColorPickerView = { return .init(with: ColorPickerType.custom, color: .black) { [weak self] picker in self?.colorPickerType = picker.pickerType self?.selectedColorTapped(picker) } }() override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: component) setupPicker() setupModel() } override func setupForm(){ super.setupForm() addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Text Alignment", view: textAlignmentPickerSelectorView) append(section: .init().with({ $0.title = "Text Styles" $0.addFormRow(label: "Title", view: titleStandardStylePickerSelectorView) $0.addFormRow(label: "Eyebrow/Subtitle", view: otherStandardStylePickerSelectorView) })) append(section: .init().with({ $0.title = "\nEyebrow" $0.addFormRow(label: "is Bold", view: eyebrowIsBold, pinTrailing: false) $0.addFormRow(label: "Text", view: eyebrowTextField) $0.addFormRow(label: "Color", view: eyebrowColorPickerSelectorView) })) eyebrowTokenFormStackView.addFormRow(label: "Token", view: eyebrowTokenColorView) eyebrowColorFormStackView.addFormRow(label: "Custom", view: eyebrowCustomColorView) append(section: eyebrowTokenFormStackView) append(section: eyebrowColorFormStackView) append(section: .init().with({ $0.title = "\nTitle" $0.addFormRow(label: "is Bold", view: titleIsBold, pinTrailing: false) $0.addFormRow(label: "Text", view: titleTextField) $0.addFormRow(label: "Color", view: titleColorPickerSelectorView) })) titleTokenFormStackView.addFormRow(label: "Token", view: titleTokenColorView) titleColorFormStackView.addFormRow(label: "Custom", view: titleCustomColorView) append(section: titleTokenFormStackView) append(section: titleColorFormStackView) append(section: .init().with({ $0.title = "\nSubtitle" $0.addFormRow(label: "Subtitle Text", view: subTitleTextField) $0.addFormRow(label: "Subtitle Color", view: subtitleColorPickerSelectorView) })) subtitleTokenFormStackView.addFormRow(label: "Token", view: subtitleTokenColorView) subtitleColorFormStackView.addFormRow(label: "Custom", view: subtitleCustomColorView) append(section: subtitleTokenFormStackView) append(section: subtitleColorFormStackView) eyebrowIsBold.publisher(for: .valueChanged).sink { [weak self] toggle in self?.setOtherModels() }.store(in: &subscribers) titleIsBold.publisher(for: .valueChanged).sink { [weak self] toggle in self?.setTitleModel() }.store(in: &subscribers) eyebrowTextField .textPublisher .sink { [weak self] text in self?.setOtherModels() }.store(in: &subscribers) titleTextField .textPublisher .sink { [weak self] text in self?.setTitleModel() }.store(in: &subscribers) subTitleTextField .textPublisher .sink { [weak self] text in self?.setOtherModels() }.store(in: &subscribers) } func setupModel() { let eyebrowModel = TitleLockup.EyebrowModel(text: "Today only.") let titleModel = TitleLockup.TitleModel(text: "Get more of our best") let subTitleModel = TitleLockup.SubTitleModel(text: "Get both of our best and pay less. Pair 5G Home Internet with Verizon mobile to save every month.") component.eyebrowModel = eyebrowModel component.titleModel = titleModel component.subTitleModel = subTitleModel //setup UI surfacePickerSelectorView.text = component.surface.rawValue textAlignmentPickerSelectorView.text = TextAlignment.left.rawValue otherStandardStylePickerSelectorView.text = subTitleModel.otherStandardStyle.rawValue titleStandardStylePickerSelectorView.text = titleModel.standardStyle.rawValue eyebrowTextField.text = eyebrowModel.text titleTextField.text = titleModel.text subTitleTextField.text = subTitleModel.text setTitleModel() updateOtherTextStyles() } func setTitleModel() { var titleTextStyle: TextStyle? if let text = titleTextField.text, !text.isEmpty { var textColor: TitleLockup.TitleTextColor switch titleColorPickerSelectorView.selectedItem { case .primary: textColor = .primary case .token: textColor = .token(titleTokenColorView.selectedItem) case .custom: if let color = titleCustomColorView.selectedColor { textColor = .custom(color) } else { textColor = .custom(VDSColor.elementsPrimaryOnlight) } } component.titleModel = TitleLockup.TitleModel(text: text, textColor: textColor, isBold: titleIsBold.isOn, standardStyle: titleStandardStylePickerSelectorView.selectedItem) titleTextStyle = titleIsBold.isOn ? titleStandardStylePickerSelectorView.selectedItem.value.bold : titleStandardStylePickerSelectorView.selectedItem.value.regular } else { component.titleModel = nil } debug(type: "Title", textStyle: titleTextStyle) } func updateOtherTextStyles() { let items = component.standardStyleConfiguration.configuration(for: titleStandardStylePickerSelectorView.selectedItem)!.allOtherStandardStyles otherStandardStylePickerSelectorView.items = items otherStandardStylePickerSelectorView.text = items.first?.rawValue ?? "" setOtherModels() } func setOtherModels() { let style = otherStandardStylePickerSelectorView.selectedItem if let text = subTitleTextField.text, !text.isEmpty { var textColor: TitleLockup.TextColor switch subtitleColorPickerSelectorView.selectedItem { case .primary: textColor = .primary case .secondary: textColor = .secondary case .token: textColor = .token(subtitleTokenColorView.selectedItem) case .custom: if let color = subtitleCustomColorView.selectedColor { textColor = .custom(color) } else { textColor = .custom(VDSColor.elementsPrimaryOnlight) } } component.subTitleModel = TitleLockup.SubTitleModel(text: text, otherStandardStyle: style, textColor: textColor) debug(type: "SubTitle", textStyle: style.value.regular) } else { component.subTitleModel = nil } if let text = eyebrowTextField.text, !text.isEmpty { var textColor: TitleLockup.TextColor switch eyebrowColorPickerSelectorView.selectedItem { case .primary: textColor = .primary case .secondary: textColor = .secondary case .token: textColor = .token(eyebrowTokenColorView.selectedItem) case .custom: if let color = eyebrowCustomColorView.selectedColor { textColor = .custom(color) } else { textColor = .custom(VDSColor.elementsPrimaryOnlight) } } component.eyebrowModel = TitleLockup.EyebrowModel(text: text, textColor: textColor, isBold: eyebrowIsBold.isOn, standardStyle: style) debug(type: "EyeBrow", textStyle: eyebrowIsBold.isOn ? style.value.bold : style.value.regular) } else { component.eyebrowModel = nil } } func debug(type: String, textStyle: TextStyle?) { guard let textStyle else { return } //DebugLog("\n\(type)\n\(descriptionFor(style: textStyle))\n\n") } //Picker func setupPicker(){ surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.surface = item self?.contentTopView.backgroundColor = item.color } textAlignmentPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.textAlignment = item } titleStandardStylePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.setTitleModel() self?.updateOtherTextStyles() } otherStandardStylePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.setOtherModels() } eyebrowColorPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.currentLabelType = .eyebrow self?.eyebrowTokenFormStackView.isHidden = item != .token self?.eyebrowColorFormStackView.isHidden = item != .custom self?.setOtherModels() } eyebrowTokenColorView.onPickerDidSelect = { [weak self] item in self?.setOtherModels() } titleColorPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.currentLabelType = .title self?.titleTokenFormStackView.isHidden = item != .token self?.titleColorFormStackView.isHidden = item != .custom self?.setTitleModel() } titleTokenColorView.onPickerDidSelect = { [weak self] item in self?.setTitleModel() } subtitleColorPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.currentLabelType = .subtitle self?.subtitleTokenFormStackView.isHidden = item != .token self?.subtitleColorFormStackView.isHidden = item != .custom self?.setOtherModels() } subtitleTokenColorView.onPickerDidSelect = { [weak self] item in self?.setOtherModels() } } } extension TitleLockupViewController: ComponentSampleable { static func makeSample() -> ComponentSample { let component = Self.makeComponent() let eyebrowModel = TitleLockup.EyebrowModel(text: "Today only.") let titleModel = TitleLockup.TitleModel(text: "Get more of our best") let subTitleModel = TitleLockup.SubTitleModel(text: "Get both of our best and pay less. Pair 5G Home Internet with Verizon mobile to save every month.") component.eyebrowModel = eyebrowModel component.titleModel = titleModel component.subTitleModel = subTitleModel return ComponentSample(component: component) } } extension TitleLockupViewController: UIColorPickerViewControllerDelegate { func selectedColorTapped(_ picker: ColorPickerView) { let selectedColor = picker.selectedColor if let selectedColor { colorPicker.selectedColor = selectedColor } present(colorPicker, animated: true) } func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) { dismiss(animated: true) } func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) { guard let hexString = viewController.selectedColor.hexString else { return } var colorView: ColorPickerView switch currentLabelType { case .eyebrow: colorView = eyebrowCustomColorView case .title: colorView = titleCustomColorView case .subtitle: colorView = subtitleCustomColorView } colorView.selectedColor = viewController.selectedColor if currentLabelType == .title { setTitleModel() } else { setOtherModels() } } }