// // EditReciepientViewController.swift // GMERemittance // // Created by gme_2 on 28/08/2018. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class EditReciepientViewController: UIViewController { 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() // placeholder let firstnamePlaceholder = "placeholder_enter_receiver_firstname_text".localized() let lastnamePlaceholder = "placeholder_enter_receiver_middle_text".localized() let middlenamePlaceholder = "placeholder_enter_receiver_lastname_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 weak var firstNameTextField: UITextField! @IBOutlet weak var middleNameTextField: UITextField! @IBOutlet weak var lastNameTextField: UITextField! @IBOutlet weak var countryTextField: UITextField! @IBOutlet weak var stateProvinceTextField: UITextField! @IBOutlet weak var districtTextField: UITextField! @IBOutlet weak var addressTextField: UITextField! @IBOutlet weak var relationTextField: UITextField! @IBOutlet weak var mobileTextField: UITextField! @IBOutlet weak var emailTextField: UITextField! @IBOutlet weak var transferReasonTextField: UITextField! @IBOutlet weak var saveButton: UIButton! @IBOutlet weak var provienceStackView: UIStackView! @IBOutlet weak var districtStackView: UIStackView! // titles @IBOutlet weak var headerTItleLabel: UILabel! @IBOutlet weak var firstNameTitleLabel: UILabel! @IBOutlet weak var middleNameTitleLabel: UILabel! @IBOutlet weak var lastNametitleLabel: UILabel! @IBOutlet weak var countryNameTitleLabel: UILabel! @IBOutlet weak var stateTitleLabel: UILabel! @IBOutlet weak var districtTitleLabel: UILabel! @IBOutlet weak var addressTitleLabel: UILabel! @IBOutlet weak var relationTitleLabel: UILabel! @IBOutlet weak var mobileTitleLabel: UILabel! @IBOutlet weak var transferTitleLabel: UILabel! // MARK: Properties var presenter: EditReciepientModuleInterface? var countries: [SendMoneyCountryViewModel]? var transferReasons: [SendMoneyTransferReasonViewModel]? var relations: [SendMoneyRelationViewModel]? var reciepient: EditRecipientRecipientViewModel? { didSet { self.populateInformations() } } 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 self.reciepient?.country = self.selectedCountry?.name } } var selectedProvience: SendMoneyProvienceViewModel? { didSet { self.stateProvinceTextField.text = selectedProvience?.name self.reciepient?.stateId = self.selectedProvience?.id } } var selectedDistrict: SendMoneyDistrictViewModel? { didSet { self.districtTextField.text = selectedDistrict?.name self.reciepient?.districtId = self.selectedDistrict?.id } } var selectedRelation: SendMoneyRelationViewModel? { didSet { self.relationTextField.text = selectedRelation?.title self.reciepient?.relationId = self.selectedRelation?.id } } 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.presenter?.viewIsReady() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationItem.title = "Edit Receipient" } // MARK: IBActions @IBAction func save(_ sender: UIButton) { self.view.endEditing(true) if let reciepient = self.reciepient { self.presenter?.save(model: reciepient) } } // MARK: Other Functions private func setup() { // all setup should be done here self.setupNavigation() self.configureView() self.configureLanguage() } 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 } 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 populateInformations() { self.firstNameTextField.text = self.reciepient?.firstName self.middleNameTextField.text = self.reciepient?.middleName self.lastNameTextField.text = self.reciepient?.lastName let country = self.countries?.filter({ $0.name == self.reciepient?.country }).first?.name self.countryTextField.text = country self.addressTextField.text = reciepient?.address let relation = self.relations?.filter({ $0.title == self.reciepient?.relation }).first?.title self.relationTextField.text = relation self.mobileTextField.text = self.reciepient?.mobileNumber self.emailTextField.text = self.reciepient?.email let transferReason = self.transferReasons?.filter({ $0.title == self.reciepient?.reason }).first?.title self.transferReasonTextField.text = transferReason } 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) } func transferReasonSelected(reasons: [String]) { let _reason = self.transferReasons?.filter({($0.title ?? "") == (reasons.first ?? "") }).first self.selectedTransferReason = _reason } func relationSelected(relations: [String]) { let _relations = self.relations?.filter({($0.title ?? "") == (relations.first ?? "") }).first self.selectedRelation = _relations } func districtSelected(district: [String]) { let _district = (self.selectedProvience?.districts ?? []).filter({ ( $0.name ?? "" ) == ( district.first ?? "" ) }).first self.selectedDistrict = _district } func provienceSelected(provience: [String]) { let _provience = (self.selectedCountry?.proviences ?? []).filter({ ($0.name ?? "") == (provience.first ?? "") }) self.selectedProvience = _provience.first } func countrySelected(models: [SendMoneyCountryViewModel]) { self.selectedCountry = models.first } func showLoading() { self.showProgressHud() } func hideLoading() { self.hideProgressHud() } func show(error: String) { self.alert(message: error) } } // MARK: EditReciepientViewInterface extension EditReciepientViewController: EditReciepientViewInterface { func show(countries: [SendMoneyCountryViewModel]) { self.countries = countries } func show(transferReasons: [SendMoneyTransferReasonViewModel]) { self.transferReasons = transferReasons } func show(relations: [SendMoneyRelationViewModel]) { self.relations = relations } func show(recipient: EditRecipientRecipientViewModel) { self.reciepient = recipient } } extension EditReciepientViewController: 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 } } }