// // ModalViewController.swift // VDSSample // // Created by Kanamarlapudi, Vasavi on 05/09/24. // import Foundation import UIKit import VDS import VDSCoreTokens import Combine class ModalViewController: BaseViewController { var showFooterSwitch = Toggle() var fullScreenDialogSwitch = Toggle() var singleButtonSwitch = Toggle() var hideCloseSwitch = Toggle() var titleTextField = TextField() var bodyTextField = TextField() override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: .makeWrapper(for: component, edgeSpacing: 16.0), edgeSpacing: 0.0) setupPicker() setupModel() } override func setupForm(){ super.setupForm() addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Show Modal Footer", view: showFooterSwitch, pinTrailing: false) addFormRow(label: "Full Screen Dialog", view: fullScreenDialogSwitch, pinTrailing: false) addFormRow(label: "Single Button", view: singleButtonSwitch, pinTrailing: false) addFormRow(label: "Hide Close Button", view: hideCloseSwitch, pinTrailing: false) addFormRow(label: "Modal Title", view: titleTextField) addFormRow(label: "Modal Body", view: bodyTextField) fullScreenDialogSwitch.publisher(for: .valueChanged).sink { [weak self] control in self?.component.fullScreenDialog = control.isOn }.store(in: &subscribers) showFooterSwitch.publisher(for: .valueChanged).sink { [weak self] control in guard let self else { return } if control.isOn { showFooter(with: singleButtonSwitch.isOn) } else { self.component.buttonData = nil } }.store(in: &subscribers) singleButtonSwitch.publisher(for: .valueChanged).sink { [weak self] control in guard let self else { return } if control.isOn { showFooterSwitch.isOn = true } showFooter(with: control.isOn) }.store(in: &subscribers) hideCloseSwitch.publisher(for: .valueChanged).sink { [weak self] control in self?.component.hideCloseButton = control.isOn }.store(in: &subscribers) titleTextField .textPublisher .sink { [weak self] text in self?.component.title = text }.store(in: &subscribers) bodyTextField .textPublisher .sink { [weak self] text in self?.component.content = text }.store(in: &subscribers) } func showFooter(with singleButton: Bool) { if singleButton { component.buttonData = [ Button().with{ $0.use = .secondary; $0.text = "Close"; $0.onClick = { button in self.dismiss(animated: true); print("\(button.text!) clicked")} ; $0.size = .large } ] } else { component.buttonData = [ Button().with{ $0.use = .primary; $0.text = "In-store Pickup"; $0.onClick = { button in print("\(button.text!) clicked")}; $0.size = .large }, Button().with{ $0.use = .secondary; $0.text = "Close"; $0.onClick = { button in self.dismiss(animated: true); print("\(button.text!) clicked")} ; $0.size = .large } ] } } func setupModel() { component.title = "Choose free 2-day shipping or In-store Pickup" component.content = "Order online, pickup in store, or get free 2-day shipping. Free 2-day shipping available for device and accessory orders of $49 or more. Free 2-day shipping when you order online M-F by 8PM EST. In-Store Pickup is available across the U.S. at participating Verizon Wireless stores. Please bring photo ID and credit/debit card only if used as payment. Order will be held for 3 days from the time if was placed. \n \n Order online, pickup in store, or get free 2-day shipping. Free 2-day shipping available for device and accessory orders of $49 or more. Free 2-day shipping when you order online M-F by 8PM EST. In-Store Pickup is available across the U.S. at participating Verizon Wireless stores. Please bring photo ID and credit/debit card only if used as payment. Order will be held for 3 days from the time if was placed. \n \n Order online, pickup in store, or get free 2-day shipping. Free 2-day shipping available for device and accessory orders of $49 or more. Free 2-day shipping when you order online M-F by 8PM EST. In-Store Pickup is available across the U.S. at participating Verizon Wireless stores. Please bring photo ID and credit/debit card only if used as payment. Order will be held for 3 days from the time if was placed. \n \n Order online, pickup in store, or get free 2-day shipping. Free 2-day shipping available for device and accessory orders of $49 or more. Free 2-day shipping when you order online M-F by 8PM EST. In-Store Pickup is available across the U.S. at participating Verizon Wireless stores. Please bring photo ID and credit/debit card only if used as payment. Order will be held for 3 days from the time if was placed. \n \n Order online, pickup in store, or get free 2-day shipping. Free 2-day shipping available for device and accessory orders of $49 or more. Free 2-day shipping when you order online M-F by 8PM EST. In-Store Pickup is available across the U.S. at participating Verizon Wireless stores. Please bring photo ID and credit/debit card only if used as payment. Order will be held for 3 days from the time if was placed. \n \n Order online, pickup in store, or get free 2-day shipping. Free 2-day shipping available for device and accessory orders of $49 or more. Free 2-day shipping when you order online M-F by 8PM EST. In-Store Pickup is available across the U.S. at participating Verizon Wireless stores. Please bring photo ID and credit/debit card only if used as payment. Order will be held for 3 days from the time if was placed." component.contentView = Icon().with { $0.name = .addFolder; $0.size = .medium } let onClick: (ButtonBase) -> Void = { button in print("\(button.text!) clicked")} component.buttonData = [ Button().with{ $0.use = .primary; $0.text = "In-store Pickup"; $0.onClick = onClick; $0.size = .large }, Button().with{ $0.use = .secondary; $0.text = "Close"; $0.onClick = { button in self.dismiss(animated: true); print("\(button.text!) clicked")} ; $0.size = .large } ] //setup UI surfacePickerSelectorView.text = component.surface.rawValue titleTextField.text = component.title bodyTextField.text = component.content showFooterSwitch.isOn = true } //Picker func setupPicker(){ surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.surface = item self?.contentTopView.backgroundColor = item.color } } } extension ModalViewController: ComponentSampleable { static func makeSample() -> ComponentSample { let component = Self.makeComponent() component.title = "Choose free 2-day shipping or In-store Pickup" component.content = "Order online, pickup in store, or get free 2-day shipping. Free 2-day shipping available for device and accessory orders of $49 or more. Free 2-day shipping when you order online M-F by 8PM EST. In-Store Pickup is available across the U.S. at participating Verizon Wireless stores. Please bring photo ID and credit/debit card only if used as payment. Order will be held for 3 days from the time if was placed." return ComponentSample(component: component, trailingPinningType: .lessThanOrEqual, bottomPinningType: .lessThanOrEqual) } }