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