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

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