// // ExchangeRateViewController.swift // GMERemittance // // Created by FMI-12 on 2/1/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class ExchangeRateViewController: UIViewController { @IBOutlet weak var textFieldKorea: UITextField! @IBOutlet weak var textFieldOtherCountries: UITextField! @IBOutlet weak var toUnitLabel: UILabel! @IBOutlet weak var fromKoreaLabelOutlet: UILabel! @IBOutlet weak var toOtherLabelOutlet: UILabel! @IBOutlet weak var sendMoneyButtonOutlet: UIButton! @IBOutlet weak var flagImageOutlet: UIImageView! private var exchangerateviewmodel = ExchangeRateViewModel() private var exchangeRateDataObject = ExchangeRateData() @IBOutlet weak var viewContainWithKoreanCurrency: UIView! @IBOutlet weak var viewContainWithOtherCountryCurrency: UIView! private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() public var exchangeRateData: [String:Any]? var transferLimit: Double? override func viewDidLoad() { super.viewDidLoad() setUpNavBar(id: 201, title: "Today's Rate") setUpAnotherLoginListener(genericviewmodel: exchangerateviewmodel) setExchangeRateUIValues() textFieldKorea.attributedPlaceholder = NSAttributedString(string: "0", attributes: [NSAttributedStringKey.foregroundColor: UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0)]) textFieldOtherCountries.attributedPlaceholder = NSAttributedString(string: "0", attributes: [NSAttributedStringKey.foregroundColor: UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0)]) /** tap */ let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapKoreanCurrencyView)) tap.delegate = self as? UIGestureRecognizerDelegate viewContainWithKoreanCurrency.addGestureRecognizer(tap) let tapOtherView = UITapGestureRecognizer(target: self, action: #selector(handleTapOtherCountryCurrencyView)) tap.delegate = self as? UIGestureRecognizerDelegate viewContainWithOtherCountryCurrency.addGestureRecognizer(tapOtherView) exchangerateviewmodel.exchangeRateConnectionTimeOut.value = nil /** connection timeout */ exchangerateviewmodel.exchangeRateConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() self.popUpMessage(value: 20) } /** Check internet connection */ exchangerateviewmodel.internetConnection.value = nil exchangerateviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() self.popUpMessage(value: 15) } /** Request an api to calculate conversion amount. */ exchangerateviewmodel.exchangeRateAvailable.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() guard $0! else { self.popUpMessageError(value: 10, message: (self.exchangerateviewmodel.getErrorMessage())) return } self.stopLoading() self.setExchangeRateDataObject() } } /** Handle tap action in view */ @objc func handleTapKoreanCurrencyView(){ textFieldKorea.becomeFirstResponder() } /** Handle tap action in view */ @objc func handleTapOtherCountryCurrencyView(){ textFieldOtherCountries.becomeFirstResponder() } /** Get conversion unit amount. */ func setExchangeRateDataObject(){ self.exchangeRateDataObject = exchangerateviewmodel.getExchangeRateData() setExchangeRateUIValuesFromApi() } /** Updated UI with conversion amount. */ func setExchangeRateUIValuesFromApi(){ textFieldOtherCountries.text = "\(self.exchangeRateDataObject.pAmt!) " textFieldKorea.text = "\(self.exchangeRateDataObject.cAmt!)" if let currentRate = self.exchangeRateDataObject.currentRate,let unit = self.exchangeRateData!["currencyUnit"] { toOtherLabelOutlet.text = "\(currentRate ) \(unit as! String)" } } /** Set 1KRW unit conversion value as per country selected */ func setExchangeRateUIValues(){ if let amount = self.exchangeRateData!["toAmountAndUnit"], let unit = self.exchangeRateData!["currencyUnit"] { toOtherLabelOutlet.text = "\(amount as! String) \(unit as! String)" toUnitLabel.text = unit as? String } if let url: String = self.exchangeRateData!["flagUrl"]! as? String{ self.downloadImage(url: Foundation.URL(string:url)!) } } /** - parameter exchangeType: exchangeType is Korea or other countries (if korea calcBy = "C" else "P") - parameter amount: amount type by user - returns: dictionary object for api reqeust as a parameter */ func exchangeRateBody(exchangeType: String,amount:String) -> [String:Any]{ var exchangedata = [String:Any]() if exchangeType == "Korea"{ exchangedata = ["from":"KRW", "to":self.exchangeRateData!["currencyUnit"] as! String, "calcBy":"C", "cAmt":amount, "payoutmethodId":self.exchangeRateData!["payoutmethodId"] as! String , "countryId":self.exchangeRateData!["countryId"] as! String , "sendMoney": false ] }else if exchangeType == "Other" { exchangedata = ["from":"KRW", "to":self.exchangeRateData!["currencyUnit"] as! String, "calcBy":"P", "pAmt":amount, "payoutmethodId":self.exchangeRateData!["payoutmethodId"] as! String , "countryId":self.exchangeRateData!["countryId"] as! String , "sendMoney": false ] } return exchangedata } /** Disable user interaction while fetching data from api */ func startLoading(){ self.showActivityIndicator(activityIndicator: self.activityIndicator) self.disableUserInteractions() } /** Enable user interaction while fetching data from api */ func stopLoading(){ self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() } func addDoneButtonOnKeyboard(textField: UITextField) { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) var done = UIBarButtonItem() var cancel = UIBarButtonItem() if textField == textFieldKorea{ done = UIBarButtonItem(title: "Calculate", style: .done, target: self, action: #selector(self.doneButtonActionKorea)) cancel = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelButtonActionKorea)) cancel.tintColor = UIColor.black }else{ done = UIBarButtonItem(title: "Calculate", style: .done, target: self, action: #selector(self.doneButtonActionOther)) cancel = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelButtonActionOther)) cancel.tintColor = UIColor.black } done.tintColor = UIColor(hex: 0xED1C24) let items = [cancel,flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() self.textFieldKorea.inputAccessoryView = doneToolbar self.textFieldOtherCountries.inputAccessoryView = doneToolbar } @objc func cancelButtonActionKorea(){ self.textFieldKorea.text = "0" self.textFieldKorea.resignFirstResponder() } @objc func cancelButtonActionOther(){ self.textFieldOtherCountries.text = "0" self.textFieldOtherCountries.resignFirstResponder() } /** When user want to calculater other currency from Korean currency */ @objc func doneButtonActionKorea(){ textFieldKorea.resignFirstResponder() if (textFieldKorea.text != "0" && textFieldKorea.text != ""){ self.startLoading() exchangerateviewmodel.fetchExchangeRate(exchangeData: exchangeRateBody(exchangeType: "Korea", amount: textFieldKorea.text!)) } } /** When user want to calculater Korean currency from Other currency */ @objc func doneButtonActionOther(){ textFieldOtherCountries.resignFirstResponder() if (textFieldOtherCountries.text != "0" && textFieldOtherCountries.text != ""){ self.startLoading() exchangerateviewmodel.fetchExchangeRate(exchangeData: exchangeRateBody(exchangeType: "Other", amount: textFieldOtherCountries.text!)) } } func getDataFromUrl(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) { URLSession.shared.dataTask(with: url) { data, response, error in completion(data, response, error) }.resume() } /** - parameter url: set image url into imageview */ func downloadImage(url: URL) { getDataFromUrl(url: url) { data, response, error in guard let data = data, error == nil else { return } DispatchQueue.main.async() { self.flagImageOutlet.image = UIImage(data: data) } } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } /** Redirect to RecipientListViewController */ @IBAction func sendMoney(_ sender: Any) { if (UserDefaults.standard.object(forKey: "com.gmeremit.isVerified") as! Bool) { let storyboard = UIStoryboard.init(name: "RecipientListViewController", bundle: Bundle.main) let vController = storyboard.instantiateViewController(withIdentifier: "RecipientListViewController") as! RecipientListViewController self.navigationController!.pushViewController(vController, animated: true) } else { popUpMessage(value: 13) } } } extension ExchangeRateViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { self.sendMoneyButtonOutlet.isHidden = true if textField == textFieldKorea{ self.addDoneButtonOnKeyboard(textField: textFieldKorea) }else if textField == textFieldOtherCountries{ self.addDoneButtonOnKeyboard(textField: textFieldOtherCountries) } } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { self.sendMoneyButtonOutlet.isHidden = true if textField == textFieldKorea{ textFieldOtherCountries.text = "" }else{ textFieldKorea.text = "" } let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string) let currentText = textField.text ?? "" guard let stringRange = Range(range, in: currentText) else { return false } let updatedText = currentText.replacingCharacters(in: stringRange, with: string) if updatedText.count != 0 { if textField == textFieldKorea { if inputText.isDouble() { if let transferAmount = transferLimit { if Double(inputText)! <= transferAmount{ return true } else { return false } } } } else { if inputText.isDouble() { if Double(inputText)! <= 999999999999999.00 { return true } else { return false } } } } return true } func textFieldDidEndEditing(_ textField: UITextField) { self.sendMoneyButtonOutlet.isHidden = false } }