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.
 
 
 
 

226 lines
6.4 KiB

//
// 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<PenneyTestRequest>()
private let delete = PublishSubject<InboundAccount>()
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
)
}
}