You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

597 lines
22 KiB

//
// 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
}
}
}