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
498 lines
17 KiB
//
|
|
// SendMoneyExchangeRateViewController.swift
|
|
// GMERemittance
|
|
//
|
|
// Created by gme_2 on 28/08/2018.
|
|
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import Hero
|
|
|
|
class SendMoneyExchangeRateCurrencyViewModel {
|
|
var countryCode: String?
|
|
var currency: String?
|
|
}
|
|
|
|
extension SendMoneyExchangeRateCurrencyViewModel: TablePresenterProtocol {
|
|
var cellTitle: String? {
|
|
return currency
|
|
}
|
|
|
|
var cellImage: UIImage? {
|
|
return CountryInfo().getFlag(for: countryCode ?? "")
|
|
}
|
|
}
|
|
|
|
enum ActionBehaviour {
|
|
case calculate
|
|
case `continue`
|
|
}
|
|
|
|
class SendMoneyExchangeRateViewController: UIViewController {
|
|
|
|
private enum DiscountType: String {
|
|
case percent = "1"
|
|
case value = "2"
|
|
}
|
|
|
|
// MARK: IBOutlets
|
|
|
|
@IBOutlet private weak var exchangeBackground1: UIView!
|
|
@IBOutlet private weak var exchangeBackground2: UIView!
|
|
@IBOutlet private weak var dropDownImageView: UIImageView!
|
|
@IBOutlet private weak var backgroundViewCountryLabel1: UIView!
|
|
@IBOutlet private weak var backgroundViewCountryLabel2: UIView!
|
|
@IBOutlet private weak var countryListStackView: UIStackView!
|
|
@IBOutlet private weak var countryCodeLabel: UILabel!
|
|
@IBOutlet private weak var countryFlagImage: UIImageView!
|
|
@IBOutlet private weak var continueButton: UIButton!
|
|
@IBOutlet private weak var senderTextField: GMENumberTextField!
|
|
@IBOutlet private weak var reciepientTextField: GMENumberTextField!
|
|
@IBOutlet private weak var transferFeeInfoLabel: UILabel!
|
|
|
|
@IBOutlet private weak var exchangeRateLabel: UILabel!
|
|
@IBOutlet private weak var youSendTitleLabel: UILabel!
|
|
@IBOutlet private weak var recipientGetsTitleLabel: UILabel!
|
|
|
|
@IBOutlet weak var calculatedInfoView: UIView!
|
|
@IBOutlet weak var serviceChargeView: UIStackView!
|
|
@IBOutlet weak var exchangeRateView: UIStackView!
|
|
@IBOutlet weak var backgroundView: UIView!{
|
|
didSet{
|
|
backgroundView.layer.cornerRadius = 12
|
|
backgroundView.layer.borderWidth = 0.2
|
|
backgroundView.layer.borderColor = UIColor.themeSeparate.cgColor
|
|
backgroundView.layer.addShadow(with: UIColor.themeShadow)
|
|
}
|
|
}
|
|
|
|
@IBOutlet weak var couponListFetch: UIView!
|
|
@IBOutlet weak var couponListShow: UIStackView!
|
|
|
|
// MARK: Properties
|
|
var presenter: SendMoneyExchangeRateModuleInterface?
|
|
var requestModel: SendMoneyRequestModel?
|
|
weak var actionDelegate: SendMoneyExchangeRateActionDelegate?
|
|
var reciepient: Recipient?
|
|
|
|
private lazy var countryListTapGuesture: UITapGestureRecognizer = UITapGestureRecognizer()
|
|
private lazy var couponListTapGesture: UITapGestureRecognizer = UITapGestureRecognizer()
|
|
|
|
private var plainSendingAmount: String?
|
|
|
|
private var action: ActionBehaviour? {
|
|
didSet {
|
|
if let action = self.action {
|
|
switch action {
|
|
case .calculate:
|
|
continueButton.setTitle("calculate_text".localized(), for: .normal)
|
|
case .continue:
|
|
continueButton.setTitle("continue_text".localized(), for: .normal)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private var transferFeeCharge: ExchangeRateModel?
|
|
|
|
private var currencyInfoViewModel: [SendMoneyExchangeRateCurrencyViewModel]? {
|
|
didSet {
|
|
var selCountry = SendMoneyExchangeRateCurrencyViewModel()
|
|
selCountry.currency = self.reciepient?.agent?.currency?.first ?? ""
|
|
selectedCurrencyViewModel = selCountry//currencyInfoViewModel?.first
|
|
}
|
|
}
|
|
|
|
private var exchangeRateModel: SendMoneyExchangeRateModel? {
|
|
didSet {
|
|
guard let model = exchangeRateModel else {
|
|
self.showExchangeRateInfomation(isHidden: false)
|
|
return
|
|
}
|
|
|
|
reciepientTextField.text = Utility.getCommaSeperatedStringWithDecimal(
|
|
numberString: model.recipientAmount ?? ""
|
|
|
|
)
|
|
|
|
senderTextField.text = Utility.getCommaSeperatedStringWithDecimal(
|
|
numberString: model.senderAmount ?? ""
|
|
)
|
|
|
|
let serviceCharge = model.transferFee?.likeCommaMoney() ??
|
|
model.transferFee ??
|
|
"0.00"
|
|
|
|
let transferFee = serviceCharge != "0.00" ? "-\(serviceCharge)" : "\(serviceCharge)"
|
|
|
|
transferFeeInfoLabel.text = "\(transferFee)\n(\("transfer_fee_included_text".localized()))"
|
|
exchangeRateLabel.text =
|
|
"\(model.exchangeRate ?? "")\n(\("current_exchange_rate_text".localized()))"
|
|
|
|
self.showExchangeRateInfomation(isHidden: false)
|
|
|
|
action = .continue
|
|
}
|
|
}
|
|
|
|
private var calcBy = ""
|
|
private var isFirst = true
|
|
private var currencies: [String]? {
|
|
didSet {
|
|
let models: [SendMoneyExchangeRateCurrencyViewModel] =
|
|
(currencies ?? []).map {[weak self] in
|
|
guard let `self` = self else {
|
|
return SendMoneyExchangeRateCurrencyViewModel()
|
|
}
|
|
|
|
let viewmodel = SendMoneyExchangeRateCurrencyViewModel()
|
|
viewmodel.countryCode = self.reciepient?.countryCode ?? ""
|
|
viewmodel.currency = $0
|
|
return viewmodel
|
|
}
|
|
currencyInfoViewModel = models
|
|
}
|
|
}
|
|
|
|
var selectedCurrencyViewModel: SendMoneyExchangeRateCurrencyViewModel? {
|
|
didSet {
|
|
setCurrencyLabel(currency: selectedCurrencyViewModel?.currency ?? "")
|
|
action = .calculate
|
|
}
|
|
}
|
|
|
|
weak var hudDelegate: HUDStatusDelegate?
|
|
|
|
// MARK: VC's Life cycle
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
setup()
|
|
}
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
configureViews()
|
|
action = ActionBehaviour.calculate
|
|
|
|
senderTextField.receiverNativeCountry = reciepient?.countryCode ?? ""
|
|
reciepientTextField.receiverNativeCountry = reciepient?.countryCode ?? ""
|
|
|
|
}
|
|
|
|
override func viewDidAppear(_ animated: Bool) {
|
|
super.viewDidAppear(animated)
|
|
|
|
if isFirst {
|
|
self.senderTextField.becomeFirstResponder()
|
|
self.isFirst = false
|
|
}
|
|
}
|
|
|
|
override func viewWillDisappear(_ animated: Bool) {
|
|
super.viewWillDisappear(animated)
|
|
view.endEditing(true)
|
|
}
|
|
|
|
// MARK: IBActions
|
|
@IBAction private func continueButton(_ sender: UIButton) {
|
|
view.endEditing(true)
|
|
if let action = self.action {
|
|
switch action {
|
|
case .calculate:
|
|
calculate()
|
|
case .continue:
|
|
goToCDDI()
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: Other Functions
|
|
private func setup() {
|
|
// all setup should be done here
|
|
backgroundViewCountryLabel2.hero.id = reciepient?.receiverID
|
|
backgroundViewCountryLabel2.hero.modifiers = [.translate()]
|
|
|
|
setupTargets()
|
|
action = .calculate
|
|
senderTextField.delegate = self
|
|
reciepientTextField.delegate = self
|
|
|
|
calcBy = "c"
|
|
[backgroundViewCountryLabel1, backgroundViewCountryLabel2].forEach { $0?.layer.cornerRadius = 5 }
|
|
[exchangeBackground1, exchangeBackground2].forEach {
|
|
$0?.layer.borderWidth = 1
|
|
$0?.layer.borderColor = UIColor.themeSeparate.cgColor
|
|
// UIColor.init(hex: "#E0E0E0").cgColor
|
|
$0?.layer.cornerRadius = 5
|
|
}
|
|
|
|
configureLanguage()
|
|
|
|
continueButton.layer.cornerRadius = 5
|
|
continueButton.backgroundColor = .themeRed
|
|
continueButton.titleLabel?.font = .sanfrancisco(.medium, size: 18)
|
|
|
|
senderTextField.textColor = .black
|
|
reciepientTextField.textColor = .black
|
|
backgroundViewCountryLabel1.backgroundColor = .themeRed
|
|
backgroundViewCountryLabel2.backgroundColor = .themeRed
|
|
}
|
|
|
|
private func showExchangeRateInfomation(isHidden flag: Bool) {
|
|
calculatedInfoView.isHidden = flag
|
|
calculatedInfoView.alpha = flag ? 0.0 : 1.0
|
|
|
|
if !flag {
|
|
self.serviceChargeView.isHidden = false
|
|
self.exchangeRateView.isHidden = false
|
|
|
|
let animator = UIViewPropertyAnimator(duration: 0.3, curve: .easeIn) {
|
|
self.serviceChargeView.alpha = 1.0
|
|
}
|
|
animator.addCompletion { _ in
|
|
let subAnimator = UIViewPropertyAnimator(duration: 0.3, curve: .easeIn) {
|
|
self.exchangeRateView.alpha = 1.0
|
|
}
|
|
subAnimator.startAnimation()
|
|
}
|
|
animator.startAnimation()
|
|
|
|
} else {
|
|
serviceChargeView.isHidden = true
|
|
serviceChargeView.alpha = 0.0
|
|
|
|
exchangeRateView.isHidden = true
|
|
exchangeRateView.alpha = 0.0
|
|
}
|
|
|
|
}
|
|
|
|
|
|
private func configureLanguage() {
|
|
youSendTitleLabel.text = "you_send_text".localized()
|
|
recipientGetsTitleLabel.text = "receipient_gets_text".localized()
|
|
continueButton.setTitle("calculate_text".localized(), for: .normal)
|
|
}
|
|
|
|
private func setCountryFlag(countryCode: String) {
|
|
let countryEnum = CountryEnum(rawValue: countryCode.lowercased())
|
|
countryFlagImage.image = countryEnum?.flag
|
|
}
|
|
|
|
private func setCurrencyLabel(currency: String) {
|
|
countryCodeLabel.text = currency.uppercased()
|
|
}
|
|
|
|
private func setupTargets() {
|
|
let tapGuesture = UITapGestureRecognizer(target: self, action: #selector(showCountryList(_:)))
|
|
countryListTapGuesture = tapGuesture
|
|
countryListStackView.addGestureRecognizer(countryListTapGuesture)
|
|
|
|
|
|
reciepientTextField.addTarget(
|
|
self,
|
|
action: #selector(textChanged(sender:)),
|
|
for: UIControl.Event.editingChanged
|
|
)
|
|
senderTextField.addTarget(
|
|
self,
|
|
action: #selector(textChanged(sender:)),
|
|
for: UIControl.Event.editingChanged
|
|
)
|
|
}
|
|
|
|
@objc private func showCountryList(_ sender: UITapGestureRecognizer) {
|
|
TablePresenterWireframe().openWith(
|
|
delegate: self,
|
|
model: currencyInfoViewModel,
|
|
source: self
|
|
)
|
|
}
|
|
|
|
private func configureViews() {
|
|
exchangeRateModel = nil
|
|
|
|
let dropDownImage = UIImage(named: "dropdown_grey")
|
|
let image = dropDownImage
|
|
|
|
dropDownImageView.image = image
|
|
setCountryFlag(countryCode: reciepient?.countryCode ?? "")
|
|
let deliveryMethod = requestModel?.paymemtMode
|
|
if (deliveryMethod?.bankRequired ?? "false").lowercased() == "true" {
|
|
currencies = requestModel?.bank?.payCurrency ?? []
|
|
|
|
} else {
|
|
currencies = deliveryMethod?.payCurrency ?? []
|
|
}
|
|
}
|
|
|
|
private func calculate(
|
|
senderAmt: String?,
|
|
senderCurrency: String?,
|
|
recieverAmt: String?,
|
|
recieverCurrency: String?,
|
|
recieverCountryName: String?,
|
|
recieverCountryId: String?,
|
|
paymentMethod: String?,
|
|
paymentMethodId: String?,
|
|
calcBy: String?,
|
|
senderCountryId: String?,
|
|
payoutPartner: String?,
|
|
userId: String?,
|
|
bankId: String?
|
|
) {
|
|
presenter?.calculate(
|
|
senderAmt: senderAmt,
|
|
senderCurrency: senderCurrency,
|
|
recieverAmt: recieverAmt,
|
|
recieverCurrency: recieverCurrency,
|
|
recieverCountryName: recieverCountryName,
|
|
recieverCountryId: recieverCountryId,
|
|
paymentMethod: paymentMethod,
|
|
paymentMethodId: paymentMethodId,
|
|
calcBy: calcBy,
|
|
senderCountryId: senderCountryId,
|
|
payoutPartner: payoutPartner,
|
|
userId: userId,
|
|
bankId: bankId
|
|
)
|
|
}
|
|
|
|
@objc private func textChanged(sender: UITextField) {
|
|
action = .calculate
|
|
switch sender {
|
|
case senderTextField:
|
|
reciepientTextField.text = ""
|
|
calcBy = "c"
|
|
senderTextField.text = Utility.getCommaSeperatedString(numberString: senderTextField.text!)
|
|
|
|
case reciepientTextField:
|
|
senderTextField.text = ""
|
|
calcBy = "p"
|
|
reciepientTextField.text = Utility.getCommaSeperatedString(numberString: reciepientTextField.text!)
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
private func calculate() {
|
|
let senderAmount = senderTextField.text!
|
|
let reciepientAmount = reciepientTextField.text!
|
|
calculateExchangeRate(senderAmount: senderAmount, reciepientAmount: reciepientAmount, calcBy: calcBy)
|
|
}
|
|
|
|
private func goToCDDI() {
|
|
exchangeRateModel?.calcBy = calcBy
|
|
exchangeRateModel?.reciepientCurrency = selectedCurrencyViewModel?.currency ?? ""
|
|
exchangeRateModel?.autodebitSendingAmount = getPlainNumbers(number: senderTextField.text!)
|
|
|
|
|
|
actionDelegate?.calculated(model: exchangeRateModel)
|
|
actionDelegate?.continueToCDDI()
|
|
}
|
|
|
|
private func getPlainNumbers(number: String) -> String {
|
|
return number.stringRemovingComma()
|
|
}
|
|
|
|
private func calculateExchangeRate(senderAmount: String, reciepientAmount: String, calcBy: String) {
|
|
let senderAmount = senderAmount.stringRemovingComma() // send sAmt amount
|
|
let senderCurrency = "JPY"
|
|
let senderCountryId = "142"
|
|
let reciepientAmount = reciepientAmount.stringRemovingComma()
|
|
let recipientCurrency = selectedCurrencyViewModel?.currency
|
|
let reciepientCountryName = reciepient?.country
|
|
let reciepientCountryId = reciepient?.countryID
|
|
let paymentMethod = "wallet"
|
|
let paymentMethodId = requestModel?.paymemtMode?.id
|
|
let payoutPartner = requestModel?.paymemtMode?.payoutPartner
|
|
let myUsername = Utility.getMyUserName()
|
|
let bankId = requestModel?.bank?.id //bank id if selected bank
|
|
calculate(
|
|
senderAmt: senderAmount,
|
|
senderCurrency: senderCurrency,
|
|
recieverAmt: reciepientAmount,
|
|
recieverCurrency: recipientCurrency,
|
|
recieverCountryName: reciepientCountryName,
|
|
recieverCountryId: reciepientCountryId,
|
|
paymentMethod: paymentMethod,
|
|
paymentMethodId: paymentMethodId,
|
|
calcBy: calcBy,
|
|
senderCountryId: senderCountryId,
|
|
payoutPartner: payoutPartner,
|
|
userId: myUsername,
|
|
bankId: bankId
|
|
)
|
|
}
|
|
}
|
|
|
|
// MARK: SendMoneyExchangeRateViewInterface
|
|
extension SendMoneyExchangeRateViewController: SendMoneyExchangeRateViewInterface {
|
|
|
|
func show(model: SendMoneyExchangeRateModel) {
|
|
exchangeRateModel = model
|
|
}
|
|
|
|
func show(error: String) {
|
|
showExchangeRateInfomation(isHidden: false)
|
|
alert(type: .error, message: error)
|
|
}
|
|
|
|
func showLoading() {
|
|
hudDelegate?.showLoading()
|
|
}
|
|
|
|
func hideLoading() {
|
|
hudDelegate?.hideLoading()
|
|
}
|
|
|
|
func setError(with error: Error) {
|
|
alert(message: error.localizedDescription)
|
|
}
|
|
}
|
|
|
|
extension SendMoneyExchangeRateViewController {
|
|
override func didMove(toParent parent: UIViewController?) {
|
|
self.viewWillAppear(true)
|
|
if senderTextField.text != "" || reciepientTextField.text != "" {
|
|
calculate()
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - UITextFieldDelegate
|
|
extension SendMoneyExchangeRateViewController: UITextFieldDelegate {
|
|
func textFieldDidEndEditing(_ textField: UITextField) {
|
|
switch textField {
|
|
case senderTextField, reciepientTextField:
|
|
if senderTextField.text != "" || reciepientTextField.text != "" {
|
|
calculate()
|
|
}
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - TablePresenterDelegate
|
|
extension SendMoneyExchangeRateViewController: TablePresenterDelegate {
|
|
func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration {
|
|
return TablePresenterConfiguration(
|
|
presenterTitle: "search_currency_text".localized(),
|
|
closeButtonTitle: "cancel_text".localized(),
|
|
notFoundTitle: "no_result_found_text".localized(),
|
|
searchBarPlaceHolder: "search_currency_text".localized()
|
|
)
|
|
}
|
|
|
|
func tablePresenterView(
|
|
_ viewController: TablePresenterViewController,
|
|
didSelectModel model: TablePresenterProtocol?
|
|
) {
|
|
selectedCurrencyViewModel =
|
|
(model as? SendMoneyExchangeRateCurrencyViewModel) ?? selectedCurrencyViewModel
|
|
|
|
calcBy.lowercased() == "c" ? (reciepientTextField.text = "") : (senderTextField.text = "")
|
|
}
|
|
}
|