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

//
// 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 = "")
}
}