// // AutoDebitViewController.swift // GME Remit // // Created by Mac on 12/19/18. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import IQKeyboardManagerSwift import XLPagerTabStrip class AutoDebitViewController: UIViewController { struct MultiLanguages { let navigationTitle = "auto_debit_title_text".localized() let languageUnavailableError = "no_lanugages_available_text".localized() let pickerTitle = "select_language_text".localized() let cancelText = "cancel_text".localized() let deleteTitleText = "auto_debit_delete_confirm_description".localized() let confirmationText = "are_you_sure_text".localized() let deleteText = "delete_text".localized() let editText = "Edit".localized() let tokenRenewalText = "token_renewal_text".localized() } // MARK: IBOutlets @IBOutlet private weak var tableView: UITableView! @IBOutlet private weak var viewAddAccount: UIView! @IBOutlet private weak var tokenRenewalLabel: UILabel! @IBOutlet private weak var registerInboundImageView: UIImageView! @IBOutlet private weak var registerInboundLabel: UILabel! // MARK: properties var presenter: AutoDebitModuleInterface? var languages: [String] = ["--- Select Language ---"] lazy var languageTextField = UITextField(frame: .zero) var selectedLanguage: KftcLanguage? private lazy var refreshControl = UIRefreshControl() private var kftcDetail: KFTCModel? { didSet { tableView.refreshControl?.endRefreshing() accounts = kftcDetail?.model tableView.reloadData() if languages.count < 2 { let originalLanguages = kftcDetail?.languages?.map { $0.value ?? ""} languages.append(contentsOf: originalLanguages ?? []) } } } private var accounts: [Account]? { didSet { guard let account = accounts, !account.isEmpty else { viewAddAccount.isHidden = true return } tableView.isHidden = false viewAddAccount.isHidden = false } } private let multiLanguages = MultiLanguages() // MARK: Life Cycle override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) setupNormalNavigation() setupNavigationShadow(isUse: false) navigationItem.title = multiLanguages.navigationTitle presenter?.fetchKFTCBankAccountList() } override func viewDidLoad() { super.viewDidLoad() setupDelegates() viewAddAccount.layer.cornerRadius = 5 registerInboundImageView.tintColor = .themeText registerInboundImageView.image = #imageLiteral(resourceName: "ic_register_Inbound").withRenderingMode(UIImage.RenderingMode.alwaysTemplate) if self.presentingViewController == nil { self.navigationItem.leftBarButtonItem = nil } registerInboundLabel.text = "register_inbound_text".localized() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) navigationItem.title = "" setupNavigationShadow(isUse: true) view.endEditing(true) } // MARK: IBAction @IBAction func touchAddAccountCellButton(_ sender: UIButton) { presenter?.goAddAccount(model: kftcDetail) } private func refreshAccount() { alertWithOkCancel( type: .normal, message: "token_renewal_confirm_text".localized(), title: "token_renewal_text".localized(), okTitle: "yes_text".localized(), cancelTitle: "no_text".localized(), okAction: { let languagePickerView = UIPickerView() languagePickerView.delegate = self languagePickerView.dataSource = self languagePickerView.backgroundColor = .themeMainBackground self.languageTextField.inputView = languagePickerView self.languageTextField.placeholder = "token_renewal_placeholder_text".localized() self.languageTextField.becomeFirstResponder() self.languageTextField .keyboardToolbar .doneBarButton .setTarget(self, action: #selector(self.editingDidEnd(_:))) }, cancelAction: nil ) } @IBAction func touchClose(_ sender: UIBarButtonItem) { // GMEDB.shared.user.set("", .redirectTo) dismiss(animated: true, completion: nil) } @objc func editingDidEnd(_ textField: UITextField) { presenter?.goRefreshToken(selectedLanguage: selectedLanguage) } @IBAction private func addNewAccount(_ sender: UITapGestureRecognizer) { refreshAccount() } // MARK: other functions private func setupDelegates() { tableView.dataSource = self configureText() view.addSubview(languageTextField) addRefreshControl() } private func configureText() { tokenRenewalLabel.text = multiLanguages.tokenRenewalText } private func addRefreshControl() { let colorOption = [NSAttributedString.Key.foregroundColor : UIColor.themeWhite] let title = NSAttributedString(string: "pull to refresh", attributes: colorOption) refreshControl.attributedTitle = title refreshControl.backgroundColor = .themeBlue refreshControl.tintColor = .themeWhite refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged) tableView.refreshControl = refreshControl } @objc private func refresh() { presenter?.fetchKFTCBankAccountList() } } // MARK: - UITableViewDataSource extension AutoDebitViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return 82 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return accounts?.count ?? 0 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView.dequeueReusableCell( withIdentifier: "AutoDebitTableViewCell", for: indexPath ) as? AutoDebitTableViewCell else { return UITableViewCell() } cell.setup(with: accounts?.elementAt(index: indexPath.row)) cell.delegate = self return cell } } // MARK: - AutoDebitViewInterface extension AutoDebitViewController: AutoDebitViewInterface { func didFailRefreshToken(with error: Error) { alert(type: .error, message: error.localizedDescription) } func didDeleteAccount() { presenter?.fetchKFTCBankAccountList() } func didFailDeleteAccount(with error: Error) { alert( type: .error, message: error.localizedDescription, title: "Failed Delete", okAction: nil ) } func startLoading() { showProgressHud() } func endLoading() { hideProgressHud() } func setModel(with model: KFTCModel?) { kftcDetail = model } func didFailSetModel(with error: Error) { alert( type: .error, message: error.localizedDescription, title: "Failed Fetch KFTC Account List", okAction: nil ) } } // MARK: - UIPickerViewDelegate extension AutoDebitViewController: UIPickerViewDelegate { func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return languages[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if row > 0 { selectedLanguage = kftcDetail?.languages?[row - 1] } } } // MARK: - UIPickerViewDataSource extension AutoDebitViewController: UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return languages.count } } // MARK: - XLPagerTabStrip's IndicatorInfoProvider extension AutoDebitViewController: IndicatorInfoProvider { func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { return IndicatorInfo.init(title: "AutoDebit") } } // MARK: AutoDebitTableViewCellDelegate extension AutoDebitViewController: AutoDebitTableViewCellDelegate { func migrate(of model: Account?) { let bank = BankInformation(bankCode: model?.bankCode, bankName: model?.bankName) let model = PenneyTestRequest( accountID: model?.kftcAccountId, accountType: "autodebit", bank: bank, account: model?.accountNumMasked ?? "" ) presenter?.openRegisterInboundAccount(with: model) } func delete(of model: Account?) { alertWithOkCancel( message: multiLanguages.deleteTitleText, title: multiLanguages.confirmationText, okTitle: multiLanguages.deleteText, okAction: { [weak self] in guard let `self` = self else { return } let email = GMEDB.shared.user.string(.userId) ?? "" guard let account = model else { return } self.presenter?.deleteKFTCBankAccount(of: email, with: account) } ) } }