// // SendMoneyVerificationViewController.swift // GMERemittance // // Created by gme_2 on 28/08/2018. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class SendMoneyVerificationViewController: UITableViewController { struct StringConstants { let recieverDetails = "reciever_details_text".localized() let transactionDetails = "transaction_detail_text".localized() let readNAgreeText = "i_have_read_to_text".localized() let userAgreementText = "1. "+"gme_user_aggreement_text".localized() let fraudWarningText = "2. "+"GME_fraud_warning_text".localized() let agreeAndSendText = "agree_and_send_text".localized() } // MARK: IBOutlets // Recievers Details @IBOutlet weak var fullNameLabel: UILabel! @IBOutlet weak var addressLabel: UILabel! @IBOutlet weak var countryLabel: UILabel! @IBOutlet weak var mobileLabel: UILabel! @IBOutlet weak var fullNameTitleLabel: UILabel! @IBOutlet weak var addressTitleLabel: UILabel! @IBOutlet weak var countryTitleLabel: UILabel! @IBOutlet weak var mobileTitleLabel: UILabel! // Transation Details @IBOutlet weak var payoutCountryLabel: UILabel! @IBOutlet weak var payoutModeLabel: UILabel! @IBOutlet weak var payingAmountLabel: UILabel! @IBOutlet weak var exchangeRateLabel: UILabel! @IBOutlet weak var serviceChargeLabel: UILabel! @IBOutlet weak var payoutAgentBankLabel: UILabel! @IBOutlet weak var accountNoLabel: UILabel! @IBOutlet weak var payoutCountryTitleLabel: UILabel! @IBOutlet weak var payoutModeTitleLabel: UILabel! @IBOutlet weak var payingAmountTitleLabel: UILabel! @IBOutlet weak var exchangeRateTitleLabel: UILabel! @IBOutlet weak var serviceChargeTitleLabel: UILabel! @IBOutlet weak var payoutAgentBankTitleLabel: UILabel! @IBOutlet weak var accountNumTitlelabel: UILabel! // title labels @IBOutlet weak var recieverDetailsLabel: UILabel! @IBOutlet weak var transactionDetailsLabel: UILabel! @IBOutlet weak var readAndAgreeTextLabel: UILabel! @IBOutlet weak var userAgreementButton: UIButton! @IBOutlet weak var fraudWarningButton: UIButton! @IBOutlet weak var agreeAndSendButton: UIButton! @IBOutlet weak var bankNameStackView: UIStackView! @IBOutlet weak var accountNumberStackView: UIStackView! var url: String? var isUsingBiometricAuth = false { didSet { self.requestModel?.isUseBiometric = isUsingBiometricAuth } } // MARK: Properties var presenter: SendMoneyVerificationModuleInterface? var reciepient: Recipient? var requestModel: SendMoneyRequestModel? weak var hudDelegate: HUDStatusDelegate? var password: String? { didSet { guard let model = self.requestModel, let reciepient = self.reciepient, let password = self.password, password != "" else { return } model.transactionPassword = password self.presenter?.submit(model: model, reciepient: reciepient) } } // MARK: VC's Life cycle override func viewDidLoad() { super.viewDidLoad() self.setup() self.configureLanguage() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationItem.title = "resend_money_text".localized() populateRecieversInformations() populateTransactionDetails() self.bankNameStackView.isHidden = (self.requestModel?.bank?.name ?? "").isEmpty self.accountNumberStackView.isHidden = (self.requestModel?.paymemtMode?.accountNumber ?? "").isEmpty } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return 200 } // MARK: IBActions @IBAction func showUserAgreement(_ sender: UIButton) { guard let webController = UIStoryboard(name: "Storyboard", bundle: nil) .instantiateViewController(withIdentifier: "WebLinksViewController") as? WebLinksViewController else { return } webController.titleString = "User Agreement" webController.url = self.url ?? "https://online.gmeremit.com/Terms" let nav = UINavigationController.init(rootViewController: webController) self.present(nav, animated: true, completion: nil) } @IBAction func submit(_ sender: UIButton) { self.askPassword() } // MARK: Other Functions private func setup() { configureLanguage() agreeAndSendButton.layer.cornerRadius = 5 agreeAndSendButton.backgroundColor = .themeRed agreeAndSendButton.titleLabel?.font = .sanfrancisco(.medium, size: 18) recieverDetailsLabel.textColor = .themeRed transactionDetailsLabel.textColor = .themeRed userAgreementButton.setTitleColor(.themeRed, for: .normal) } private func configureLanguage() { self.fullNameTitleLabel.text = "full_name_text".localized() self.addressTitleLabel.text = "address_text".localized() self.countryTitleLabel.text = "country_text".localized() self.mobileTitleLabel.text = "mobile_text".localized() self.payoutCountryTitleLabel.text = "payout_country_text".localized() self.payoutModeTitleLabel.text = "payout_mode_text".localized() self.payingAmountTitleLabel.text = "paying_amount_text".localized() self.exchangeRateTitleLabel.text = "exchange_rate_text".localized() self.serviceChargeTitleLabel.text = "service_charge_text".localized() self.payoutAgentBankTitleLabel.text = "payout_agent_text".localized() self.recieverDetailsLabel.text = StringConstants().recieverDetails self.transactionDetailsLabel.text = StringConstants().transactionDetails self.readAndAgreeTextLabel.text = StringConstants().readNAgreeText self.userAgreementButton.setTitle(StringConstants().userAgreementText, for: .normal) self.fraudWarningButton.setTitle(StringConstants().fraudWarningText, for: .normal) self.agreeAndSendButton.setTitle(StringConstants().agreeAndSendText , for: .normal) } private func populateRecieversInformations() { self.fullNameLabel.text = self.reciepient?.fullName self.addressLabel.text = self.reciepient?.address self.countryLabel.text = self.reciepient?.country self.mobileLabel.text = self.reciepient?.mobile } private func populateTransactionDetails() { self.payoutCountryLabel.text = self.reciepient?.country self.payoutModeLabel.text = self.requestModel?.paymemtMode?.mode self.payingAmountLabel.text = (self.requestModel?.exchangeRateDetail?.recipientAmount ?? "") + " \(self.requestModel?.exchangeRateDetail?.reciepientCurrency ?? "")" self.exchangeRateLabel.text = self.requestModel?.exchangeRateDetail?.exchangeRate self.serviceChargeLabel.text = self.requestModel?.exchangeRateDetail?.discountedServiceFee self.payoutAgentBankLabel.text = self.requestModel?.bank?.name self.accountNoLabel.text = self.requestModel?.paymemtMode?.accountNumber } func showSecureKeypad() { let secureKeypad = SecureKeypad(target: self) secureKeypad.delegate = self secureKeypad.present(animated: true) } func askPassword() { if (self.requestModel?.autoDebitAccount?.type ?? "").lowercased() == "wallet" { if let isUseBiometric = KeyChain.shared.get(key: .biometricAuth), isUseBiometric == "1" { let biometricAuthenticationWireframe = BiometricAuthenticationWireframe() biometricAuthenticationWireframe.openWithDelegate(on: self, delegate: self) } else { showSecureKeypad() } } else { if let isUseBiometric = KeyChain.shared.get(key: .biometricAuth), isUseBiometric == "1" { let biometricAuthenticationWireframe = BiometricAuthenticationWireframe() biometricAuthenticationWireframe.openWithDelegate(on: self, delegate: self) } else { isUsingBiometricAuth = false SendMoneyCodeWireframe().open( newValue: "", requestmodel: self.requestModel, completion: self.otpEntered, source: self ) } } } func otpEntered(otp: String) { self.password = otp } } // MARK: SendMoneyVerificationViewInterface extension SendMoneyVerificationViewController: SendMoneyVerificationViewInterface { func show(model: SendMoneySubmitModelContainer?) { guard let message = model?.message, let expectedPoint = model?.extra2 else { return } let successMessage = "\(message)\n(\("estimated_earning_points_text".localized()): \(expectedPoint.likeCommaMoney() ?? "0"))" self.alertWithOk( type: .success, message: successMessage, title: "Success", okTitle: "OK" ) { if let id = model?.id { self.presenter?.openReciept(transactionId: id) } else { self.alert(type: .error, message: "No Transaction recievied.") } } } func show(error: String) { // self.presenter?.openReciept(transactionId: "1235") if isUsingBiometricAuth { if error.contains("Invalid Password") { MainWireframe .logoutWarningAlert(message: "It is different from registered password.\nplease try to login again") } } self.alert(type: .error, message: error) } func showLoading() { if hudDelegate != nil { self.hudDelegate?.showLoading() } else { self.showProgressHud() } } func hideLoading() { self.hudDelegate?.hideLoading() self.hideProgressHud() } } extension SendMoneyVerificationViewController { override func didMove(toParent parent: UIViewController?) { self.viewWillAppear(true) } } // MARK: - BiometricAuthenticationViewControllerDelegate extension SendMoneyVerificationViewController: BiometricAuthenticationViewControllerDelegate { func viewController( _ viewController: BiometricAuthenticationViewController, informationTitleLabel titleLabel: UILabel, authenticationButton button: UIButton ) { titleLabel.text = "bio_sendmoney_intro_text".localized() button.setTitle("send_money_text".localized(), for: .normal) } func didComplete(_ viewController: BiometricAuthenticationViewController) { self.isUsingBiometricAuth = true viewController.dismiss(animated: true) { guard let encryptedPW = KeyChain.shared.get(key: .password) else { MainWireframe.logoutWarningAlert(message: "To use biometrics authentication you have to login again.") return } self.password = encryptedPW } } func viewController( _ viewController: BiometricAuthenticationViewController, didFailWithError error: BiometricAuthenticationError, errorMessage: String? ) { print("BiometricAuthenticationWireframe Error: \(errorMessage ?? "")") viewController.dismiss(animated: true) { switch error { case .userFallback: self.isUsingBiometricAuth = false guard let type = self.requestModel?.autoDebitAccount?.type else { return } switch type { case "autodebit": SendMoneyCodeWireframe().open( newValue: "", requestmodel: self.requestModel, completion: self.otpEntered, source: self ) case "wallet": self.showSecureKeypad() default: break } case .biometryNotEnrolled, .notBeConfigured, .biometryNotAvailable: self.alert(type: .error, message: error.message) default: break } } } func doSelectLocalAuthenticationPolicy( _ viewController: BiometricAuthenticationViewController ) -> BiometricAuthenticationPolicy { return .deviceOwnerAuthenticationWithBiometrics } } extension SendMoneyVerificationViewController: SecureKeypadDelegate { func didComplete(_ encryptedString: String, garbagePassword: String, length: Int) { self.password = encryptedString } }