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.

351 lines
13 KiB

6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // ExchangeRateViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by FMI-12 on 2/1/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. class ExchangeRateViewController: UIViewController {
  10. @IBOutlet weak var textFieldKorea: UITextField!
  11. @IBOutlet weak var textFieldOtherCountries: UITextField!
  12. @IBOutlet weak var toUnitLabel: UILabel!
  13. @IBOutlet weak var fromKoreaLabelOutlet: UILabel!
  14. @IBOutlet weak var toOtherLabelOutlet: UILabel!
  15. @IBOutlet weak var sendMoneyButtonOutlet: UIButton!
  16. @IBOutlet weak var flagImageOutlet: UIImageView!
  17. private var exchangerateviewmodel = ExchangeRateViewModel()
  18. private var exchangeRateDataObject = ExchangeRateData()
  19. @IBOutlet weak var viewContainWithKoreanCurrency: UIView!
  20. @IBOutlet weak var viewContainWithOtherCountryCurrency: UIView!
  21. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  22. public var exchangeRateData: [String:Any]?
  23. var transferLimit: Double?
  24. override func viewDidLoad() {
  25. super.viewDidLoad()
  26. setUpNavBar(id: 201, title: "Today's Rate")
  27. setUpAnotherLoginListener(genericviewmodel: exchangerateviewmodel)
  28. setExchangeRateUIValues()
  29. textFieldKorea.attributedPlaceholder = NSAttributedString(string: "0",
  30. attributes: [NSAttributedStringKey.foregroundColor: UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0)])
  31. textFieldOtherCountries.attributedPlaceholder = NSAttributedString(string: "0",
  32. attributes: [NSAttributedStringKey.foregroundColor: UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0)])
  33. /**
  34. tap
  35. */
  36. let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapKoreanCurrencyView))
  37. tap.delegate = self as? UIGestureRecognizerDelegate
  38. viewContainWithKoreanCurrency.addGestureRecognizer(tap)
  39. let tapOtherView = UITapGestureRecognizer(target: self, action: #selector(handleTapOtherCountryCurrencyView))
  40. tap.delegate = self as? UIGestureRecognizerDelegate
  41. viewContainWithOtherCountryCurrency.addGestureRecognizer(tapOtherView)
  42. exchangerateviewmodel.exchangeRateConnectionTimeOut.value = nil
  43. /**
  44. connection timeout
  45. */
  46. exchangerateviewmodel.exchangeRateConnectionTimeOut.bind { [unowned self] in
  47. guard $0 != nil else {
  48. return
  49. }
  50. self.stopLoading()
  51. self.popUpMessage(value: 20)
  52. }
  53. /**
  54. Check internet connection
  55. */
  56. exchangerateviewmodel.internetConnection.value = nil
  57. exchangerateviewmodel.internetConnection.bind { [unowned self] in
  58. guard $0 != nil else {
  59. return
  60. }
  61. self.stopLoading()
  62. self.popUpMessage(value: 15)
  63. }
  64. /**
  65. Request an api to calculate conversion amount.
  66. */
  67. exchangerateviewmodel.exchangeRateAvailable.bind { [unowned self] in
  68. guard $0 != nil else {
  69. return
  70. }
  71. self.stopLoading()
  72. guard $0! else {
  73. self.popUpMessageError(value: 10, message: (self.exchangerateviewmodel.getErrorMessage()))
  74. return
  75. }
  76. self.stopLoading()
  77. self.setExchangeRateDataObject()
  78. }
  79. }
  80. /**
  81. Handle tap action in view
  82. */
  83. @objc func handleTapKoreanCurrencyView(){
  84. textFieldKorea.becomeFirstResponder()
  85. }
  86. /**
  87. Handle tap action in view
  88. */
  89. @objc func handleTapOtherCountryCurrencyView(){
  90. textFieldOtherCountries.becomeFirstResponder()
  91. }
  92. /**
  93. Get conversion unit amount.
  94. */
  95. func setExchangeRateDataObject(){
  96. self.exchangeRateDataObject = exchangerateviewmodel.getExchangeRateData()
  97. setExchangeRateUIValuesFromApi()
  98. }
  99. /**
  100. Updated UI with conversion amount.
  101. */
  102. func setExchangeRateUIValuesFromApi(){
  103. textFieldOtherCountries.text = "\(self.exchangeRateDataObject.pAmt!) "
  104. textFieldKorea.text = "\(self.exchangeRateDataObject.cAmt!)"
  105. if let currentRate = self.exchangeRateDataObject.currentRate,let unit = self.exchangeRateData!["currencyUnit"] {
  106. toOtherLabelOutlet.text = "\(currentRate ) \(unit as! String)"
  107. }
  108. }
  109. /**
  110. Set 1KRW unit conversion value as per country selected
  111. */
  112. func setExchangeRateUIValues(){
  113. if let amount = self.exchangeRateData!["toAmountAndUnit"],
  114. let unit = self.exchangeRateData!["currencyUnit"] {
  115. toOtherLabelOutlet.text = "\(amount as! String) \(unit as! String)"
  116. toUnitLabel.text = unit as? String
  117. }
  118. if let url: String = self.exchangeRateData!["flagUrl"]! as? String{
  119. self.downloadImage(url: Foundation.URL(string:url)!)
  120. }
  121. }
  122. /**
  123. - parameter exchangeType: exchangeType is Korea or other countries (if korea calcBy = "C" else "P")
  124. - parameter amount: amount type by user
  125. - returns: dictionary object for api reqeust as a parameter
  126. */
  127. func exchangeRateBody(exchangeType: String,amount:String) -> [String:Any]{
  128. var exchangedata = [String:Any]()
  129. if exchangeType == "Korea"{
  130. exchangedata = ["from":"KRW",
  131. "to":self.exchangeRateData!["currencyUnit"] as! String,
  132. "calcBy":"C",
  133. "cAmt":amount,
  134. "payoutmethodId":self.exchangeRateData!["payoutmethodId"] as! String ,
  135. "countryId":self.exchangeRateData!["countryId"] as! String ,
  136. "sendMoney": false
  137. ]
  138. }else if exchangeType == "Other"
  139. {
  140. exchangedata = ["from":"KRW",
  141. "to":self.exchangeRateData!["currencyUnit"] as! String,
  142. "calcBy":"P",
  143. "pAmt":amount,
  144. "payoutmethodId":self.exchangeRateData!["payoutmethodId"] as! String ,
  145. "countryId":self.exchangeRateData!["countryId"] as! String ,
  146. "sendMoney": false
  147. ]
  148. }
  149. return exchangedata
  150. }
  151. /**
  152. Disable user interaction while fetching data from api
  153. */
  154. func startLoading(){
  155. self.showActivityIndicator(activityIndicator: self.activityIndicator)
  156. self.disableUserInteractions()
  157. }
  158. /**
  159. Enable user interaction while fetching data from api
  160. */
  161. func stopLoading(){
  162. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  163. self.enableUserInteractions()
  164. }
  165. func addDoneButtonOnKeyboard(textField: UITextField)
  166. {
  167. let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
  168. doneToolbar.barStyle = .default
  169. let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
  170. var done = UIBarButtonItem()
  171. var cancel = UIBarButtonItem()
  172. if textField == textFieldKorea{
  173. done = UIBarButtonItem(title: "Calculate", style: .done, target: self, action: #selector(self.doneButtonActionKorea))
  174. cancel = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelButtonActionKorea))
  175. cancel.tintColor = UIColor.black
  176. }else{
  177. done = UIBarButtonItem(title: "Calculate", style: .done, target: self, action: #selector(self.doneButtonActionOther))
  178. cancel = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelButtonActionOther))
  179. cancel.tintColor = UIColor.black
  180. }
  181. done.tintColor = UIColor(hex: 0xED1C24)
  182. let items = [cancel,flexSpace, done]
  183. doneToolbar.items = items
  184. doneToolbar.sizeToFit()
  185. self.textFieldKorea.inputAccessoryView = doneToolbar
  186. self.textFieldOtherCountries.inputAccessoryView = doneToolbar
  187. }
  188. @objc func cancelButtonActionKorea(){
  189. self.textFieldKorea.text = "0"
  190. self.textFieldKorea.resignFirstResponder()
  191. }
  192. @objc func cancelButtonActionOther(){
  193. self.textFieldOtherCountries.text = "0"
  194. self.textFieldOtherCountries.resignFirstResponder()
  195. }
  196. /**
  197. When user want to calculater other currency from Korean currency
  198. */
  199. @objc func doneButtonActionKorea(){
  200. textFieldKorea.resignFirstResponder()
  201. if (textFieldKorea.text != "0" && textFieldKorea.text != ""){
  202. self.startLoading()
  203. exchangerateviewmodel.fetchExchangeRate(exchangeData: exchangeRateBody(exchangeType: "Korea", amount: textFieldKorea.text!))
  204. }
  205. }
  206. /**
  207. When user want to calculater Korean currency from Other currency
  208. */
  209. @objc func doneButtonActionOther(){
  210. textFieldOtherCountries.resignFirstResponder()
  211. if (textFieldOtherCountries.text != "0" && textFieldOtherCountries.text != ""){
  212. self.startLoading()
  213. exchangerateviewmodel.fetchExchangeRate(exchangeData: exchangeRateBody(exchangeType: "Other", amount: textFieldOtherCountries.text!))
  214. }
  215. }
  216. func getDataFromUrl(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
  217. URLSession.shared.dataTask(with: url) { data, response, error in
  218. completion(data, response, error)
  219. }.resume()
  220. }
  221. /**
  222. - parameter url: set image url into imageview
  223. */
  224. func downloadImage(url: URL) {
  225. getDataFromUrl(url: url) { data, response, error in
  226. guard let data = data, error == nil else { return }
  227. DispatchQueue.main.async() {
  228. self.flagImageOutlet.image = UIImage(data: data)
  229. }
  230. }
  231. }
  232. override func didReceiveMemoryWarning() {
  233. super.didReceiveMemoryWarning()
  234. }
  235. /**
  236. Redirect to RecipientListViewController
  237. */
  238. @IBAction func sendMoney(_ sender: Any) {
  239. if (UserDefaults.standard.object(forKey: "com.gmeremit.isVerified") as! Bool) {
  240. let storyboard = UIStoryboard.init(name: "RecipientListViewController", bundle: Bundle.main)
  241. let vController = storyboard.instantiateViewController(withIdentifier: "RecipientListViewController") as! RecipientListViewController
  242. self.navigationController!.pushViewController(vController, animated: true)
  243. } else {
  244. popUpMessage(value: 13)
  245. }
  246. }
  247. }
  248. extension ExchangeRateViewController: UITextFieldDelegate {
  249. func textFieldDidBeginEditing(_ textField: UITextField) {
  250. self.sendMoneyButtonOutlet.isHidden = true
  251. if textField == textFieldKorea{
  252. self.addDoneButtonOnKeyboard(textField: textFieldKorea)
  253. }else if textField == textFieldOtherCountries{
  254. self.addDoneButtonOnKeyboard(textField: textFieldOtherCountries)
  255. }
  256. }
  257. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  258. self.sendMoneyButtonOutlet.isHidden = true
  259. if textField == textFieldKorea{
  260. textFieldOtherCountries.text = ""
  261. }else{
  262. textFieldKorea.text = ""
  263. }
  264. let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
  265. let currentText = textField.text ?? ""
  266. guard let stringRange = Range(range, in: currentText) else { return false }
  267. let updatedText = currentText.replacingCharacters(in: stringRange, with: string)
  268. if updatedText.count != 0 {
  269. if textField == textFieldKorea {
  270. if inputText.isDouble() {
  271. if let transferAmount = transferLimit {
  272. if Double(inputText)! <= transferAmount{
  273. return true
  274. } else {
  275. return false
  276. }
  277. }
  278. }
  279. } else {
  280. if inputText.isDouble() {
  281. if Double(inputText)! <= 999999999999999.00 {
  282. return true
  283. } else {
  284. return false
  285. }
  286. }
  287. }
  288. }
  289. return true
  290. }
  291. func textFieldDidEndEditing(_ textField: UITextField) {
  292. self.sendMoneyButtonOutlet.isHidden = false
  293. }
  294. }