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.

498 lines
17 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
  1. //
  2. // SendMoneyExchangeRateViewController.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. import Hero
  10. class SendMoneyExchangeRateCurrencyViewModel {
  11. var countryCode: String?
  12. var currency: String?
  13. }
  14. extension SendMoneyExchangeRateCurrencyViewModel: TablePresenterProtocol {
  15. var cellTitle: String? {
  16. return currency
  17. }
  18. var cellImage: UIImage? {
  19. return CountryInfo().getFlag(for: countryCode ?? "")
  20. }
  21. }
  22. enum ActionBehaviour {
  23. case calculate
  24. case `continue`
  25. }
  26. class SendMoneyExchangeRateViewController: UIViewController {
  27. private enum DiscountType: String {
  28. case percent = "1"
  29. case value = "2"
  30. }
  31. // MARK: IBOutlets
  32. @IBOutlet private weak var exchangeBackground1: UIView!
  33. @IBOutlet private weak var exchangeBackground2: UIView!
  34. @IBOutlet private weak var dropDownImageView: UIImageView!
  35. @IBOutlet private weak var backgroundViewCountryLabel1: UIView!
  36. @IBOutlet private weak var backgroundViewCountryLabel2: UIView!
  37. @IBOutlet private weak var countryListStackView: UIStackView!
  38. @IBOutlet private weak var countryCodeLabel: UILabel!
  39. @IBOutlet private weak var countryFlagImage: UIImageView!
  40. @IBOutlet private weak var continueButton: UIButton!
  41. @IBOutlet private weak var senderTextField: GMENumberTextField!
  42. @IBOutlet private weak var reciepientTextField: GMENumberTextField!
  43. @IBOutlet private weak var transferFeeInfoLabel: UILabel!
  44. @IBOutlet private weak var exchangeRateLabel: UILabel!
  45. @IBOutlet private weak var youSendTitleLabel: UILabel!
  46. @IBOutlet private weak var recipientGetsTitleLabel: UILabel!
  47. @IBOutlet weak var calculatedInfoView: UIView!
  48. @IBOutlet weak var serviceChargeView: UIStackView!
  49. @IBOutlet weak var exchangeRateView: UIStackView!
  50. @IBOutlet weak var backgroundView: UIView!{
  51. didSet{
  52. backgroundView.layer.cornerRadius = 12
  53. backgroundView.layer.borderWidth = 0.2
  54. backgroundView.layer.borderColor = UIColor.themeSeparate.cgColor
  55. backgroundView.layer.addShadow(with: UIColor.themeShadow)
  56. }
  57. }
  58. @IBOutlet weak var couponListFetch: UIView!
  59. @IBOutlet weak var couponListShow: UIStackView!
  60. // MARK: Properties
  61. var presenter: SendMoneyExchangeRateModuleInterface?
  62. var requestModel: SendMoneyRequestModel?
  63. weak var actionDelegate: SendMoneyExchangeRateActionDelegate?
  64. var reciepient: Recipient?
  65. private lazy var countryListTapGuesture: UITapGestureRecognizer = UITapGestureRecognizer()
  66. private lazy var couponListTapGesture: UITapGestureRecognizer = UITapGestureRecognizer()
  67. private var plainSendingAmount: String?
  68. private var action: ActionBehaviour? {
  69. didSet {
  70. if let action = self.action {
  71. switch action {
  72. case .calculate:
  73. continueButton.setTitle("calculate_text".localized(), for: .normal)
  74. case .continue:
  75. continueButton.setTitle("continue_text".localized(), for: .normal)
  76. }
  77. }
  78. }
  79. }
  80. private var transferFeeCharge: ExchangeRateModel?
  81. private var currencyInfoViewModel: [SendMoneyExchangeRateCurrencyViewModel]? {
  82. didSet {
  83. var selCountry = SendMoneyExchangeRateCurrencyViewModel()
  84. selCountry.currency = self.reciepient?.agent?.currency?.first ?? ""
  85. selectedCurrencyViewModel = selCountry//currencyInfoViewModel?.first
  86. }
  87. }
  88. private var exchangeRateModel: SendMoneyExchangeRateModel? {
  89. didSet {
  90. guard let model = exchangeRateModel else {
  91. self.showExchangeRateInfomation(isHidden: false)
  92. return
  93. }
  94. reciepientTextField.text = Utility.getCommaSeperatedStringWithDecimal(
  95. numberString: model.recipientAmount ?? ""
  96. )
  97. senderTextField.text = Utility.getCommaSeperatedStringWithDecimal(
  98. numberString: model.senderAmount ?? ""
  99. )
  100. let serviceCharge = model.transferFee?.likeCommaMoney() ??
  101. model.transferFee ??
  102. "0.00"
  103. let transferFee = serviceCharge != "0.00" ? "-\(serviceCharge)" : "\(serviceCharge)"
  104. transferFeeInfoLabel.text = "\(transferFee)\n(\("transfer_fee_included_text".localized()))"
  105. exchangeRateLabel.text =
  106. "\(model.exchangeRate ?? "")\n(\("current_exchange_rate_text".localized()))"
  107. self.showExchangeRateInfomation(isHidden: false)
  108. action = .continue
  109. }
  110. }
  111. private var calcBy = ""
  112. private var isFirst = true
  113. private var currencies: [String]? {
  114. didSet {
  115. let models: [SendMoneyExchangeRateCurrencyViewModel] =
  116. (currencies ?? []).map {[weak self] in
  117. guard let `self` = self else {
  118. return SendMoneyExchangeRateCurrencyViewModel()
  119. }
  120. let viewmodel = SendMoneyExchangeRateCurrencyViewModel()
  121. viewmodel.countryCode = self.reciepient?.countryCode ?? ""
  122. viewmodel.currency = $0
  123. return viewmodel
  124. }
  125. currencyInfoViewModel = models
  126. }
  127. }
  128. var selectedCurrencyViewModel: SendMoneyExchangeRateCurrencyViewModel? {
  129. didSet {
  130. setCurrencyLabel(currency: selectedCurrencyViewModel?.currency ?? "")
  131. action = .calculate
  132. }
  133. }
  134. weak var hudDelegate: HUDStatusDelegate?
  135. // MARK: VC's Life cycle
  136. override func viewDidLoad() {
  137. super.viewDidLoad()
  138. setup()
  139. }
  140. override func viewWillAppear(_ animated: Bool) {
  141. super.viewWillAppear(animated)
  142. configureViews()
  143. action = ActionBehaviour.calculate
  144. senderTextField.receiverNativeCountry = reciepient?.countryCode ?? ""
  145. reciepientTextField.receiverNativeCountry = reciepient?.countryCode ?? ""
  146. }
  147. override func viewDidAppear(_ animated: Bool) {
  148. super.viewDidAppear(animated)
  149. if isFirst {
  150. self.senderTextField.becomeFirstResponder()
  151. self.isFirst = false
  152. }
  153. }
  154. override func viewWillDisappear(_ animated: Bool) {
  155. super.viewWillDisappear(animated)
  156. view.endEditing(true)
  157. }
  158. // MARK: IBActions
  159. @IBAction private func continueButton(_ sender: UIButton) {
  160. view.endEditing(true)
  161. if let action = self.action {
  162. switch action {
  163. case .calculate:
  164. calculate()
  165. case .continue:
  166. goToCDDI()
  167. }
  168. }
  169. }
  170. // MARK: Other Functions
  171. private func setup() {
  172. // all setup should be done here
  173. backgroundViewCountryLabel2.hero.id = reciepient?.receiverID
  174. backgroundViewCountryLabel2.hero.modifiers = [.translate()]
  175. setupTargets()
  176. action = .calculate
  177. senderTextField.delegate = self
  178. reciepientTextField.delegate = self
  179. calcBy = "c"
  180. [backgroundViewCountryLabel1, backgroundViewCountryLabel2].forEach { $0?.layer.cornerRadius = 5 }
  181. [exchangeBackground1, exchangeBackground2].forEach {
  182. $0?.layer.borderWidth = 1
  183. $0?.layer.borderColor = UIColor.themeSeparate.cgColor
  184. // UIColor.init(hex: "#E0E0E0").cgColor
  185. $0?.layer.cornerRadius = 5
  186. }
  187. configureLanguage()
  188. continueButton.layer.cornerRadius = 5
  189. continueButton.backgroundColor = .themeRed
  190. continueButton.titleLabel?.font = .sanfrancisco(.medium, size: 18)
  191. senderTextField.textColor = .black
  192. reciepientTextField.textColor = .black
  193. backgroundViewCountryLabel1.backgroundColor = .themeRed
  194. backgroundViewCountryLabel2.backgroundColor = .themeRed
  195. }
  196. private func showExchangeRateInfomation(isHidden flag: Bool) {
  197. calculatedInfoView.isHidden = flag
  198. calculatedInfoView.alpha = flag ? 0.0 : 1.0
  199. if !flag {
  200. self.serviceChargeView.isHidden = false
  201. self.exchangeRateView.isHidden = false
  202. let animator = UIViewPropertyAnimator(duration: 0.3, curve: .easeIn) {
  203. self.serviceChargeView.alpha = 1.0
  204. }
  205. animator.addCompletion { _ in
  206. let subAnimator = UIViewPropertyAnimator(duration: 0.3, curve: .easeIn) {
  207. self.exchangeRateView.alpha = 1.0
  208. }
  209. subAnimator.startAnimation()
  210. }
  211. animator.startAnimation()
  212. } else {
  213. serviceChargeView.isHidden = true
  214. serviceChargeView.alpha = 0.0
  215. exchangeRateView.isHidden = true
  216. exchangeRateView.alpha = 0.0
  217. }
  218. }
  219. private func configureLanguage() {
  220. youSendTitleLabel.text = "you_send_text".localized()
  221. recipientGetsTitleLabel.text = "receipient_gets_text".localized()
  222. continueButton.setTitle("calculate_text".localized(), for: .normal)
  223. }
  224. private func setCountryFlag(countryCode: String) {
  225. let countryEnum = CountryEnum(rawValue: countryCode.lowercased())
  226. countryFlagImage.image = countryEnum?.flag
  227. }
  228. private func setCurrencyLabel(currency: String) {
  229. countryCodeLabel.text = currency.uppercased()
  230. }
  231. private func setupTargets() {
  232. let tapGuesture = UITapGestureRecognizer(target: self, action: #selector(showCountryList(_:)))
  233. countryListTapGuesture = tapGuesture
  234. countryListStackView.addGestureRecognizer(countryListTapGuesture)
  235. reciepientTextField.addTarget(
  236. self,
  237. action: #selector(textChanged(sender:)),
  238. for: UIControl.Event.editingChanged
  239. )
  240. senderTextField.addTarget(
  241. self,
  242. action: #selector(textChanged(sender:)),
  243. for: UIControl.Event.editingChanged
  244. )
  245. }
  246. @objc private func showCountryList(_ sender: UITapGestureRecognizer) {
  247. TablePresenterWireframe().openWith(
  248. delegate: self,
  249. model: currencyInfoViewModel,
  250. source: self
  251. )
  252. }
  253. private func configureViews() {
  254. exchangeRateModel = nil
  255. let dropDownImage = UIImage(named: "dropdown_grey")
  256. let image = dropDownImage
  257. dropDownImageView.image = image
  258. setCountryFlag(countryCode: reciepient?.countryCode ?? "")
  259. let deliveryMethod = requestModel?.paymemtMode
  260. if (deliveryMethod?.bankRequired ?? "false").lowercased() == "true" {
  261. currencies = requestModel?.bank?.payCurrency ?? []
  262. } else {
  263. currencies = deliveryMethod?.payCurrency ?? []
  264. }
  265. }
  266. private func calculate(
  267. senderAmt: String?,
  268. senderCurrency: String?,
  269. recieverAmt: String?,
  270. recieverCurrency: String?,
  271. recieverCountryName: String?,
  272. recieverCountryId: String?,
  273. paymentMethod: String?,
  274. paymentMethodId: String?,
  275. calcBy: String?,
  276. senderCountryId: String?,
  277. payoutPartner: String?,
  278. userId: String?,
  279. bankId: String?
  280. ) {
  281. presenter?.calculate(
  282. senderAmt: senderAmt,
  283. senderCurrency: senderCurrency,
  284. recieverAmt: recieverAmt,
  285. recieverCurrency: recieverCurrency,
  286. recieverCountryName: recieverCountryName,
  287. recieverCountryId: recieverCountryId,
  288. paymentMethod: paymentMethod,
  289. paymentMethodId: paymentMethodId,
  290. calcBy: calcBy,
  291. senderCountryId: senderCountryId,
  292. payoutPartner: payoutPartner,
  293. userId: userId,
  294. bankId: bankId
  295. )
  296. }
  297. @objc private func textChanged(sender: UITextField) {
  298. action = .calculate
  299. switch sender {
  300. case senderTextField:
  301. reciepientTextField.text = ""
  302. calcBy = "c"
  303. senderTextField.text = Utility.getCommaSeperatedString(numberString: senderTextField.text!)
  304. case reciepientTextField:
  305. senderTextField.text = ""
  306. calcBy = "p"
  307. reciepientTextField.text = Utility.getCommaSeperatedString(numberString: reciepientTextField.text!)
  308. default:
  309. break
  310. }
  311. }
  312. private func calculate() {
  313. let senderAmount = senderTextField.text!
  314. let reciepientAmount = reciepientTextField.text!
  315. calculateExchangeRate(senderAmount: senderAmount, reciepientAmount: reciepientAmount, calcBy: calcBy)
  316. }
  317. private func goToCDDI() {
  318. exchangeRateModel?.calcBy = calcBy
  319. exchangeRateModel?.reciepientCurrency = selectedCurrencyViewModel?.currency ?? ""
  320. exchangeRateModel?.autodebitSendingAmount = getPlainNumbers(number: senderTextField.text!)
  321. actionDelegate?.calculated(model: exchangeRateModel)
  322. actionDelegate?.continueToCDDI()
  323. }
  324. private func getPlainNumbers(number: String) -> String {
  325. return number.stringRemovingComma()
  326. }
  327. private func calculateExchangeRate(senderAmount: String, reciepientAmount: String, calcBy: String) {
  328. let senderAmount = senderAmount.stringRemovingComma() // send sAmt amount
  329. let senderCurrency = "JPY"
  330. let senderCountryId = "142"
  331. let reciepientAmount = reciepientAmount.stringRemovingComma()
  332. let recipientCurrency = selectedCurrencyViewModel?.currency
  333. let reciepientCountryName = reciepient?.country
  334. let reciepientCountryId = reciepient?.countryID
  335. let paymentMethod = "wallet"
  336. let paymentMethodId = requestModel?.paymemtMode?.id
  337. let payoutPartner = requestModel?.paymemtMode?.payoutPartner
  338. let myUsername = Utility.getMyUserName()
  339. let bankId = requestModel?.bank?.id //bank id if selected bank
  340. calculate(
  341. senderAmt: senderAmount,
  342. senderCurrency: senderCurrency,
  343. recieverAmt: reciepientAmount,
  344. recieverCurrency: recipientCurrency,
  345. recieverCountryName: reciepientCountryName,
  346. recieverCountryId: reciepientCountryId,
  347. paymentMethod: paymentMethod,
  348. paymentMethodId: paymentMethodId,
  349. calcBy: calcBy,
  350. senderCountryId: senderCountryId,
  351. payoutPartner: payoutPartner,
  352. userId: myUsername,
  353. bankId: bankId
  354. )
  355. }
  356. }
  357. // MARK: SendMoneyExchangeRateViewInterface
  358. extension SendMoneyExchangeRateViewController: SendMoneyExchangeRateViewInterface {
  359. func show(model: SendMoneyExchangeRateModel) {
  360. exchangeRateModel = model
  361. }
  362. func show(error: String) {
  363. showExchangeRateInfomation(isHidden: false)
  364. alert(type: .error, message: error)
  365. }
  366. func showLoading() {
  367. hudDelegate?.showLoading()
  368. }
  369. func hideLoading() {
  370. hudDelegate?.hideLoading()
  371. }
  372. func setError(with error: Error) {
  373. alert(message: error.localizedDescription)
  374. }
  375. }
  376. extension SendMoneyExchangeRateViewController {
  377. override func didMove(toParent parent: UIViewController?) {
  378. self.viewWillAppear(true)
  379. if senderTextField.text != "" || reciepientTextField.text != "" {
  380. calculate()
  381. }
  382. }
  383. }
  384. // MARK: - UITextFieldDelegate
  385. extension SendMoneyExchangeRateViewController: UITextFieldDelegate {
  386. func textFieldDidEndEditing(_ textField: UITextField) {
  387. switch textField {
  388. case senderTextField, reciepientTextField:
  389. if senderTextField.text != "" || reciepientTextField.text != "" {
  390. calculate()
  391. }
  392. default:
  393. break
  394. }
  395. }
  396. }
  397. // MARK: - TablePresenterDelegate
  398. extension SendMoneyExchangeRateViewController: TablePresenterDelegate {
  399. func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration {
  400. return TablePresenterConfiguration(
  401. presenterTitle: "search_currency_text".localized(),
  402. closeButtonTitle: "cancel_text".localized(),
  403. notFoundTitle: "no_result_found_text".localized(),
  404. searchBarPlaceHolder: "search_currency_text".localized()
  405. )
  406. }
  407. func tablePresenterView(
  408. _ viewController: TablePresenterViewController,
  409. didSelectModel model: TablePresenterProtocol?
  410. ) {
  411. selectedCurrencyViewModel =
  412. (model as? SendMoneyExchangeRateCurrencyViewModel) ?? selectedCurrencyViewModel
  413. calcBy.lowercased() == "c" ? (reciepientTextField.text = "") : (senderTextField.text = "")
  414. }
  415. }