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.
361 lines
12 KiB
361 lines
12 KiB
//
|
|
// 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
|
|
}
|
|
}
|