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

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