// // KYCPersonalInfoViewController.swift // GMERemittance // // Created by Sujal on 12/18/17. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved. // import Foundation import UIKit //import SDWebImage class KYCPersonalInfoViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var viewOutlet: UIView! @IBOutlet weak var viewProgressBarOutlet: UIView! private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() private var kycviewmodel = KYCViewModel() let pickerView = UIPickerView() var pickerData: [String] = [String]() let datePicker = UIDatePicker() @IBOutlet weak var textFieldFirstName: UITextField! @IBOutlet weak var textFieldMiddleName: UITextField! @IBOutlet weak var textFieldLastName: UITextField! @IBOutlet weak var textFieldNickName: UITextField! @IBOutlet weak var textFieldGender: UITextField! @IBOutlet weak var textFieldDOB: UITextField! @IBOutlet weak var textFieldPhone: UITextField! @IBOutlet weak var textFieldEmail: UITextField! @IBOutlet weak var textFieldNativeCountry: UITextField! @IBOutlet weak var textFieldCountry: UITextField! @IBOutlet weak var textFieldProvince: UITextField! @IBOutlet weak var textFieldOccupation: UITextField! var activeTextField: UITextField? var arrayOftextFields: [UITextField]! var selectedIndexFor: [String: Int] = [String: Int]() var personalInfo: [String]! var isPhone: Bool! var noConnectionTimeOutDialog: Bool? @IBOutlet weak var kycFirstStep: UIView! @IBOutlet weak var kycProgessOne: UIView! @IBOutlet weak var kycSecondStep: UIView! @IBOutlet weak var kycProgessSecond: UIView! @IBOutlet weak var kycFinalStep: UIView! var referralCodepopUpViewController: ReferralCodeViewController! @IBAction func submitPersonalInformation(_ sender: Any) { activeTextField?.resignFirstResponder() personalInfo = [textFieldFirstName.text!, textFieldLastName.text!, textFieldGender.text!, textFieldDOB.text!, textFieldPhone.text!, textFieldEmail.text!, textFieldNativeCountry.text!, textFieldCountry.text!, textFieldProvince.text!, textFieldOccupation.text!] guard kycviewmodel.allFieldsFilled(arrayofInfo: personalInfo) else { self.popUpMessageError(value: 11, message: "Please fill all the fields") return } guard kycviewmodel.isValidAge(dob: textFieldDOB.text!) else { self.popUpMessageError(value: 11, message: "User is under age") return } if isPhone { kycviewmodel.updateSetMobileNumber(inputDigit: textFieldPhone.text!) } else { kycviewmodel.updateSetEmail(email: textFieldEmail.text!) } performSegue(withIdentifier: "fillKYCSecurityInfo", sender: nil) } @objc func keyboardWillShow(notification: NSNotification) { var userInfo = notification.userInfo! var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue keyboardFrame = self.view.convert(keyboardFrame, from: nil) var contentInset:UIEdgeInsets = self.scrollView.contentInset contentInset.bottom = keyboardFrame.size.height + 100 scrollView.contentInset = contentInset } @objc func keyboardWillHide(notification: NSNotification) { self.scrollView.contentInset = UIEdgeInsets.zero } @objc func clearKeyboard() { activeTextField?.resignFirstResponder() } /** Date limit to current date */ func setDatePickerLimit() { var components = DateComponents() components.year = -0 let maxDate = Calendar.current.date(byAdding: components, to: Date()) datePicker.maximumDate = maxDate } /** Update Country and occupation name to picker view */ func bindCountryAndOccupationToUI() { kycviewmodel.countryAndOccupationFetched.bind { [unowned self] in guard $0 != nil else { return } guard $0! != 0 else { self.kycviewmodel.countryAndOccupationFetched.value = nil return } if $0! == 1 { self.kycviewmodel.countryAndOccupationFetched.value = nil //SET COUNTRY TEXT FIELD AND COUNTRY ID self.pickerData = self.kycviewmodel.getCountryName() self.showCountryWithFlag(textField: self.textFieldCountry, flagUrlString: self.kycviewmodel.getCountryFlagUrl(), index: 0) } else if $0 == 2 { self.kycviewmodel.countryAndOccupationFetched.value = nil //SET OCCUPATION TEXT FIELD let defaultOccupationIndex = self.kycviewmodel.getIndexForDefaultOccupation() self.selectedIndexFor["occupation"] = defaultOccupationIndex self.textFieldOccupation.text = self.kycviewmodel.getDefaultOccupation(index: defaultOccupationIndex) self.kycviewmodel.setOccupation(referenceIndex: defaultOccupationIndex) } } } /** Display dialog to add referral code */ func showReferralCodeDialog() { let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main) referralCodepopUpViewController = storyboard.instantiateViewController(withIdentifier: "referralCodepopUp") as? ReferralCodeViewController self.navigationController?.navigationBar.isHidden = true self.addChildViewController(referralCodepopUpViewController) referralCodepopUpViewController.view.frame = self.view.bounds self.view.addSubview(referralCodepopUpViewController.view) referralCodepopUpViewController.didMove(toParentViewController: self) referralCodepopUpViewController.referralCodeAvailable.bind { [unowned self] in guard $0 != nil else { return } self.setUpNavBar(id: 102, title: "") if $0! { self.kycviewmodel.setReferralCode(referralCode: self.referralCodepopUpViewController.getReferralCode()) } //self.showWelcomeMessage() } } /** Display welcome dialog */ func showWelcomeMessage() { let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main) if let popUpViewController = storyboard.instantiateViewController(withIdentifier: "popUpInfo") as? PopUpGeneralInfo { self.navigationController?.navigationBar.isHidden = true popUpViewController.indexValue = 0 self.addChildViewController(popUpViewController) popUpViewController.view.frame = self.view.bounds self.view.addSubview(popUpViewController.view) popUpViewController.didMove(toParentViewController: self) } } /** internet check */ func setUpNetworkListener() { kycviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } if !$0! { self.popUpMessage(value: 15) self.kycviewmodel.internetConnection.value = nil } } } override func viewDidAppear(_ animated: Bool) { setUpNetworkListener() } override func viewDidLoad() { super.viewDidLoad() setUpAnotherLoginListener(genericviewmodel: kycviewmodel) setUpNavBar(id: 102, title: "") noConnectionTimeOutDialog = false viewOutlet.backgroundColor = UIColor(hex:0xec1c24) viewProgressBarOutlet.backgroundColor = UIColor(hex:0xec1c24) self.showWelcomeDialog() setDatePickerLimit() kycviewmodel.kycViewModelConnectionTimeOut.value = nil /** connection timeout */ kycviewmodel.kycViewModelConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } if !self.noConnectionTimeOutDialog! { self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 20) } self.noConnectionTimeOutDialog = true } bindCountryAndOccupationToUI() kycviewmodel.fetchRequiredCDDValues() NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard)) view.addGestureRecognizer(tap) let userId: String = UserDefaults.standard.object(forKey: "com.gmeremit.username") as! String if let _ = Int(userId) { isPhone = true textFieldPhone.text = userId } else { isPhone = false textFieldEmail.text = userId } arrayOftextFields = [textFieldFirstName, textFieldMiddleName, textFieldLastName, textFieldNickName, textFieldGender, textFieldDOB, textFieldPhone, textFieldEmail, textFieldNativeCountry, textFieldCountry, textFieldProvince, textFieldOccupation] selectedIndexFor["gender"] = 0 selectedIndexFor["nativeCountry"] = 0 selectedIndexFor["province"] = 0 selectedIndexFor["occupation"] = 0 for textField in arrayOftextFields! { textField.delegate = self } pickerView.dataSource = self pickerView.delegate = self textFieldGender.inputView = pickerView textFieldNativeCountry.inputView = pickerView textFieldProvince.inputView = pickerView textFieldOccupation.inputView = pickerView datePicker.datePickerMode = .date textFieldDOB.inputView = datePicker datePicker.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged) kycFirstStep.layer.cornerRadius = kycFirstStep.frame.size.width/2 kycFirstStep.layer.borderColor = UIColor.white.cgColor kycFirstStep.layer.borderWidth = 1.0 kycSecondStep.layer.cornerRadius = kycSecondStep.frame.size.width/2 //kycSecondStep.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor //kycSecondStep.layer.borderWidth = 1.0 kycFinalStep.layer.cornerRadius = kycFinalStep.frame.size.width/2 //kycFinalStep.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor // kycFinalStep.layer.borderWidth = 1.0 keyboardInteractionForTextFields() } /** To display keboard on text field according to user id i.e email or phone no */ func keyboardInteractionForTextFields(){ if isPhone { textFieldPhone.isEnabled = false } else { textFieldEmail.isEnabled = false } textFieldCountry.isEnabled = false } /** Set the Date format to "MM/dd/yyyy" */ @objc func handleDatePicker(sender: UIDatePicker) { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MM/dd/yyyy" textFieldDOB.text = dateFormatter.string(from: sender.date) kycviewmodel.setDOB(dob: textFieldDOB.text!) } /** Show welcome dialog message when referral status is true */ func showWelcomeDialog(){ if let referralStatus = UserDefaults.standard.object(forKey: "com.gmeremit.isReferred") as? Bool { if referralStatus { showWelcomeMessage() } else { showReferralCodeDialog() } } } } extension KYCPersonalInfoViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { activeTextField = textField if textField == textFieldGender || textField == textFieldNativeCountry || textField == textFieldProvince || textField == textFieldOccupation { switch textField { case textFieldGender: pickerData = kycviewmodel.getCddGenderList() case textFieldNativeCountry: pickerData = kycviewmodel.getNativeCountryName() case textFieldProvince: pickerData = kycviewmodel.getProvince() case textFieldOccupation: pickerData = kycviewmodel.getCddOccupationList() default: return } guard pickerData.count > 0 else { self.popUpMessageInfo(value: 16, title: "Fetching data", message: "Please fill other fields while some data are being loaded") return } pickerView.reloadAllComponents() switch textField { case textFieldGender: if let genderIndex = selectedIndexFor["gender"] { pickerView.selectRow(genderIndex, inComponent: 0, animated: true) } if let genderIndex = selectedIndexFor["gender"] { textField.text = pickerData[genderIndex] } if let genderIndex = selectedIndexFor["gender"]{ kycviewmodel.setGender(referenceIndex: genderIndex) } case textFieldNativeCountry: if let countryIndex = selectedIndexFor["nativeCountry"]{ pickerView.selectRow(countryIndex, inComponent: 0, animated: true) } if let countryIndex = selectedIndexFor["nativeCountry"]{ showCountryWithFlag(textField: textField, flagUrlString: kycviewmodel.getNativeCountryFlagUrl(index: countryIndex), index: countryIndex) } if let countryIndex = selectedIndexFor["nativeCountry"]{ kycviewmodel.setNativeCountry(referenceIndex: countryIndex) } case textFieldOccupation: if let occupationIndex = selectedIndexFor["occupation"]{ pickerView.selectRow(occupationIndex, inComponent: 0, animated: true) } if let occupationIndex = selectedIndexFor["occupation"]{ textField.text = pickerData[occupationIndex] } if let occupationIndex = selectedIndexFor["occupation"]{ kycviewmodel.setOccupation(referenceIndex: occupationIndex) } case textFieldProvince: if let provinceIndex = selectedIndexFor["province"]{ pickerView.selectRow(provinceIndex, inComponent: 0, animated: true) } if let provinceIndex = selectedIndexFor["province"]{ textField.text = pickerData[provinceIndex] } if let provinceIndex = selectedIndexFor["province"]{ kycviewmodel.setProvince(referenceIndex: provinceIndex) } default: return } } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { let index: Int = arrayOftextFields.index(of: textField)! guard index == (arrayOftextFields.count-1) else { arrayOftextFields[index+1].becomeFirstResponder() return true } //textField.resignFirstResponder() return true } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if textField == textFieldGender || textField == textFieldOccupation || textField == textFieldCountry || textField == textFieldNativeCountry || textField == textFieldProvince || textField == textFieldDOB { return false } let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string) switch textField { case textFieldFirstName: self.kycviewmodel.updateName(namePart: 1, inputString: inputText) case textFieldMiddleName: self.kycviewmodel.updateName(namePart: 2, inputString: inputText) case textFieldLastName: self.kycviewmodel.updateName(namePart: 3, inputString: inputText) case textFieldNickName: self.kycviewmodel.updateName(namePart: 0, inputString: inputText) case textFieldPhone: if isPhone { return false } else { self.kycviewmodel.updateSetMobileNumber(inputDigit: inputText) return true } case textFieldEmail: if isPhone { self.kycviewmodel.updateSetEmail(email: inputText) return true } else { return false } default: return false } return true } } extension KYCPersonalInfoViewController: UIPickerViewDataSource, UIPickerViewDelegate { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerData.count } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if activeTextField == textFieldNativeCountry { selectedIndexFor["nativeCountry"] = row self.kycviewmodel.setNativeCountry(referenceIndex: row) let flagUrl = kycviewmodel.getNativeCountryFlagUrl(index: row) showCountryWithFlag(textField: activeTextField!, flagUrlString: flagUrl, index: row) } else { switch activeTextField! { case self.textFieldGender: selectedIndexFor["gender"] = row self.kycviewmodel.setGender(referenceIndex: row) case self.textFieldOccupation: selectedIndexFor["occupation"] = row self.kycviewmodel.setOccupation(referenceIndex: row) case self.textFieldProvince: selectedIndexFor["province"] = row self.kycviewmodel.setProvince(referenceIndex: row) default: break } activeTextField!.text = pickerData[row] } } func showCountryWithFlag(textField: UITextField, flagUrlString: String, index: Int) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30)) imageView.center = paddingView.center paddingView.addSubview(imageView) if let flagUrl = URL(string: flagUrlString) { imageView.sd_setImage(with: flagUrl, placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil) } textField.leftViewMode = UITextFieldViewMode.always textField.leftView = paddingView textField.text = pickerData[index] } func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 60 } func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { var myImageView: UIImageView? let myView = UIView(frame: CGRect(x: 0, y: 0, width: pickerView.bounds.width - 30, height: 60)) let myLabel = UILabel(frame: CGRect(x: 60, y: 0, width: pickerView.bounds.width - 90, height: 60 )) myLabel.text = pickerData[row] myView.addSubview(myLabel) if activeTextField == textFieldNativeCountry { myImageView = UIImageView(frame: CGRect(x: 0, y: 5, width: 50, height: 50)) let flagUrlString = kycviewmodel.getNativeCountryFlagUrl(index: row) if let flagUrl = URL(string: flagUrlString) { myImageView?.sd_setImage(with: flagUrl, placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil) myView.addSubview(myImageView!) } } return myView } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "fillKYCSecurityInfo" { let kycBankIDViewController = segue.destination as! KYCBankAndIDViewController kycBankIDViewController.kycviewmodel = self.kycviewmodel } } }