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.
344 lines
13 KiB
344 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
|
|
}
|
|
}
|
|
|
|
|