// // InboundAccountsViewController.swift // GME Remit // // Created by InKwon James Kim on 2019/11/12. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import RxSwift import RxCocoa import XLPagerTabStrip class InboundAccountsViewController: UIViewController { private enum Section: Int { case primary = 0 case other } // MARK: Properties var presenter: InboundAccountsPresenter! private let disposeBag = DisposeBag() private var primaryAccount: InboundAccount? private var otherAccounts: [InboundAccount]? private let openPenneyTest = PublishSubject() private let delete = PublishSubject() private let refreshControl = UIRefreshControl() // MARK: Computed Properties private var accounts: [InboundAccount] = [] { didSet { primaryAccount = accounts.first {$0.isPrimary ?? false} otherAccounts = accounts.filter {!($0.isPrimary ?? false)} tableView.reloadData() } } // MARK: IBOutlets @IBOutlet private weak var tableView: UITableView! @IBOutlet private weak var deleteImageView: UIImageView! @IBOutlet private weak var waitingVerifiedLabel: UILabel! @IBOutlet private weak var addButton: UIButton! @IBOutlet private weak var waitingImageView: UIImageView! // MARK: VC's Life cycle override func viewDidLoad() { super.viewDidLoad() setup() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) setupNormalNavigation() title = "inbound_title_text".localized() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } // MARK: IBActions } // MARK: Other Functions extension InboundAccountsViewController { private func setup() { setUI() setBinding() setUIBinding() } private func setUI() { tableView.dataSource = self tableView.delegate = self waitingImageView.tintColor = .themeRed waitingImageView.image = #imageLiteral(resourceName: "ic_warning").withRenderingMode(UIImage.RenderingMode.alwaysTemplate) let colorOption = [NSAttributedString.Key.foregroundColor : UIColor.themeWhite] let title = NSAttributedString(string: "pull to refresh", attributes: colorOption) tableView.refreshControl = refreshControl refreshControl.attributedTitle = title refreshControl.backgroundColor = .themeBlue refreshControl.tintColor = .themeWhite waitingVerifiedLabel.text = "waiting_verified_text".localized() } private func setUIBinding() { } private func setBinding() { let viewWillAppear = rx.sentMessage(#selector(UIViewController.viewWillAppear(_:))) .mapToVoid() .asDriverOnErrorJustComplete() let input = InboundAccountsPresenter.Input( viewWillAppear: viewWillAppear, add: addButton.rx.tap.asDriverOnErrorJustComplete(), pennyTest: openPenneyTest.asDriverOnErrorJustComplete(), refresh: refreshControl.rx.controlEvent(.valueChanged).asDriverOnErrorJustComplete(), delete: delete.asDriverOnErrorJustComplete() ) let output = presenter.transform(input: input) output.isError .drive( onNext: { self.tableView.refreshControl?.endRefreshing() self.alert(type: .error, message: $0.localizedDescription) } ).disposed(by: disposeBag) output.isProgress .drive( onNext: { $0 ? self.showProgressHud() : self.hideProgressHud() } ).disposed(by: disposeBag) output.accounts.drive(onNext: {[weak self] in self?.tableView.refreshControl?.endRefreshing() self?.accounts = $0 }).disposed(by: disposeBag) output.deleteMessage.drive(onNext: {[weak self] in self?.alert(message: $0) { self?.refreshControl.sendActions(for: .valueChanged) } }).disposed(by: disposeBag) } } // MARK: - XLPagerTabStrip's IndicatorInfoProvider extension InboundAccountsViewController: IndicatorInfoProvider { func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { return IndicatorInfo.init(title: "Inbound") } } // MARK: UITableViewDataSource extension InboundAccountsViewController: UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { 2 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { guard let sectionType = Section(rawValue: section) else {return 0} switch sectionType { case .primary: return primaryAccount != nil ? 1 : 0 case .other: return otherAccounts?.count ?? 0 } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { guard let cell = tableView .dequeueReusableCell(withIdentifier: "InboundAccountCell") as? InboundAccountCell else { return UITableViewCell() } let sectionType = Section(rawValue: indexPath.section) ?? .other switch sectionType { case .primary: cell.setModel(with: primaryAccount) case .other: cell.setModel(with: otherAccounts?[indexPath.row]) } cell.delegate = self return cell } } // MARK: UITableViewDelegate extension InboundAccountsViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { guard let sectionType = Section(rawValue: section) else {return ""} switch sectionType { case .primary: return "primary_account_text".localized() case .other: return "inbound_accounts_text".localized() } } } extension InboundAccountsViewController: InboundAccountCellDelegate { func penneyTest(of model: InboundAccount?) { let bankInformation = BankInformation( bankCode: model?.bankCode ?? "", bankName: model?.bankName ?? "" ) let pennyTestRequest = PenneyTestRequest( bank: bankInformation, account: model?.accountNo ?? "" ) openPenneyTest.onNext(pennyTestRequest) } func delete(of model: InboundAccount?) { self.alertWithOkCancel( type: .normal, message: "delete_account_message_text".localized(), title: "delete_account_text".localized(), okTitle: "delete_text".localized(), cancelTitle: "cancel_text".localized(), okAction: {[weak self] in guard let account = model else { return } self?.delete.onNext(account) }, cancelAction: nil ) } }