// // KycForm1ViewController.swift // GMERemittance // // Created by gme_2 on 12/09/2018. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import XLPagerTabStrip class KycForm1Model { var firstName = "" var middleName = "" var lastName = "" var gender = "" // var dob = "" var mobile = "" var email = "" var nativeCountry = "" var country = "" var province = "" var occupation = "" } class Occupation { var title: String? var id: String? } struct KycForm1FieldKeys { static let firstName = "firstname" static let middleName = "middlename" static let lastName = "lastname" static let gender = "gender" // static let dob = "date of birth" static let mobileNumber = "mobile number" static let email = "email" static let nativeCountry = "native country" static let country = "address" static let province = "province" static let occupation = "occupation" } class KycForm1ViewController: UIViewController { struct Constants { static let segmentBackgroundViewColor = UIColor.init(hex: "E7EDF2") static let stateRedColor = UIColor.init(hex: "#EC1C24") static let errorBorderWidth = AppConstants.errorBorderWidth static let errorLabelFont = Fonts.Error.font static let clearColor = UIColor.clear static let male = "Male" static let female = "Female" static let other = "Other" static let cancelTitleString = "Cancel" } // MARK: IBOutlets @IBOutlet weak var scrollView: UIScrollView! // validation labels @IBOutlet weak var firstNameErrorLabel: UILabel! @IBOutlet weak var middleNameErrorLabel: UILabel! @IBOutlet weak var lastNameErrorLabel: UILabel! @IBOutlet weak var genderErrorLabel: UILabel! @IBOutlet weak var dobErrorLabel: UILabel! @IBOutlet weak var mobileNumberErrorLabel: UILabel! @IBOutlet weak var emailErrorLabel: UILabel! @IBOutlet weak var nativeCountryErrorLabel: UILabel! @IBOutlet weak var countryErrorLabel: UILabel! @IBOutlet weak var provinceErrorLabel: UILabel! @IBOutlet weak var occupationErrorLabel: UILabel! // textfields @IBOutlet weak var firstNameTextField: UITextField! @IBOutlet weak var middleNmaeTextField: UITextField! @IBOutlet weak var lastNameTextField: UITextField! @IBOutlet weak var genderTextField: UITextField! @IBOutlet weak var dobTextField: UITextField! @IBOutlet weak var mobileNumberTextField: UITextField! @IBOutlet weak var emailTextField: UITextField! @IBOutlet weak var nativeCountryTextField: UITextField! @IBOutlet weak var countryTextField: UITextField! @IBOutlet weak var provinceTextField: UITextField! @IBOutlet weak var occupationTextField: UITextField! // MARK: Properties var presenter: KycForm1ModuleInterface? var kycForm1Model: KycForm1Model = KycForm1Model() var continueActionInitiated = false let datePicker = UIDatePicker() var errorTextFieldDict: [String: UITextField] = [:] var errorLabelsDict: [String: UILabel] = [:] var errorLabels: [UILabel] = [] var textfields: [UITextField] = [] var delegate: KYCForm1Delegate? var countries: [KeyValueModel]? var occupations: [KeyValueModel]? var kycModel: KycModel? { didSet { self.countries = kycModel?.nativeCountry self.occupations = kycModel?.occupations self.proviences = kycModel?.city } } var proviences: [KeyValueModel]? var selectedCountry: SendMoneyCountryViewModel? { didSet { self.nativeCountryTextField.text = selectedCountry?.name self.kycForm1Model.nativeCountry = selectedCountry?.id ?? "" } } var selectedProvience: KeyValueModel? { didSet { self.provinceTextField.text = selectedProvience?.text self.kycForm1Model.province = selectedProvience?.id ?? "" } } var selectedOccupation: KeyValueModel? { didSet { self.occupationTextField.text = selectedOccupation?.text self.kycForm1Model.occupation = selectedOccupation?.id ?? "" } } // MARK: VC's Life cycle override func viewDidLoad() { super.viewDidLoad() self.setup() presenter?.viewIsReady() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.view.endEditing(true) removeFocus() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.view.endEditing(true) self.continueActionInitiated = false self.validate() } // MARK: IBActions @IBAction func save(_ sender: UIButton) { self.view.endEditing(true) self.continueActionInitiated = true self.delegate?._continue(model: self.kycForm1Model) // validate() } // MARK: Other Functions private func removeFocus() { self.textfields.forEach({ $0.resignFirstResponder() }) } private func createModel() { self.kycForm1Model.firstName = self.firstNameTextField.text! self.kycForm1Model.middleName = self.middleNmaeTextField.text! self.kycForm1Model.lastName = self.lastNameTextField.text! self.kycForm1Model.gender = self.genderTextField.text! // self.kycForm1Model.dob = self.dobTextField.text! self.kycForm1Model.mobile = self.mobileNumberTextField.text! self.kycForm1Model.email = self.emailTextField.text! self.kycForm1Model.country = self.countryTextField.text! // this is addres field } private func setup() { // all setup should be done here hideErrorLabels() setupErrorLabels() setupErrorTextFields() setupDelegates() self.setupDatePicker() self.setupEmail() } private func setupEmail() { if let email = UserDefaults.standard.string(forKey: UserKeys.email) { self.emailTextField.text = email self.emailTextField.isUserInteractionEnabled = false } } private func setupDelegates() { self.firstNameTextField.delegate = self self.lastNameTextField.delegate = self self.middleNmaeTextField.delegate = self self.genderTextField.delegate = self self.emailTextField.delegate = self self.dobTextField.delegate = self self.countryTextField.delegate = self self.nativeCountryTextField.delegate = self self.occupationTextField.delegate = self self.mobileNumberTextField.delegate = self self.provinceTextField.delegate = self } private func setupDatePicker() { self.datePicker.datePickerMode = .date self.dobTextField.inputView = datePicker datePicker.maximumDate = Date() self.datePicker.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged) } @objc private func handleDatePicker(sender: UIDatePicker) { let dateFormatter = DateFormatter() // test ccr dateFormatter.dateFormat = AppConstants.dateFormat self.dobTextField.text = dateFormatter.string(from: sender.date) } private func validate() { self.createModel() self.delegate?.addModel(model: self.kycForm1Model) } private func hideErrorLabels() { [firstNameErrorLabel, middleNameErrorLabel, lastNameErrorLabel, genderErrorLabel, dobErrorLabel, mobileNumberErrorLabel, emailErrorLabel, nativeCountryErrorLabel, countryErrorLabel, provinceErrorLabel, occupationErrorLabel].forEach({ $0?.isHidden = true }) } private func setupErrorLabels() { self.errorLabels = [firstNameErrorLabel, middleNameErrorLabel, lastNameErrorLabel, genderErrorLabel, dobErrorLabel, mobileNumberErrorLabel, emailErrorLabel, nativeCountryErrorLabel, nativeCountryErrorLabel, provinceErrorLabel, occupationErrorLabel, countryErrorLabel] self.errorLabels.forEach({ $0.font = Constants.errorLabelFont }) self.errorLabelsDict = [ KycForm1FieldKeys.firstName: self.firstNameErrorLabel, KycForm1FieldKeys.middleName: self.middleNameErrorLabel, KycForm1FieldKeys.lastName: self.lastNameErrorLabel, KycForm1FieldKeys.gender: self.genderErrorLabel, // KycForm1FieldKeys.dob: self.dobErrorLabel, KycForm1FieldKeys.mobileNumber: self.mobileNumberErrorLabel, KycForm1FieldKeys.email: self.emailErrorLabel, KycForm1FieldKeys.nativeCountry: self.nativeCountryErrorLabel, KycForm1FieldKeys.country: self.countryErrorLabel, KycForm1FieldKeys.province: self.provinceErrorLabel, KycForm1FieldKeys.occupation: self.occupationErrorLabel ] } private func setupErrorTextFields() { self.textfields = [firstNameTextField, lastNameTextField, middleNmaeTextField, genderTextField, dobTextField, mobileNumberTextField, emailTextField, nativeCountryTextField, countryTextField, provinceTextField, occupationTextField] firstNameTextField.tag = 1 middleNmaeTextField.tag = 2 lastNameTextField.tag = 3 genderTextField.tag = 4 dobTextField.tag = 5 mobileNumberTextField.tag = 6 emailTextField.tag = 7 nativeCountryTextField.tag = 8 countryTextField.tag = 9 provinceTextField.tag = 10 occupationTextField.tag = 11 self.errorTextFieldDict = [ KycForm1FieldKeys.firstName: self.firstNameTextField, KycForm1FieldKeys.middleName: self.middleNmaeTextField, KycForm1FieldKeys.lastName: self.lastNameTextField, KycForm1FieldKeys.gender: self.genderTextField, // KycForm1FieldKeys.dob: self.dobTextField, KycForm1FieldKeys.mobileNumber: self.mobileNumberTextField, KycForm1FieldKeys.email: self.emailTextField, KycForm1FieldKeys.nativeCountry: self.nativeCountryTextField, KycForm1FieldKeys.country: self.countryTextField, KycForm1FieldKeys.province: self.provinceTextField, KycForm1FieldKeys.occupation: self.occupationTextField ] } private func showBorder(textfield :UITextField?) { guard let textfield = textfield else {return} textfield.layer.borderColor = Constants.stateRedColor.cgColor textfield.layer.borderWidth = Constants.errorBorderWidth textfield.layer.addShadow(with: Constants.stateRedColor) } private func show( error: String, label: UILabel?) { // scroll to the top of the view guard let label = label else {return} label.textColor = Constants.stateRedColor label.isHidden = false label.text = error } } // MARK: KycForm1ViewInterface extension KycForm1ViewController: KycForm1ViewInterface { // todo remove this from this viper flow. its now in parent func show(result: (doesNotSucks: Bool, errorsDick: [String : String])) { var position = 11 if result.doesNotSucks { // if isValid // its is not valid, lets go to security page only if continue button was tapped if self.continueActionInitiated { self.delegate?._continue(model: self.kycForm1Model) } }else { result.errorsDick.forEach({ let label = errorLabelsDict[$0.key] self.show(error: $0.value, label: label) let textfield = errorTextFieldDict[$0.key] self.showBorder(textfield: textfield) let tag = (textfield?.tag ?? position) position = tag < position ? tag : position if let topMostTextField = self.textfields.filter({ $0.tag == tag }).first { // Todo // scroll to view here } }) } } func show(model: KycModel) { self.delegate?.show(model: model) self.kycModel = model } func show(error: String) { self.alert(message: error) } func showLoading() { self.showProgressHud() } func hideLoading() { self.hideProgressHud() } } extension KycForm1ViewController: IndicatorInfoProvider { func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { return IndicatorInfo.init(title: "Personal") } } extension KycForm1ViewController: UITextFieldDelegate { func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { textField.layer.addShadow(with: Constants.clearColor) switch textField { case genderTextField: self.genderErrorLabel.isHidden = true genderTextField.layer.borderWidth = 0 self.view.endEditing(true) self.showGenderPicker() return false case nativeCountryTextField: self.nativeCountryErrorLabel.isHidden = true nativeCountryTextField.layer.borderWidth = 0 self.view.endEditing(true) self.showCountryPickerview() return false case provinceTextField: self.provinceErrorLabel.isHidden = true provinceTextField.layer.borderWidth = 0 self.view.endEditing(true) self.showProviencePickerview() return false case occupationTextField: self.occupationErrorLabel.isHidden = true occupationTextField.layer.borderWidth = 0 self.view.endEditing(true) self.showOccupationPickerView() return false default: return true } } func textFieldDidBeginEditing(_ textField: UITextField) { textField.layer.addShadow(with: Constants.clearColor) textField.layer.borderWidth = 0 switch textField { case firstNameTextField: self.firstNameErrorLabel.isHidden = true case middleNmaeTextField: self.middleNameErrorLabel.isHidden = true case lastNameTextField: self.lastNameErrorLabel.isHidden = true case genderTextField: self.genderErrorLabel.isHidden = true case dobTextField: self.dobErrorLabel.isHidden = true case mobileNumberTextField: self.mobileNumberErrorLabel.isHidden = true case emailTextField: self.emailErrorLabel.isHidden = true case nativeCountryTextField: self.nativeCountryErrorLabel.isHidden = true case countryTextField: self.countryErrorLabel.isHidden = true case provinceTextField: self.provinceErrorLabel.isHidden = true case occupationTextField: self.occupationErrorLabel.isHidden = true default: break } } } extension KycForm1ViewController { private func showCountryPickerview() { let viewcontroller = UIStoryboard.init(name: "CountryPicker", bundle: nil).instantiateViewController(withIdentifier: "CountryPickerViewController") as! CountryPickerViewController let _countries = self.countries ?? [] let data: [SendMoneyCountryViewModel] = _countries.map({ let model = SendMoneyCountryViewModel() model.id = $0.id model.name = $0.text // model.code = $0.code return model }) viewcontroller.data = data viewcontroller.doneAction = self.countrySelected viewcontroller.defaultSelectedData = [self.selectedCountry] viewcontroller.type = PickerTitle.country self.present(viewcontroller, animated: true, completion: nil) } func countrySelected(models: [SendMoneyCountryViewModel]) { self.selectedCountry = models.first } private func showGenderPicker() { let alertcontroller = UIAlertController.init(title: "Gender", message: nil, preferredStyle: .actionSheet) alertcontroller.view.tintColor = UIColor.init(hex: "#7b7a7a") let maleAction = UIAlertAction(title: Constants.male, style: .default, handler: { _ in self.genderTextField.text = Constants.male }) let femaleAction = UIAlertAction(title: Constants.female, style: .default, handler: { _ in self.genderTextField.text = Constants.female }) let otherAction = UIAlertAction(title: Constants.other, style: .default, handler: { _ in self.genderTextField.text = Constants.other }) let cancelAction = UIAlertAction(title: Constants.cancelTitleString, style: .cancel, handler: nil) alertcontroller.addAction(maleAction) alertcontroller.addAction(femaleAction) alertcontroller.addAction(otherAction) alertcontroller.addAction(cancelAction) self.present(alertcontroller, animated: true, completion: nil) } private func showOccupationPickerView() { let viewcontroller = self.getPickerViewController() let occupations = self.occupations ?? [] let names = occupations.compactMap({$0.text}) viewcontroller.data = names viewcontroller.type = PickerTitle.occupation viewcontroller.doneAction = self.occupationSelected self.present(viewcontroller, animated: true, completion: nil) } private func getPickerViewController()-> ItemsPickerViewController { return UIStoryboard.init(name: "ItemsPicker", bundle: nil).instantiateViewController(withIdentifier: "ItemsPickerViewController") as! ItemsPickerViewController } func occupationSelected(occupations: [String]) { let _occupation = self.occupations?.filter({($0.text ?? "") == (occupations.first ?? "") }).first self.selectedOccupation = _occupation } private func showProviencePickerview() { let viewcontroller = self.getPickerViewController() let proviences = self.proviences let names = (proviences ?? []).compactMap({$0.text}) viewcontroller.data = names viewcontroller.type = PickerTitle.state viewcontroller.doneAction = self.provienceSelected self.present(viewcontroller, animated: true, completion: nil) } func provienceSelected(provience: [String]) { let _provience = (self.proviences ?? []).filter({ ($0.text ?? "") == (provience.first ?? "") }) self.selectedProvience = _provience.first } }