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.
 
 
 
 

581 lines
22 KiB

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