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.

340 lines
13 KiB

4 years ago
4 years ago
4 years ago
  1. //
  2. // SendMoneyVerificationViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 28/08/2018.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. class SendMoneyVerificationViewController: UITableViewController {
  10. struct StringConstants {
  11. let recieverDetails = "reciever_details_text".localized()
  12. let transactionDetails = "transaction_detail_text".localized()
  13. let readNAgreeText = "i_have_read_to_text".localized()
  14. let userAgreementText = "jme_user_aggreement_text".localized()
  15. // let fraudWarningText = "2. "+"GME_fraud_warning_text".localized()
  16. let agreeAndSendText = "send_money_text".localized()
  17. }
  18. // MARK: IBOutlets
  19. // Recievers Details
  20. @IBOutlet weak var detailBgView: UIView!
  21. @IBOutlet weak var detailView: UIView!
  22. @IBOutlet weak var fullNameLabel: UILabel!
  23. @IBOutlet weak var addressLabel: UILabel!
  24. @IBOutlet weak var countryLabel: UILabel!
  25. @IBOutlet weak var mobileLabel: UILabel!
  26. @IBOutlet weak var fullNameTitleLabel: UILabel!
  27. @IBOutlet weak var addressTitleLabel: UILabel!
  28. @IBOutlet weak var countryTitleLabel: UILabel!
  29. @IBOutlet weak var mobileTitleLabel: UILabel!
  30. // Transation Details
  31. @IBOutlet weak var payoutCountryLabel: UILabel!
  32. @IBOutlet weak var payoutModeLabel: UILabel!
  33. @IBOutlet weak var payingAmountLabel: UILabel!
  34. @IBOutlet weak var exchangeRateLabel: UILabel!
  35. @IBOutlet weak var serviceChargeLabel: UILabel!
  36. @IBOutlet weak var payoutAgentBankLabel: UILabel!
  37. @IBOutlet weak var accountNoLabel: UILabel!
  38. @IBOutlet weak var payoutCountryTitleLabel: UILabel!
  39. @IBOutlet weak var payoutModeTitleLabel: UILabel!
  40. @IBOutlet weak var payingAmountTitleLabel: UILabel!
  41. @IBOutlet weak var exchangeRateTitleLabel: UILabel!
  42. @IBOutlet weak var serviceChargeTitleLabel: UILabel!
  43. @IBOutlet weak var payoutAgentBankTitleLabel: UILabel!
  44. @IBOutlet weak var accountNumTitlelabel: UILabel!
  45. @IBOutlet weak var rewardPointTitleLabel: UILabel!
  46. @IBOutlet weak var rewardPointLabel: UILabel!
  47. // title labels
  48. @IBOutlet weak var recieverDetailsLabel: UILabel!
  49. @IBOutlet weak var transactionDetailsLabel: UILabel!
  50. @IBOutlet weak var readAndAgreeTextLabel: UILabel!
  51. @IBOutlet weak var userAgreementButton: UIButton!
  52. @IBOutlet weak var fraudWarningButton: UIButton!
  53. @IBOutlet weak var agreeAndSendButton: UIButton!
  54. @IBOutlet weak var rewardPointStackView: UIStackView!
  55. @IBOutlet weak var bankNameStackView: UIStackView!
  56. @IBOutlet weak var accountNumberStackView: UIStackView!
  57. var url: String?
  58. var isUsingBiometricAuth = false {
  59. didSet {
  60. self.requestModel?.isUseBiometric = isUsingBiometricAuth
  61. }
  62. }
  63. // MARK: Properties
  64. var presenter: SendMoneyVerificationModuleInterface?
  65. var reciepient: Recipient?
  66. var requestModel: SendMoneyRequestModel?
  67. var discountedFee: String?
  68. weak var hudDelegate: HUDStatusDelegate?
  69. weak var actionDelegate: SendMoneyExchangeRateActionDelegate?
  70. lazy var pinViewOption: Options = {
  71. var options = Options()
  72. options.image = UIImage(named: "app logo")
  73. options.title = "enter_your_transaction_pin_text".localized()
  74. options.pinColor = #colorLiteral(red: 0.93, green: 0.11, blue: 0.14, alpha: 1)
  75. return options
  76. }()
  77. var password: String? {
  78. didSet {
  79. guard
  80. let model = self.requestModel,
  81. let reciepient = self.reciepient,
  82. let password = self.password,
  83. password != ""
  84. else {
  85. return
  86. }
  87. model.transactionPassword = password
  88. print(password)
  89. self.presenter?.submit(model: model, reciepient: reciepient)
  90. }
  91. }
  92. // MARK: VC's Life cycle
  93. override func viewDidLoad() {
  94. super.viewDidLoad()
  95. self.setup()
  96. self.detailBgView.layer.applyCornerRadiusShadow(alpha: 0.5, x: -2, y: 25, blur: 20, spread: 0, cornerRadiusValue: 10)
  97. self.configureLanguage()
  98. }
  99. override func viewWillAppear(_ animated: Bool) {
  100. super.viewWillAppear(animated)
  101. self.navigationItem.title = "resend_money_text".localized()
  102. populateRecieversInformations()
  103. populateTransactionDetails()
  104. self.bankNameStackView.isHidden = (self.requestModel?.bank?.name ?? "").isEmpty
  105. self.accountNumberStackView.isHidden = (self.requestModel?.paymemtMode?.accountNumber ?? "").isEmpty
  106. }
  107. override func viewDidDisappear(_ animated: Bool) {
  108. super.viewDidDisappear(animated)
  109. }
  110. override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  111. return UITableView.automaticDimension
  112. }
  113. override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
  114. return 200
  115. }
  116. // MARK: IBActions
  117. @IBAction func showUserAgreement(_ sender: UIButton) {
  118. guard let webController = UIStoryboard(name: "Storyboard", bundle: nil)
  119. .instantiateViewController(withIdentifier: "WebLinksViewController") as? WebLinksViewController
  120. else { return }
  121. webController.titleString = "User Agreement"
  122. webController.url = self.url ?? "https://online.gmeremit.com/Terms"
  123. let nav = UINavigationController.init(rootViewController: webController)
  124. self.present(nav, animated: true, completion: nil)
  125. }
  126. @IBAction func submit(_ sender: UIButton) {
  127. // self.askPassword()
  128. actionDelegate?.continueToTermsAndConditions()
  129. }
  130. // MARK: Other Functions
  131. private func setup() {
  132. configureLanguage()
  133. agreeAndSendButton.layer.cornerRadius = 12
  134. agreeAndSendButton.backgroundColor = .themeRed
  135. agreeAndSendButton.titleLabel?.font = .sanfrancisco(.medium, size: 18)
  136. recieverDetailsLabel.textColor = .black
  137. transactionDetailsLabel.textColor = .black
  138. userAgreementButton.setTitleColor(.themeBlue, for: .normal)
  139. }
  140. private func configureLanguage() {
  141. self.fullNameTitleLabel.text = "full_name_text".localized()
  142. self.addressTitleLabel.text = "address_text".localized()
  143. self.countryTitleLabel.text = "country_text".localized()
  144. self.mobileTitleLabel.text = "mobile_text".localized()
  145. self.payoutCountryTitleLabel.text = "payout_country_text".localized()
  146. self.payoutModeTitleLabel.text = "payout_mode_text".localized()
  147. self.payingAmountTitleLabel.text = "paying_amount_text".localized()
  148. self.exchangeRateTitleLabel.text = "exchange_rate_text".localized()
  149. self.serviceChargeTitleLabel.text = "service_charge_text".localized()
  150. self.payoutAgentBankTitleLabel.text = "payout_agent_text".localized()
  151. self.accountNumTitlelabel.text = "account_text".localized()
  152. self.recieverDetailsLabel.text = StringConstants().recieverDetails
  153. self.transactionDetailsLabel.text = StringConstants().transactionDetails
  154. self.readAndAgreeTextLabel.text = StringConstants().readNAgreeText
  155. self.userAgreementButton.setTitle(StringConstants().userAgreementText, for: .normal)
  156. // self.fraudWarningButton.setTitle(StringConstants().fraudWarningText, for: .normal)
  157. self.agreeAndSendButton.setTitle(StringConstants().agreeAndSendText
  158. , for: .normal)
  159. }
  160. private func populateRecieversInformations() {
  161. self.fullNameLabel.text = self.reciepient?.fullName
  162. self.addressLabel.text = self.reciepient?.address
  163. self.countryLabel.text = self.reciepient?.country
  164. self.mobileLabel.text = self.reciepient?.mobile
  165. if let rewardPoint = self.requestModel?.discountedFee {
  166. self.rewardPointStackView.isHidden = false
  167. self.rewardPointLabel.text = rewardPoint
  168. } else {
  169. self.rewardPointStackView.isHidden = true
  170. }
  171. }
  172. private func populateTransactionDetails() {
  173. self.payoutCountryLabel.text = self.reciepient?.country
  174. self.payoutModeLabel.text = self.requestModel?.paymemtMode?.mode
  175. self.payingAmountLabel.text = (self.requestModel?.exchangeRateDetail?.recipientAmount ?? "") +
  176. " \(self.requestModel?.exchangeRateDetail?.reciepientCurrency ?? "")"
  177. self.exchangeRateLabel.text = self.requestModel?.exchangeRateDetail?.exchangeRate
  178. self.serviceChargeLabel.text = self.requestModel?.exchangeRateDetail?.transferFee
  179. self.payoutAgentBankLabel.text = self.requestModel?.bank?.name
  180. self.accountNoLabel.text = self.requestModel?.paymemtMode?.accountNumber
  181. }
  182. func showSecureKeypad() {
  183. PINKeyboardView.present(config: self.pinViewOption, over: self, pinEntered: {pin,ok in
  184. if pin.count == 6 && ok == true {
  185. self.password = pin
  186. }
  187. },presented:nil)
  188. }
  189. func askPassword() {
  190. // if let isUseBiometric = KeyChain.shared.get(key: .biometricAuth), isUseBiometric == "1" {
  191. // let biometricAuthenticationWireframe = BiometricAuthenticationWireframe()
  192. // biometricAuthenticationWireframe.openWithDelegate(on: self, delegate: self)
  193. // } else {
  194. // showSecureKeypad()
  195. //
  196. showSecureKeypad()
  197. }
  198. }
  199. // MARK: SendMoneyVerificationViewInterface
  200. extension SendMoneyVerificationViewController: SendMoneyVerificationViewInterface {
  201. func show(model: SendMoneySubmitModelContainer?) {
  202. guard let message = model?.message, let expectedPoint = model?.extra2 else {
  203. return
  204. }
  205. // let successMessage = "\(message)\n(\("estimated_earning_points_text".localized()): \(expectedPoint.likeCommaMoney() ?? "0"))"
  206. self.alertWithOk(
  207. type: .success,
  208. message: "Transfer Successful!",
  209. title: "success_text".localized(),
  210. okTitle: "OK"
  211. ) {
  212. if let id = model?.id {
  213. self.presenter?.openReciept(transactionId: id)
  214. } else {
  215. self.alert(type: .error, message: "No Transaction received.")
  216. }
  217. }
  218. }
  219. func show(error: String) {
  220. // self.presenter?.openReciept(transactionId: "1235")
  221. if isUsingBiometricAuth {
  222. if error.contains("Invalid Password") {
  223. MainWireframe
  224. .logoutWarningAlert(message: "It is different from registered password.\nplease try to login again")
  225. }
  226. }
  227. self.alert(type: .error, message: error)
  228. }
  229. func showLoading() {
  230. self.showProgressHud()
  231. }
  232. func hideLoading() {
  233. self.hudDelegate?.hideLoading()
  234. self.hideProgressHud()
  235. }
  236. }
  237. extension SendMoneyVerificationViewController {
  238. override func didMove(toParent parent: UIViewController?) {
  239. self.viewWillAppear(true)
  240. }
  241. }
  242. // MARK: - BiometricAuthenticationViewControllerDelegate
  243. extension SendMoneyVerificationViewController: BiometricAuthenticationViewControllerDelegate {
  244. func viewController(
  245. _ viewController: BiometricAuthenticationViewController,
  246. informationTitleLabel titleLabel: UILabel,
  247. authenticationButton button: UIButton
  248. ) {
  249. titleLabel.text = "bio_sendmoney_intro_text".localized()
  250. button.setTitle("send_money_text".localized(), for: .normal)
  251. }
  252. func didComplete(_ viewController: BiometricAuthenticationViewController) {
  253. self.isUsingBiometricAuth = true
  254. viewController.dismiss(animated: true) {
  255. guard let encryptedPW = KeyChain.shared.get(key: .password) else {
  256. MainWireframe.logoutWarningAlert(message: "To use biometrics authentication you have to login again.")
  257. return
  258. }
  259. self.password = encryptedPW
  260. }
  261. }
  262. func viewController(
  263. _ viewController: BiometricAuthenticationViewController,
  264. didFailWithError error: BiometricAuthenticationError,
  265. errorMessage: String?
  266. ) {
  267. print("BiometricAuthenticationWireframe Error: \(errorMessage ?? "")")
  268. viewController.dismiss(animated: true) {
  269. switch error {
  270. case .userFallback:
  271. self.isUsingBiometricAuth = false
  272. self.showSecureKeypad()
  273. case .biometryNotEnrolled, .notBeConfigured, .biometryNotAvailable:
  274. self.alert(type: .error, message: error.message)
  275. default:
  276. break
  277. }
  278. }
  279. }
  280. func doSelectLocalAuthenticationPolicy(
  281. _ viewController: BiometricAuthenticationViewController
  282. ) -> BiometricAuthenticationPolicy {
  283. return .deviceOwnerAuthenticationWithBiometrics
  284. }
  285. }