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.
 
 
 
 

216 lines
6.5 KiB

//
// AddAccountViewController.swift
// GME Remit
//
// Created by InKwon Devik Kim on 12/04/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import RxSwift
import RxCocoa
class AddAccountViewController: UIViewController {
// MARK: Properties
var presenter: AddAccountModuleInterface?
private var selectedLanguage: KftcLanguage?
private var selectedBank: BankInformation?
private let disposeBag = DisposeBag()
private lazy var languagePickerView = UIPickerView()
private lazy var bankPickerView = UIPickerView()
private var validDic = [
"bank": false,
"account": false,
"language": false
]
private var isValid = false {
didSet {
verifyAccountButton.isEnabled = isValid
verifyAccountButton.backgroundColor = isValid ? .themeRed : .lightGray
}
}
private var banks: [String]? = ["--- Select Bank ---"]
private var languages: [String]? = ["--- Select Language ---"]
private var model: (bankList: [BankInformation]?, kftcModel: KFTCModel?) {
didSet {
let bankConfigure = TablePresenterConfiguration(presenterTitle: "Select Bank")
bankNameTextField.useAsDropDown(with: bankConfigure, items: model.bankList)
let languageConfigure = TablePresenterConfiguration(presenterTitle: "Select Bank")
languageTextField.useAsDropDown(with: languageConfigure, items: model.kftcModel?.languages)
}
}
// MARK: IBOutlets
@IBOutlet private weak var bankNameTextField: ValidationTextField!
@IBOutlet private weak var accountTextField: ValidationTextField!
@IBOutlet private weak var languageTextField: ValidationTextField!
@IBOutlet private weak var verifyAccountButton: UIButton!
@IBOutlet weak var closeButton: UIBarButtonItem!
@IBOutlet weak var titleInfoLabel: UILabel!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
setup()
bankNameTextField.selectedItem.map {$0 as? BankInformation}.asDriverOnErrorJustComplete()
.drive(onNext: {[weak self] in
self?.selectedBank = $0
self?.bankNameTextField.setBank(with: $0?.bankCode)
}).disposed(by: disposeBag)
languageTextField.selectedItem.map {$0 as? KftcLanguage}.asDriverOnErrorJustComplete()
.drive(onNext: {[weak self] in
self?.selectedLanguage = $0
}).disposed(by: disposeBag)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
title = "add_auto_debit_account_text".localized()
setupNormalNavigation()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
title = ""
view.endEditing(true)
}
// MARK: IBActions
@IBAction private func verifyAccountButtonTouch(_ sender: UIButton) {
presenter?.verifyAccount(
customerID: GMEDB.shared.user.string(.senderId) ?? "", // senderID
bankCode: selectedBank?.bankCode ?? "",
accountNumber: accountTextField.text ?? "")
}
@IBAction private func closeButtonTouch(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
presenter?.viewIsReady()
verifyAccountButton.layer.cornerRadius = 5
setValidTextField()
setMultilanguage()
}
private func setValidTextField() {
bankNameTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
languageTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
accountTextField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged)
accountTextField.validCondition = {$0.count > 9}
languageTextField.validCondition = {$0.count > 1}
bankNameTextField.validCondition = {$0.count > 1}
}
@objc
func textFieldDidChange(_ textfield: UITextField) {
guard let tf = textfield as? ValidationTextField else { return }
switch tf {
case bankNameTextField:
validDic["bank"] = tf.isValid
case accountTextField:
validDic["account"] = tf.isValid
case languageTextField:
validDic["language"] = tf.isValid
default:
break
}
isValid = validDic.allSatisfy {$0.value}
}
private func setMultilanguage() {
closeButton.title = "penny_test_close_text".localized()
titleInfoLabel.text = "to_add_account_enter_information".localized()
bankNameTextField.placeholder = "select_your_bank".localized()
accountTextField.placeholder = "enter_bank_ac_no".localized()
languageTextField.placeholder = "select_language".localized()
verifyAccountButton.setTitle("verify_account_button_text".localized(), for: .normal)
}
}
// MARK: AddAccountViewInterface
extension AddAccountViewController: AddAccountViewInterface {
func setModel(model: (bankList: [BankInformation]?, kftcModel: KFTCModel?)) {
self.model = model
}
func failureSetModel(error: Error) {
alert(type: .error, message: error.localizedDescription) {[weak self] in
guard let `self` = self else {return}
self.dismiss(animated: true, completion: nil)
}
}
func successVerify() {
let url = "\(model.kftcModel?.url ?? "")&lang=\(selectedLanguage?.key ?? "")"
var header = [String: String]()
model.kftcModel?.header?.forEach({
header[$0.key ?? ""] = $0.value ?? ""
})
header["Kftc-Bfop-BankCodeStd"] = selectedBank?.bankCode ?? ""
header["Kftc-Bfop-AccountNum"] = accountTextField.text ?? ""
presenter?.doGetTestURL(url: url, header: header)
}
func successTestURL(url: String) {
presenter?.goKFTC(url: url, header: self.model.kftcModel?.header)
}
func failure(error: Error) {
if error.localizedDescription.contains("JSON") {
let url = "\(model.kftcModel?.url ?? "")&lang=\(selectedLanguage?.key ?? "")"
let bankCode = KftcHeader(key: "Kftc-Bfop-BankCodeStd", value: selectedBank?.bankCode ?? "")
let accountNumber = KftcHeader(key: "Kftc-Bfop-AccountNum", value: accountTextField.text ?? "")
model.kftcModel?.header?.append(bankCode)
model.kftcModel?.header?.append(accountNumber)
presenter?.goKFTC(url: url, header: self.model.kftcModel?.header)
} else {
alert(type: .error, message: error.localizedDescription, okAction: nil)
}
}
func startLoading() {
showProgressHud()
}
func endLoading() {
hideProgressHud()
}
}