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.
429 lines
16 KiB
429 lines
16 KiB
//
|
|
// AddReciepientViewController.swift
|
|
// GMERemittance
|
|
//
|
|
// Created by gme_2 on 26/08/2018.
|
|
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import IQKeyboardManagerSwift
|
|
|
|
class AddReciepientViewController: UIViewController {
|
|
|
|
private struct StringConstants {
|
|
let headerText = "who_to_send_text".localized()
|
|
let firstNameText = "first_name_text".localized()
|
|
let middleNameText = "enter_receiver_middlename_text".localized()
|
|
let lastNameText = "last_name_text".localized()
|
|
let countryNameText = "country_text".localized()
|
|
let stateText = "state_text".localized()
|
|
let districtText = "district_text".localized()
|
|
let addressText = "address_text".localized()
|
|
let relationText = "relation_text".localized()
|
|
let mobileText = "mobile_number_text".localized()
|
|
let transferText = "transfer_reason_text".localized()
|
|
let saveText = "save_text".localized()
|
|
let addRecipientTitle = "add_recipient_text".localized()
|
|
// placeholder
|
|
let firstnamePlaceholder = "placeholder_enter_receiver_firstname_text".localized()
|
|
let lastnamePlaceholder = "placeholder_enter_receiver_lastname_text".localized()
|
|
let middlenamePlaceholder = "placeholder_enter_receiver_middle_text".localized()
|
|
let countryPlaceholder = "placeholder_select_country_text".localized()
|
|
let statePlaceholder = "state_placeholder_text".localized()
|
|
let districtPlaceholder = "district_placeholder_text".localized()
|
|
let addressPlaceholder = "placeholder_enter_receiver_address_text".localized()
|
|
let relationPlaceholder = "placeholder_select_relation_text".localized()
|
|
let mobilePlaceholder = "placeholder_enter_reciever_mobile_number_text".localized()
|
|
let transferPlaceholder = "placeholder_select_transfer_reason_text".localized()
|
|
}
|
|
|
|
// MARK: IBOutlets
|
|
@IBOutlet private weak var scrollView: UIScrollView!
|
|
|
|
@IBOutlet private weak var firstNameTextField: UITextField!
|
|
@IBOutlet private weak var middleNameTextField: UITextField!
|
|
@IBOutlet private weak var lastNameTextField: UITextField!
|
|
@IBOutlet private weak var countryTextField: UITextField!
|
|
@IBOutlet private weak var stateProvinceTextField: UITextField!
|
|
@IBOutlet private weak var districtTextField: UITextField!
|
|
@IBOutlet private weak var addressTextField: UITextField!
|
|
@IBOutlet private weak var relationTextField: UITextField!
|
|
@IBOutlet private weak var mobileTextField: UITextField!
|
|
@IBOutlet private weak var emailTextField: UITextField!
|
|
@IBOutlet private weak var transferReasonTextField: UITextField!
|
|
@IBOutlet private weak var saveButton: UIButton!
|
|
@IBOutlet private weak var provienceStackView: UIStackView!
|
|
@IBOutlet private weak var districtStackView: UIStackView!
|
|
|
|
// titles
|
|
@IBOutlet private weak var headerTItleLabel: UILabel!
|
|
@IBOutlet private weak var firstNameTitleLabel: UILabel!
|
|
@IBOutlet private weak var middleNameTitleLabel: UILabel!
|
|
@IBOutlet private weak var lastNametitleLabel: UILabel!
|
|
@IBOutlet private weak var countryNameTitleLabel: UILabel!
|
|
@IBOutlet private weak var stateTitleLabel: UILabel!
|
|
@IBOutlet private weak var districtTitleLabel: UILabel!
|
|
@IBOutlet private weak var addressTitleLabel: UILabel!
|
|
@IBOutlet private weak var relationTitleLabel: UILabel!
|
|
@IBOutlet private weak var mobileTitleLabel: UILabel!
|
|
@IBOutlet private weak var transferTitleLabel: UILabel!
|
|
|
|
|
|
// MARK: Properties
|
|
var presenter: AddReciepientModuleInterface?
|
|
|
|
private var countries: [SendMoneyCountryViewModel]?
|
|
private var transferReasons: [SendMoneyTransferReasonViewModel]?
|
|
private var relations: [SendMoneyRelationViewModel]?
|
|
private var reciepient: ReceipientViewModel?
|
|
|
|
private var selectedCountry: SendMoneyCountryViewModel? {
|
|
didSet {
|
|
self.countryTextField.text = selectedCountry?.name
|
|
let shouldShowProvienceField = (selectedCountry?.proviencesRequired ?? "" ) == "true"
|
|
self.provienceStackView.isHidden = !shouldShowProvienceField
|
|
self.districtStackView.isHidden = !shouldShowProvienceField
|
|
self.reciepient?.countryId = self.selectedCountry?.id
|
|
}
|
|
}
|
|
|
|
private var selectedProvience: SendMoneyProvienceViewModel? {
|
|
didSet {
|
|
self.stateProvinceTextField.text = selectedProvience?.name
|
|
self.reciepient?.stateId = self.selectedProvience?.id
|
|
}
|
|
}
|
|
|
|
private var selectedDistrict: SendMoneyDistrictViewModel? {
|
|
didSet {
|
|
self.districtTextField.text = selectedDistrict?.name
|
|
self.reciepient?.districtId = self.selectedDistrict?.id
|
|
}
|
|
}
|
|
|
|
private var selectedRelation: SendMoneyRelationViewModel? {
|
|
didSet {
|
|
self.relationTextField.text = selectedRelation?.title
|
|
self.reciepient?.relationId = self.selectedRelation?.id
|
|
}
|
|
}
|
|
|
|
private var selectedTransferReason: SendMoneyTransferReasonViewModel? {
|
|
didSet {
|
|
self.transferReasonTextField.text = selectedTransferReason?.title
|
|
self.reciepient?.reasonId = selectedTransferReason?.id
|
|
}
|
|
}
|
|
|
|
|
|
// MARK: VC's Life cycle
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
self.setup()
|
|
self.setupDelegates()
|
|
self.setupTargets()
|
|
self.reciepient = ReceipientViewModel()
|
|
self.presenter?.viewIsReady()
|
|
}
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
self.navigationItem.title = StringConstants().addRecipientTitle
|
|
}
|
|
|
|
// Trying to show keyboard from viewDidLoad where the view might not be loaded fully.
|
|
// So try to move becomeFirstResponse related code to viewDidAppear where view loaded fully.
|
|
override func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
self.firstNameTextField.becomeFirstResponder()
|
|
}
|
|
|
|
override func viewWillDisappear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
self.navigationItem.title = ""
|
|
}
|
|
|
|
// MARK: IBActions
|
|
|
|
@IBAction private func save(_ sender: UIButton) {
|
|
if let reciepient = self.reciepient {
|
|
self.presenter?.save(model: reciepient)
|
|
}
|
|
}
|
|
// MARK: Other Functions
|
|
|
|
private func setTextField(){
|
|
self.firstNameTextField.keyboardType = .asciiCapable
|
|
self.firstNameTextField.returnKeyType = .next
|
|
self.firstNameTextField.autocorrectionType = .no
|
|
|
|
self.middleNameTextField.keyboardType = .asciiCapable
|
|
self.middleNameTextField.returnKeyType = .next
|
|
self.middleNameTextField.autocorrectionType = .no
|
|
|
|
self.lastNameTextField.keyboardType = .asciiCapable
|
|
self.lastNameTextField.returnKeyType = .next
|
|
self.lastNameTextField.autocorrectionType = .no
|
|
|
|
self.addressTextField.keyboardType = .asciiCapable
|
|
self.addressTextField.returnKeyType = .next
|
|
self.addressTextField.autocorrectionType = .no
|
|
|
|
}
|
|
|
|
private func setup() {
|
|
// all setup should be done here
|
|
self.setupNavigation()
|
|
self.configureView()
|
|
self.configureLanguage()
|
|
self.setTextField()
|
|
|
|
|
|
}
|
|
|
|
private func configureLanguage() {
|
|
self.headerTItleLabel.text = StringConstants().headerText
|
|
self.firstNameTitleLabel.text = StringConstants().firstNameText
|
|
self.middleNameTitleLabel.text = StringConstants().middleNameText
|
|
self.lastNametitleLabel.text = StringConstants().lastNameText
|
|
self.countryNameTitleLabel.text = StringConstants().countryNameText
|
|
self.stateTitleLabel.text = StringConstants().stateText
|
|
self.districtTitleLabel.text = StringConstants().districtText
|
|
self.addressTitleLabel.text = StringConstants().addressText
|
|
self.relationTitleLabel.text = StringConstants().relationText
|
|
self.mobileTitleLabel.text = StringConstants().mobileText
|
|
self.transferTitleLabel.text = StringConstants().transferText
|
|
saveButton.setTitle(StringConstants().saveText, for: .normal)
|
|
|
|
// placeholders
|
|
|
|
self.firstNameTextField.placeholder = StringConstants().firstnamePlaceholder
|
|
self.middleNameTextField.placeholder = StringConstants().middlenamePlaceholder
|
|
self.lastNameTextField.placeholder = StringConstants().lastnamePlaceholder
|
|
self.countryTextField.placeholder = StringConstants().countryPlaceholder
|
|
self.stateProvinceTextField.placeholder = StringConstants().statePlaceholder
|
|
self.districtTextField.placeholder = StringConstants().districtPlaceholder
|
|
self.addressTextField.placeholder = StringConstants().addressPlaceholder
|
|
self.relationTextField.placeholder = StringConstants().relationPlaceholder
|
|
self.mobileTextField.placeholder = StringConstants().mobilePlaceholder
|
|
self.transferReasonTextField.placeholder = StringConstants().transferPlaceholder
|
|
}
|
|
|
|
private func configureView() {
|
|
self.provienceStackView.isHidden = true
|
|
self.districtStackView.isHidden = true
|
|
}
|
|
|
|
private func setupDelegates() {
|
|
self.countryTextField.delegate = self
|
|
self.stateProvinceTextField.delegate = self
|
|
self.districtTextField.delegate = self
|
|
self.relationTextField.delegate = self
|
|
self.transferReasonTextField.delegate = self
|
|
|
|
self.firstNameTextField.delegate = self
|
|
self.middleNameTextField.delegate = self
|
|
self.lastNameTextField.delegate = self
|
|
self.countryTextField.delegate = self
|
|
self.stateProvinceTextField.delegate = self
|
|
self.districtTextField.delegate = self
|
|
self.addressTextField.delegate = self
|
|
self.relationTextField.delegate = self
|
|
self.mobileTextField.delegate = self
|
|
|
|
}
|
|
|
|
private func setupTargets() {
|
|
[firstNameTextField, middleNameTextField, lastNameTextField, countryTextField, stateProvinceTextField, districtTextField, addressTextField, relationTextField, mobileTextField, emailTextField, transferReasonTextField].forEach({
|
|
$0.addTarget(self, action: #selector(self.textFieldChanged(sender:)), for: UIControlEvents.editingChanged)
|
|
})
|
|
}
|
|
|
|
@objc private func textFieldChanged(sender: UITextField) {
|
|
switch sender {
|
|
case firstNameTextField:
|
|
self.reciepient?.firstName = firstNameTextField.text!
|
|
case middleNameTextField:
|
|
self.reciepient?.middleName = middleNameTextField.text!
|
|
case lastNameTextField:
|
|
self.reciepient?.lastName = lastNameTextField.text!
|
|
case addressTextField:
|
|
self.reciepient?.address = addressTextField.text!
|
|
case mobileTextField:
|
|
self.reciepient?.mobileNumber = mobileTextField.text!
|
|
case emailTextField:
|
|
self.reciepient?.email = emailTextField.text!
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
private func setupNavigation() {
|
|
self.navigationItem.backBarButtonItem?.image =
|
|
#imageLiteral(resourceName: "backIconBlack")
|
|
self.navigationController?.navigationBar.tintColor = UIColor.black
|
|
}
|
|
|
|
private func showCountryPickerview() {
|
|
let viewcontroller = UIStoryboard.init(name: "CountryPicker", bundle: nil).instantiateViewController(withIdentifier: "CountryPickerViewController") as! CountryPickerViewController
|
|
viewcontroller.data = self.countries ?? []
|
|
viewcontroller.doneAction = self.countrySelected
|
|
viewcontroller.defaultSelectedData = [self.selectedCountry]
|
|
viewcontroller.type = PickerTitle.country
|
|
self.present(viewcontroller, animated: true, completion: nil)
|
|
}
|
|
|
|
private func getPickerViewController()-> ItemsPickerViewController {
|
|
return UIStoryboard.init(name: "ItemsPicker", bundle: nil).instantiateViewController(withIdentifier: "ItemsPickerViewController") as! ItemsPickerViewController
|
|
}
|
|
|
|
private func showProviencePickerview() {
|
|
let viewcontroller = self.getPickerViewController()
|
|
let proviences = self.selectedCountry?.proviences ?? []
|
|
let names = proviences.compactMap({$0.name})
|
|
viewcontroller.data = names
|
|
viewcontroller.type = PickerTitle.state
|
|
viewcontroller.doneAction = self.provienceSelected
|
|
viewcontroller.defaultSelectedData = [self.selectedProvience?.name ?? ""]
|
|
self.present(viewcontroller, animated: true, completion: nil)
|
|
}
|
|
|
|
private func showDistrictPickerview() {
|
|
let viewcontroller = self.getPickerViewController()
|
|
let districts = self.selectedProvience?.districts ?? []
|
|
let names = districts.compactMap({$0.name})
|
|
viewcontroller.data = names
|
|
viewcontroller.type = PickerTitle.district
|
|
viewcontroller.doneAction = self.districtSelected
|
|
viewcontroller.defaultSelectedData = [self.selectedDistrict?.name ?? ""]
|
|
self.present(viewcontroller, animated: true, completion: nil)
|
|
}
|
|
|
|
private func showRelationPickerView() {
|
|
let viewcontroller = self.getPickerViewController()
|
|
let relations = self.relations ?? []
|
|
let names = relations.compactMap({$0.title})
|
|
viewcontroller.data = names
|
|
viewcontroller.type = PickerTitle.relation
|
|
viewcontroller.doneAction = self.relationSelected
|
|
viewcontroller.defaultSelectedData = [self.selectedRelation?.title ?? ""]
|
|
self.present(viewcontroller, animated: true, completion: nil)
|
|
}
|
|
|
|
private func showTransferReasonPickerView() {
|
|
let viewcontroller = self.getPickerViewController()
|
|
let transferReasons = self.transferReasons ?? []
|
|
let names = transferReasons.compactMap({$0.title})
|
|
viewcontroller.data = names
|
|
viewcontroller.type = PickerTitle.transferReasons
|
|
viewcontroller.doneAction = self.transferReasonSelected
|
|
viewcontroller.defaultSelectedData = [self.selectedTransferReason?.title ?? ""]
|
|
self.present(viewcontroller, animated: true, completion: nil)
|
|
}
|
|
|
|
private func transferReasonSelected(reasons: [String]) {
|
|
let _reason = self.transferReasons?.filter({($0.title ?? "") == (reasons.first ?? "") }).first
|
|
self.selectedTransferReason = _reason
|
|
}
|
|
|
|
private func relationSelected(relations: [String]) {
|
|
let _relations = self.relations?.filter({($0.title ?? "") == (relations.first ?? "") }).first
|
|
self.selectedRelation = _relations
|
|
mobileTextField.becomeFirstResponder()
|
|
}
|
|
|
|
private func districtSelected(district: [String]) {
|
|
let _district = (self.selectedProvience?.districts ?? []).filter({
|
|
( $0.name ?? "" ) == ( district.first ?? "" )
|
|
}).first
|
|
self.selectedDistrict = _district
|
|
|
|
}
|
|
|
|
private func provienceSelected(provience: [String]) {
|
|
let _provience = (self.selectedCountry?.proviences ?? []).filter({
|
|
($0.name ?? "") == (provience.first ?? "")
|
|
})
|
|
self.selectedProvience = _provience.first
|
|
}
|
|
|
|
private func countrySelected(models: [SendMoneyCountryViewModel]) {
|
|
self.selectedCountry = models.first
|
|
self.addressTextField.becomeFirstResponder()
|
|
}
|
|
|
|
internal func showLoading() {
|
|
self.showProgressHud()
|
|
}
|
|
|
|
internal func hideLoading() {
|
|
self.hideProgressHud()
|
|
}
|
|
|
|
internal func show(error: String) {
|
|
self.alert(message: error)
|
|
}
|
|
}
|
|
|
|
// MARK: AddReciepientViewInterface
|
|
extension AddReciepientViewController: AddReciepientViewInterface {
|
|
func show(countries: [SendMoneyCountryViewModel]) {
|
|
self.countries = countries
|
|
}
|
|
|
|
func show(transferReasons: [SendMoneyTransferReasonViewModel]) {
|
|
self.transferReasons = transferReasons
|
|
}
|
|
|
|
func show(relations: [SendMoneyRelationViewModel]) {
|
|
self.relations = relations
|
|
}
|
|
}
|
|
|
|
|
|
extension AddReciepientViewController: UITextFieldDelegate {
|
|
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
|
|
switch textField {
|
|
case countryTextField:
|
|
showCountryPickerview()
|
|
return false
|
|
case stateProvinceTextField:
|
|
self.showProviencePickerview()
|
|
return false
|
|
case districtTextField:
|
|
self.showDistrictPickerview()
|
|
return false
|
|
case relationTextField:
|
|
self.showRelationPickerView()
|
|
return false
|
|
case transferReasonTextField:
|
|
self.showTransferReasonPickerView()
|
|
return false
|
|
default:
|
|
return true
|
|
}
|
|
}
|
|
|
|
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
|
switch textField {
|
|
case firstNameTextField:
|
|
firstNameTextField.resignFirstResponder()
|
|
middleNameTextField.becomeFirstResponder()
|
|
case middleNameTextField:
|
|
middleNameTextField.resignFirstResponder()
|
|
lastNameTextField.becomeFirstResponder()
|
|
case lastNameTextField:
|
|
lastNameTextField.resignFirstResponder()
|
|
countryTextField.becomeFirstResponder()
|
|
case addressTextField:
|
|
addressTextField.resignFirstResponder()
|
|
relationTextField.becomeFirstResponder()
|
|
|
|
default:
|
|
break
|
|
}
|
|
return false
|
|
}
|
|
}
|