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.

354 lines
12 KiB

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