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

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