// // KycForm1ViewController.swift // GMERemittance // // Created by gme_2 on 12/09/2018. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // //"select_issue_date_text" = "Select issue date"; //"select_expiry_date_text" = "Select expiry date"; 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 = "" var referralCode = "" } class Occupation { var title: String? var id: String? } struct KycForm1FieldKeys { static let firstName = "fullname" static let gender = "gender" 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" static let referralCode = "referralCode" } 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_text".localized() static let female = "female_text".localized() static let other = "other_text".localized() static let cancelTitleString = "cancel_text".localized() } struct StringConstants { let fullname = "full_name_text".localized() let fullnamePlaceholder = "full_name_placeholder_text".localized() let mobileNumber = "mobile_number_text".localized() let mobilePlaceholder = "mobile_number_placeholder_text".localized() let email = "email_text_optional".localized() let emailPlaceholder = "placeholder_enter_receiver_email_text".localized() let gender = "gender_text".localized() let genderPlacholder = "gender_placeholder_text".localized() let nativeCountry = "native_country_text".localized() let nativeCountryPlaceholder = "native_country_placeholder_text".localized() let addressInKorea = "address_in_korea_text".localized() let addressPlaceholder = "address_in_korea_text".localized() let province = "province_text".localized() let provincePlaceholder = "province_placeholder_text".localized() let occupation = "occupation_text".localized() let occupationPlaceholder = "occupation_placeholder_text".localized() let saveAndCoutinueText = "save_and_continue_text".localized() } // MARK: IBOutlets @IBOutlet weak var scrollView: UIScrollView! // validation labels @IBOutlet weak var headerTItleLabel: UILabel! @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! @IBOutlet weak var referralCodeErrorLabel: 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! @IBOutlet weak var referralCodeTextField: UITextField! // title labels @IBOutlet weak var fullnameTitleLabel: UILabel! @IBOutlet weak var mobileNumberTitleLabel: UILabel! @IBOutlet weak var emailTitleLabel: UILabel! @IBOutlet weak var genderTitleLabel: UILabel! @IBOutlet weak var nativeCountryTitleLabel: UILabel! @IBOutlet weak var addressInKoreaTitleLabel: UILabel! @IBOutlet weak var provinceTitleLabel: UILabel! @IBOutlet weak var occupationTitleLabel: UILabel! @IBOutlet weak var saveAndContinue: UIButton! // 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 self.kycForm1Model.referralCode = self.referralCodeTextField.text ?? "" } private func setup() { // all setup should be done here hideErrorLabels() setupErrorLabels() setupErrorTextFields() setupDelegates() self.setupDatePicker() self.setupEmail() configureLanguage() } private func configureLanguage() { self.headerTItleLabel.text = "personal_subtitle_text".localized() self.fullnameTitleLabel.text = StringConstants().fullname self.mobileNumberTitleLabel.text = StringConstants().mobileNumber self.emailTitleLabel.text = StringConstants().email self.genderTitleLabel.text = StringConstants().gender self.nativeCountryTitleLabel.text = StringConstants().nativeCountry self.addressInKoreaTitleLabel.text = StringConstants().addressInKorea self.provinceTitleLabel.text = StringConstants().province self.occupationTitleLabel.text = StringConstants().occupation self.saveAndContinue.setTitle(StringConstants().saveAndCoutinueText, for: UIControlState.normal) self.firstNameTextField.placeholder = StringConstants().fullnamePlaceholder self.mobileNumberTextField.placeholder = StringConstants().mobilePlaceholder self.emailTextField.placeholder = StringConstants().emailPlaceholder self.genderTextField.placeholder = StringConstants().genderPlacholder self.nativeCountryTextField.placeholder = StringConstants().nativeCountryPlaceholder self.countryTextField.placeholder = StringConstants().addressPlaceholder self.provinceTextField.placeholder = StringConstants().provincePlaceholder self.occupationTextField.placeholder = StringConstants().occupationPlaceholder } 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, referralCodeErrorLabel].forEach({ $0?.isHidden = true }) } private func setupErrorLabels() { self.errorLabels = [firstNameErrorLabel, middleNameErrorLabel, lastNameErrorLabel, genderErrorLabel, dobErrorLabel, mobileNumberErrorLabel, emailErrorLabel, nativeCountryErrorLabel, nativeCountryErrorLabel, provinceErrorLabel, occupationErrorLabel, countryErrorLabel, referralCodeErrorLabel] self.errorLabels.forEach({ $0.font = Constants.errorLabelFont }) self.errorLabelsDict = [ KycForm1FieldKeys.firstName: self.firstNameErrorLabel, 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.gender: self.genderTextField, 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 self.textfields.filter({ $0.tag == tag }).first != nil { // 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_title_text".localized()) } } 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_text".localized(), 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 } }