// // CalendarViewController.swift // VDSSample // // Created by Kanamarlapudi, Vasavi on 19/04/24. // import Foundation import UIKit import VDS import Combine import VDSTokens class CalendarViewController: BaseViewController { var containerBorderSwitch = Toggle() var dateIndicatorSwitch = Toggle() var transparentSwitch = Toggle() var indicatorOneSwitch = Toggle() var indicatorTwoSwitch = Toggle() var indicatorThreeSwitch = Toggle() var legendOneField = TextField() var legendTwoField = TextField() var legendThreeField = TextField() private var minDateField: UIDatePicker = UIDatePicker() private var maxDateField: UIDatePicker = UIDatePicker() private var datePickerOne: UIDatePicker = UIDatePicker() private var datePickerTwo: UIDatePicker = UIDatePicker() private var datePickerThree: UIDatePicker = UIDatePicker() var indicators: [CalendarBase.CalendarIndicatorModel] = [] override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: component) setupPicker() setupModel() } override func setupForm() { super.setupForm() configurePicker(datePickerOne) datePickerOne.tag = 1 configurePicker(datePickerTwo) datePickerTwo.tag = 2 configurePicker(datePickerThree) datePickerThree.tag = 3 configurePicker(minDateField) minDateField.tag = 4 configurePicker(maxDateField) maxDateField.tag = 5 indicators = [ .init(label: "Due Date", date: datePickerOne.date), .init(label: "Auto Pay", date: datePickerTwo.date), .init(label: "Scheduled", date: datePickerTwo.date) ] //add form rows addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Hide Container Border", view: containerBorderSwitch) addFormRow(label: "Hide Current Date Indicator", view: dateIndicatorSwitch) addFormRow(label: "Min Date", view: minDateField) addFormRow(label: "Max Date", view: maxDateField) addFormRow(label: "Transparent Background", view: transparentSwitch) addFormRow(label: "Indicator One", view: indicatorOneSwitch) addFormRow(label: "Indicator Two", view: indicatorTwoSwitch) addFormRow(label: "Indicator Three", view: indicatorThreeSwitch) addFormRow(label: "Legend One", view: legendOneField) addFormRow(label: "Legend Two", view: legendTwoField) addFormRow(label: "Legend Three", view: legendThreeField) addFormRow(label: "Indicator One Date", view: datePickerOne) addFormRow(label: "Indicator Two Date", view: datePickerTwo) addFormRow(label: "Indicator Three Date", view: datePickerThree) containerBorderSwitch.onChange = { [weak self] sender in guard let self else { return } component.hideContainerBorder = sender.isOn } legendOneField .textPublisher .sink { [weak self] text in self?.updateIndicatorData(label: text, date: self?.datePickerOne.date, index: 0) }.store(in: &subscribers) legendTwoField .textPublisher .sink { [weak self] text in self?.updateIndicatorData(label: text, date: self?.datePickerTwo.date, index: 1) }.store(in: &subscribers) legendThreeField .textPublisher .sink { [weak self] text in self?.updateIndicatorData(label: text, date: self?.datePickerThree.date, index: 2) }.store(in: &subscribers) indicatorOneSwitch.onChange = { [weak self] sender in guard let self else { return } if !sender.isOn { component.indicators.removeAll() } else { self.setIndicatorsData() } } indicatorTwoSwitch.onChange = { [weak self] sender in guard let self else { return } if !sender.isOn { if component.indicators.count > 2 { component.indicators.removeLast() component.indicators.removeLast() } else if component.indicators.count == 2 { component.indicators.removeLast() } } else { self.setIndicatorsData() } } indicatorThreeSwitch.onChange = { [weak self] sender in guard let self else { return } if !sender.isOn { if component.indicators.count > 2 { component.indicators.removeLast() } } else { self.setIndicatorsData() } } } func setupPicker(){ surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.surface = item self?.contentTopView.backgroundColor = item.color } } func setupModel() { component.indicators = indicators legendOneField.text = "Due Date" legendTwoField.text = "Auto Pay" legendThreeField.text = "Scheduled" indicatorOneSwitch.isOn = true indicatorTwoSwitch.isOn = true indicatorThreeSwitch.isOn = true } func updateIndicatorData(label: String = "", date: Date?, index:Int) { indicators[index].label = label indicators[index].date = date ?? Date() component.indicators = indicators } func setIndicatorsData() { if indicatorOneSwitch.isOn && indicatorTwoSwitch.isOn && indicatorThreeSwitch.isOn { component.indicators = [ .init(label: self.legendOneField.text ?? "", date: datePickerOne.date), .init(label: self.legendTwoField.text ?? "", date: datePickerTwo.date), .init(label: self.legendThreeField.text ?? "", date: datePickerTwo.date) ] } else if indicatorOneSwitch.isOn && indicatorTwoSwitch.isOn && !indicatorThreeSwitch.isOn { component.indicators = [ .init(label: self.legendOneField.text ?? "", date: datePickerOne.date), .init(label: self.legendTwoField.text ?? "", date: datePickerTwo.date), ] } else if indicatorOneSwitch.isOn && !indicatorTwoSwitch.isOn { component.indicators = [ .init(label: self.legendOneField.text ?? "", date: datePickerOne.date), ] } } func configurePicker(_ sender:UIDatePicker) { // Set some of UIDatePicker properties sender.timeZone = NSTimeZone.local sender.backgroundColor = UIColor.white // Add an event to call onDidChangeDate function when value is changed. sender.addTarget(self, action: #selector(self.datePickerValueChanged(_:)), for: .valueChanged) } @objc func datePickerValueChanged(_ sender: UIDatePicker){ // Create date formatter let dateFormatter: DateFormatter = DateFormatter() // Set date format dateFormatter.dateFormat = "MM/dd/yyyy hh:mm a" // Apply date format // let selectedDate: String = dateFormatter.string(from: sender.date) switch sender.tag { case 1: updateIndicatorData(label: legendOneField.text ?? "", date: sender.date, index: 0) case 2: updateIndicatorData(label: legendTwoField.text ?? "", date: sender.date, index: 1) case 3: updateIndicatorData(label: legendThreeField.text ?? "", date: sender.date, index: 2) default: break } // print("Selected value \(selectedDate)") } }