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