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.
 
 
 
 

462 lines
17 KiB

//
// SendMoneyParentViewController.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import Localize_Swift
// controls the progress hud of parent view from child view
protocol HUDStatusDelegate: class {
func showLoading()
func hideLoading()
}
// Actions from SendMoneyExchangeRateViewController are delegated to Parent View
protocol SendMoneyExchangeRateActionDelegate: class {
func continueToVerificationAction(model: CDDIRequestData)
func calculated(model: SendMoneyExchangeRateModel?)
func continueToCDDI()
func continueToTermsAndConditions()
}
// A model encapsulating all field required to make the api request for send money
class SendMoneyRequestModel {
var paymemtMode: SendMoneyPayoutMode? = SendMoneyPayoutMode()
var bank: SendMoneyBank? = SendMoneyBank()
var branch: SendMoneyBankBranch? = SendMoneyBankBranch()
var accountNumber: String?
var payingAmount: String?
var exchangeRateDetail: SendMoneyExchangeRateModel?
var transactionPassword: String?
var autoDebitAccount: Account?
var isUseBiometric: Bool?
}
class SendMoneyParentViewController: UIViewController {
private enum StateButtons: Int {
case exchange = 1
case cddi = 2
case verification = 3
case terms = 4
}
private struct Constants {
static let stateRedColor = UIColor.init(hex: "#EC1C24")
static let stateGreenColor = UIColor.themeBlue
static let stateLabelGreyColor = UIColor.init(hex: "4a4a4a")
}
private struct StringConstants {
let payoutModeText = "payout_mode_text".localized()
let amountDetailText = "amount_detail_text".localized()
let verificationDetailText = "verification_detail_text".localized()
}
// MARK: IBOutlets
// Container view holds the child view controllers
// There are three child view controllers.
// 2. SendMoneyExchangeRateViewController
// 3. SendMoneyVerificationViewController
@IBOutlet weak var containerView: UIView!
@IBOutlet weak var exchangeRateButton: UIButton!
@IBOutlet weak var verificationButton: UIButton!
@IBOutlet weak var exchangeRateLabel: UILabel!
@IBOutlet weak var verificationLabel: UILabel!
@IBOutlet weak var cddiButton: UIButton!
@IBOutlet weak var termsButton: UIButton!
@IBOutlet weak var cddiLabel: UILabel!
@IBOutlet weak var termsLabel: UILabel!
// MARK: Properties
var sendMoneyExchangeRateViewController: SendMoneyExchangeRateViewController?
var sendMoneyVerificationViewController: SendMoneyVerificationViewController?
var cddiViewController: CDDIViewControllerViewController?
var termsViewController: TermsAndConditionViewController?
lazy private var requestModel = SendMoneyRequestModel()
lazy private var cddiModel = CDDIRequestData()
var presenter: SendMoneyParentModuleInterface?
// Buttons representing the pages marked as 1, 2, 3 in UI.
var stateButtons: [UIButton] = []
private var state: StateButtons = .exchange {
didSet {
self.updateState(state: state)
}
}
var receipient: Recipient? {
didSet {
self.requestModel.bank?.id = receipient?.agent?.id
self.requestModel.bank?.name = receipient?.agent?.name
self.requestModel.bank?.payCurrency = receipient?.agent?.currency
self.requestModel.accountNumber = receipient?.agent?.accountNumber
self.requestModel.branch?.id = receipient?.agent?.branch?.id
self.requestModel.branch?.name = receipient?.agent?.branch?.name
self.requestModel.paymemtMode?.id = receipient?.paymentMethod?.id
self.requestModel.paymemtMode?.mode = receipient?.paymentMethod?.name
self.requestModel.paymemtMode?.payCurrency = receipient?.paymentMethod?.currency
self.requestModel.paymemtMode?.payoutPartner = receipient?.payoutPartner
self.requestModel.paymemtMode?.accountNumber = receipient?.agent?.accountNumber
}
}
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setup()
self.presenter?.viewIsReady()
self.setupViewControllers()
self.addExchangeViewController()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setupNormalNavigation()
setTitle(title: "send_money_text".localized())
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationItem.title = ""
view.endEditing(true)
}
// MARK: IBActions
@IBAction func exchangeRate(_ sender: UIButton) {
self.addExchangeViewController()
self.state = StateButtons.exchange
}
@IBAction func verification(_ sender: UIButton) {
self.addVerificationViewController()
self.state = StateButtons.verification
}
@IBAction func cddiTapped(_ sender: UIButton) {
self.addCddiViewController()
self.state = StateButtons.cddi
}
@IBAction func termsAndConditions(_ sender: UIButton) {
self.addTermsAndConditions()
self.state = StateButtons.terms
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
self.setTitle(title: "send_money_text".localized())
self.state = StateButtons.exchange
self.configureViews()
self.requestModel = SendMoneyRequestModel()
configureLanguage()
}
private func configureLanguage() {
self.exchangeRateLabel.text = StringConstants().amountDetailText
self.verificationLabel.text = StringConstants().verificationDetailText
}
private func setTitle(title: String) {
self.navigationItem.title = title
}
private func setupViewControllers() {
sendMoneyExchangeRateViewController = SendMoneyExchangeRateWireframe()
.getMainView() as? SendMoneyExchangeRateViewController
sendMoneyExchangeRateViewController?.reciepient = self.receipient
sendMoneyExchangeRateViewController?.actionDelegate = self
sendMoneyExchangeRateViewController?.hudDelegate = self
sendMoneyVerificationViewController = SendMoneyVerificationWireframe()
.getMainView() as? SendMoneyVerificationViewController
sendMoneyVerificationViewController?.reciepient = self.receipient
sendMoneyVerificationViewController?.requestModel = self.requestModel
sendMoneyVerificationViewController?.hudDelegate = self
cddiViewController = CDDIViewControllerWireframe().getMainView() as? CDDIViewControllerViewController
cddiViewController?.reciepient = self.receipient
cddiViewController?.requestModel = self.requestModel
cddiViewController?.hudDelegate = self
termsViewController = TermsAndConditionWireframe().getMainView() as? TermsAndConditionViewController
termsViewController?.reciepient = self.receipient
termsViewController?.requestModel = self.requestModel
termsViewController?.hudDelegate = self
}
private func configureViews() {
self.exchangeRateButton.tag = 2
self.verificationButton.tag = 3
self.cddiButton.tag = 4
self.termsButton.tag = 5
self.stateButtons = [exchangeRateButton, verificationButton, cddiButton, termsButton]
[exchangeRateButton, verificationButton, cddiButton, termsButton].forEach({
$0?.rounded()
})
}
private func updateState(state: StateButtons) {
switch state {
case .exchange:
// buttons
self.exchangeRateButton.backgroundColor = .themeBlue
self.exchangeRateButton.setTitleColor(.white, for: .normal)
self.verificationButton.backgroundColor = .white
self.verificationButton.setTitleColor(.black, for: .normal)
self.verificationButton.layer.borderColor = UIColor.lightGray.cgColor
self.verificationButton.layer.borderWidth = 1
self.cddiButton.backgroundColor = .white
self.cddiButton.setTitleColor(.black, for: .normal)
self.cddiButton.layer.borderColor = UIColor.lightGray.cgColor
self.cddiButton.layer.borderWidth = 1
self.termsButton.backgroundColor = .white
self.termsButton.setTitleColor(.black, for: .normal)
self.termsButton.layer.borderColor = UIColor.lightGray.cgColor
self.termsButton.layer.borderWidth = 1
self.exchangeRateButton.isUserInteractionEnabled = true
self.verificationButton.isUserInteractionEnabled = false
self.cddiButton.isUserInteractionEnabled = false
self.termsButton.isUserInteractionEnabled = false
// labels
self.exchangeRateLabel.textColor = .themeText
self.verificationLabel.textColor = .themeText
self.cddiLabel.textColor = .themeText
self.termsLabel.textColor = .themeText
case .cddi:
self.exchangeRateButton.backgroundColor = .themeBlue
self.exchangeRateButton.setTitleColor(.white, for: .normal)
self.exchangeRateButton.isUserInteractionEnabled = true
self.cddiButton.backgroundColor = .themeBlue
self.cddiButton.setTitleColor(.white, for: .normal)
self.cddiButton.layer.borderWidth = 0
self.verificationButton.backgroundColor = .white
self.verificationButton.setTitleColor(.black, for: .normal)
self.verificationButton.layer.borderColor = UIColor.lightGray.cgColor
self.verificationButton.layer.borderWidth = 1
self.termsButton.backgroundColor = .white
self.termsButton.setTitleColor(.black, for: .normal)
self.termsButton.layer.borderColor = UIColor.lightGray.cgColor
self.termsButton.layer.borderWidth = 1
self.exchangeRateButton.isUserInteractionEnabled = true
self.verificationButton.isUserInteractionEnabled = false
self.cddiButton.isUserInteractionEnabled = true
self.termsButton.isUserInteractionEnabled = false
// labels
self.exchangeRateLabel.textColor = .themeText
self.verificationLabel.textColor = .themeText
self.cddiLabel.textColor = .themeText
self.termsLabel.textColor = .themeText
case .verification:
// button
self.exchangeRateButton.backgroundColor = .themeBlue
self.exchangeRateButton.setTitleColor(.white, for: .normal)
self.exchangeRateButton.isUserInteractionEnabled = true
self.cddiButton.backgroundColor = .themeBlue
self.cddiButton.setTitleColor(.white, for: .normal)
self.cddiButton.isUserInteractionEnabled = true
self.verificationButton.backgroundColor = .themeBlue
self.verificationButton.setTitleColor(.white, for: .normal)
self.verificationButton.layer.borderWidth = 0
self.verificationButton.isUserInteractionEnabled = true
self.termsButton.backgroundColor = .white
self.termsButton.setTitleColor(.black, for: .normal)
self.termsButton.layer.borderColor = UIColor.lightGray.cgColor
self.termsButton.layer.borderWidth = 1
self.termsButton.isUserInteractionEnabled = false
// labels
self.exchangeRateLabel.textColor = .themeText
self.verificationLabel.textColor = .themeText
self.cddiLabel.textColor = .themeText
self.termsLabel.textColor = .themeText
case .terms:
self.exchangeRateButton.backgroundColor = .themeBlue
self.exchangeRateButton.isUserInteractionEnabled = true
self.exchangeRateButton.setTitleColor(.white, for: .normal)
self.cddiButton.backgroundColor = .themeBlue
self.cddiButton.isUserInteractionEnabled = true
self.cddiButton.setTitleColor(.white, for: .normal)
self.verificationButton.backgroundColor = .themeBlue
self.verificationButton.setTitleColor(.white, for: .normal)
self.cddiButton.isUserInteractionEnabled = true
self.termsButton.backgroundColor = .themeBlue
self.termsButton.setTitleColor(.white, for: .normal)
self.termsButton.layer.borderWidth = 0
self.termsButton.isUserInteractionEnabled = true
// labels
self.exchangeRateLabel.textColor = .themeText
self.verificationLabel.textColor = .themeText
self.cddiLabel.textColor = .themeText
self.termsLabel.textColor = .themeText
}
}
private func addExchangeViewController() {
guard let exchangeViewController = sendMoneyExchangeRateViewController else { return }
exchangeViewController.requestModel = self.requestModel
exchangeViewController.actionDelegate = self
self.addChild(exchangeViewController)
UIView.transition(
with: self.containerView,
duration: 0.33,
options: .transitionCrossDissolve,
animations: {
self.containerView.addSubview(exchangeViewController.view)
},
completion: nil
)
exchangeViewController.view.frame = containerView.bounds
exchangeViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
exchangeViewController.didMove(toParent: self)
}
private func addCddiViewController() {
guard let ccdiView = cddiViewController else {return}
ccdiView.requestModel = self.requestModel
ccdiView.actionDelegate = self
self.addChild(ccdiView)
UIView.transition(
with: self.containerView,
duration: 0.33,
options: .transitionCrossDissolve,
animations: {
self.containerView.addSubview(ccdiView.view)
},
completion: nil
)
ccdiView.view.frame = containerView.bounds
ccdiView.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
ccdiView.didMove(toParent: self)
}
// Make SendMoneyExchangeRateViewController as front View Controller
private func addVerificationViewController() {
guard let verificationViewController = sendMoneyVerificationViewController else {return}
verificationViewController.reciepient = self.receipient
verificationViewController.requestModel = self.requestModel
verificationViewController.actionDelegate = self
self.addChild(verificationViewController)
UIView.transition(
with: self.containerView,
duration: 0.33,
options: .transitionCrossDissolve,
animations: {
self.containerView.addSubview(verificationViewController.view)
},
completion: nil
)
verificationViewController.view.frame = containerView.bounds
verificationViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
verificationViewController.didMove(toParent: self)
}
private func addTermsAndConditions() {
guard let termsView = termsViewController else {return}
termsView.reciepient = self.receipient
termsView.requestModel = self.requestModel
termsView.cddiModel = self.cddiModel
self.addChild(termsView)
UIView.transition(
with: self.containerView,
duration: 0.33,
options: .transitionCrossDissolve,
animations: {
self.containerView.addSubview(termsView.view)
},
completion: nil
)
termsView.view.frame = containerView.bounds
termsView.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
termsView.didMove(toParent: self)
}
}
// MARK: SendMoneyParentViewInterface
extension SendMoneyParentViewController: SendMoneyParentViewInterface {
func show(model: Recipient) {
self.receipient = model
}
}
extension SendMoneyParentViewController: HUDStatusDelegate {
func showLoading() {
self.tabBarController?.showProgressHud()
}
func hideLoading() {
self.tabBarController?.hideProgressHud()
}
}
extension SendMoneyParentViewController: SendMoneyExchangeRateActionDelegate {
func continueToCDDI() {
self.addCddiViewController()
self.state = StateButtons.cddi
}
func continueToTermsAndConditions() {
self.addTermsAndConditions()
self.state = StateButtons.terms
}
func continueToVerificationAction(model: CDDIRequestData) {
self.cddiModel = model
print("model:\(model)")
self.addVerificationViewController()
self.state = StateButtons.verification
}
func calculated(model: SendMoneyExchangeRateModel?) {
self.requestModel.exchangeRateDetail = model
}
}