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.
200 lines
6.1 KiB
200 lines
6.1 KiB
//
|
|
// TransactionHistoryViewController.swift
|
|
// GMERemittance
|
|
//
|
|
// Created by gme_2 on 28/09/2018.
|
|
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
enum TransactionModelType: String {
|
|
case paid = "Paid"
|
|
case all = "all"
|
|
case received = "received"
|
|
}
|
|
|
|
class TransactionHistoryViewController: UIViewController {
|
|
|
|
enum SegmentIndex: Int {
|
|
case all = 0
|
|
case sent
|
|
case delivered
|
|
}
|
|
|
|
struct Constant {
|
|
static let heightOfDateRangeLabel: CGFloat = 35
|
|
}
|
|
|
|
@IBOutlet weak var fromDateLabel: UILabel!
|
|
@IBOutlet weak var toDateLabel: UILabel!
|
|
|
|
|
|
// MARK: IBOutlets
|
|
@IBOutlet weak var tableView: UITableView!
|
|
@IBOutlet weak var segmentedControl: UISegmentedControl!
|
|
@IBOutlet weak var dateRangeLabelHeightConstraint: NSLayoutConstraint!
|
|
@IBOutlet weak var emptyLabel: UILabel!
|
|
|
|
@IBOutlet weak var searchTextField: UITextField!
|
|
|
|
|
|
// MARK: Properties
|
|
|
|
var from: String?
|
|
var to: String?
|
|
|
|
var transactions: [TransactionModel] = [] {
|
|
didSet {
|
|
self.emptyLabel.isHidden = !transactions.isEmpty
|
|
self.tableView.reloadData()
|
|
guard let fromDate = from, let toDate = to else {
|
|
self.dateRangeLabelHeightConstraint.constant = 0
|
|
return
|
|
}
|
|
self.fromDateLabel.text = self.getHUmanReadableDate(date: fromDate)
|
|
self.toDateLabel.text = self.getHUmanReadableDate(date: toDate)
|
|
UIView.animate(withDuration: 0.33, animations: {
|
|
self.dateRangeLabelHeightConstraint.constant = Constant.heightOfDateRangeLabel
|
|
})
|
|
}
|
|
}
|
|
|
|
var transactionType: TransactionModelType? {
|
|
didSet {
|
|
// filter for transaction type
|
|
if self.transactionType != oldValue {
|
|
guard let type = self.transactionType else {return}
|
|
self.presenter?.filterTransaction(type: type)
|
|
}
|
|
}
|
|
}
|
|
var presenter: TransactionHistoryModuleInterface?
|
|
|
|
|
|
// MARK: VC's Life cycle
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
self.setupNormalNavigation()
|
|
self.setup()
|
|
presenter?.viewIsReady()
|
|
}
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
self.navigationItem.title = "Transaction Report"
|
|
}
|
|
|
|
override func viewWillDisappear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
self.navigationItem.title = ""
|
|
}
|
|
|
|
// MARK: IBActions
|
|
@IBAction func openSearchFilter(_ sender: UIButton) {
|
|
// open search filter
|
|
let viewController = UIStoryboard.init(name: "TransactionHistoryDatePicker", bundle: nil).instantiateViewController(withIdentifier: "DatePickerViewController") as! DatePickerViewController
|
|
viewController.completion = self.selectedDate
|
|
self.present(viewController, animated: true, completion: nil)
|
|
}
|
|
|
|
@IBAction func segmentChanged(_ sender: UISegmentedControl) {
|
|
self.searchTextField.text = ""
|
|
guard let index = SegmentIndex(rawValue: sender.selectedSegmentIndex) else {return}
|
|
switch index {
|
|
case .all:
|
|
self.transactionType = .all
|
|
case .sent:
|
|
self.transactionType = .received
|
|
case .delivered:
|
|
self.transactionType = .paid
|
|
}
|
|
}
|
|
|
|
|
|
// MARK: Other Functions
|
|
|
|
private func selectedDate(from: String?, to: String?) {
|
|
self.from = from
|
|
self.to = to
|
|
guard let fromDate = from, let toDate = to else {return}
|
|
self.presenter?.fetchTransactionHistories(fromDate: fromDate, toDate: toDate)
|
|
}
|
|
|
|
private func getHUmanReadableDate(date: String?) -> String? {
|
|
if let date = DateFormatter.toDate(dateString: date ?? "", format: AppConstants.dateFormat) {
|
|
let dateString = DateFormatter.toString(date: date, format: AppConstants.humanReadableDateFormat)
|
|
return dateString
|
|
}
|
|
return nil
|
|
}
|
|
|
|
private func setup() {
|
|
// all setup should be done here
|
|
setupSearchTextField()
|
|
setupDelegates()
|
|
self.transactionType = .all
|
|
self.dateRangeLabelHeightConstraint.constant = 0
|
|
}
|
|
|
|
private func setupSearchTextField() {
|
|
let imageview = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
|
|
self.searchTextField.leftView = imageview
|
|
self.searchTextField.leftViewMode = .always
|
|
self.searchTextField.addTarget(self, action: #selector(search(sender:)), for: UIControlEvents.editingChanged)
|
|
}
|
|
|
|
@objc func search(sender: UITextField) {
|
|
let searchText = sender.text!
|
|
self.presenter?.search(text: searchText)
|
|
}
|
|
|
|
private func setupDelegates() {
|
|
self.tableView.delegate = self
|
|
self.tableView.dataSource = self
|
|
}
|
|
|
|
|
|
}
|
|
|
|
// MARK: TransactionHistoryViewInterface
|
|
extension TransactionHistoryViewController: TransactionHistoryViewInterface {
|
|
func showLoading() {
|
|
self.showProgressHud()
|
|
}
|
|
|
|
func hideLoading() {
|
|
self.hideProgressHud()
|
|
}
|
|
|
|
func show(error: String) {
|
|
self.alert(message: error)
|
|
}
|
|
|
|
func show(models: [TransactionModel]) {
|
|
self.transactions = models
|
|
}
|
|
}
|
|
|
|
// MARK: TableViewDelegate
|
|
extension TransactionHistoryViewController: UITableViewDelegate {
|
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|
self.presenter?.showDetailOf(index: indexPath.row)
|
|
}
|
|
}
|
|
|
|
// MARK: TableViewDatasource
|
|
extension TransactionHistoryViewController: UITableViewDataSource {
|
|
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
return transactions.count
|
|
}
|
|
|
|
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
let cell = tableView.dequeueReusableCell(withIdentifier: "TransactionHistoryTableViewCell") as! TransactionHistoryTableViewCell
|
|
cell.model = self.transactions.elementAt(index: indexPath.row)
|
|
cell.setup()
|
|
return cell
|
|
}
|
|
}
|
|
|