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

//
// 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
}
}