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.

197 lines
6.0 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // TransactionHistoryViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 28/09/2018.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. enum TransactionModelType: String {
  10. case paid = "Paid"
  11. case all = "all"
  12. case received = "received"
  13. }
  14. class TransactionHistoryViewController: UIViewController {
  15. enum SegmentIndex: Int {
  16. case all = 0
  17. case sent
  18. case delivered
  19. }
  20. struct Constant {
  21. static let heightOfDateRangeLabel: CGFloat = 35
  22. }
  23. @IBOutlet weak var fromDateLabel: UILabel!
  24. @IBOutlet weak var toDateLabel: UILabel!
  25. // MARK: IBOutlets
  26. @IBOutlet weak var tableView: UITableView!
  27. @IBOutlet weak var segmentedControl: UISegmentedControl!
  28. @IBOutlet weak var dateRangeLabelHeightConstraint: NSLayoutConstraint!
  29. @IBOutlet weak var searchTextField: UITextField!
  30. // MARK: Properties
  31. var from: String?
  32. var to: String?
  33. var transactions: [TransactionModel] = [] {
  34. didSet {
  35. self.tableView.reloadData()
  36. guard let fromDate = from, let toDate = to else {
  37. self.dateRangeLabelHeightConstraint.constant = 0
  38. return
  39. }
  40. self.fromDateLabel.text = self.getHUmanReadableDate(date: fromDate)
  41. self.toDateLabel.text = self.getHUmanReadableDate(date: toDate)
  42. UIView.animate(withDuration: 0.33, animations: {
  43. self.dateRangeLabelHeightConstraint.constant = Constant.heightOfDateRangeLabel
  44. })
  45. }
  46. }
  47. var transactionType: TransactionModelType? {
  48. didSet {
  49. // filter for transaction type
  50. if self.transactionType != oldValue {
  51. guard let type = self.transactionType else {return}
  52. self.presenter?.filterTransaction(type: type)
  53. }
  54. }
  55. }
  56. var presenter: TransactionHistoryModuleInterface?
  57. // MARK: VC's Life cycle
  58. override func viewDidLoad() {
  59. super.viewDidLoad()
  60. self.setupNormalNavigation()
  61. self.setup()
  62. presenter?.viewIsReady()
  63. }
  64. override func viewWillAppear(_ animated: Bool) {
  65. super.viewWillAppear(animated)
  66. self.navigationItem.title = "Transaction Report"
  67. }
  68. override func viewWillDisappear(_ animated: Bool) {
  69. super.viewWillAppear(animated)
  70. self.navigationItem.title = ""
  71. }
  72. // MARK: IBActions
  73. @IBAction func openSearchFilter(_ sender: UIButton) {
  74. // open search filter
  75. let viewController = UIStoryboard.init(name: "TransactionHistoryDatePicker", bundle: nil).instantiateViewController(withIdentifier: "DatePickerViewController") as! DatePickerViewController
  76. viewController.completion = self.selectedDate
  77. self.present(viewController, animated: true, completion: nil)
  78. }
  79. @IBAction func segmentChanged(_ sender: UISegmentedControl) {
  80. self.searchTextField.text = ""
  81. guard let index = SegmentIndex(rawValue: sender.selectedSegmentIndex) else {return}
  82. switch index {
  83. case .all:
  84. self.transactionType = .all
  85. case .sent:
  86. self.transactionType = .received
  87. case .delivered:
  88. self.transactionType = .paid
  89. }
  90. }
  91. // MARK: Other Functions
  92. private func selectedDate(from: String?, to: String?) {
  93. self.from = from
  94. self.to = to
  95. guard let fromDate = from, let toDate = to else {return}
  96. self.presenter?.fetchTransactionHistories(fromDate: fromDate, toDate: toDate)
  97. }
  98. private func getHUmanReadableDate(date: String?) -> String? {
  99. if let date = DateFormatter.toDate(dateString: date ?? "", format: AppConstants.dateFormat) {
  100. let dateString = DateFormatter.toString(date: date, format: AppConstants.humanReadableDateFormat)
  101. return dateString
  102. }
  103. return nil
  104. }
  105. private func setup() {
  106. // all setup should be done here
  107. setupSearchTextField()
  108. setupDelegates()
  109. self.transactionType = .all
  110. self.dateRangeLabelHeightConstraint.constant = 0
  111. }
  112. private func setupSearchTextField() {
  113. let imageview = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
  114. self.searchTextField.leftView = imageview
  115. self.searchTextField.leftViewMode = .always
  116. self.searchTextField.addTarget(self, action: #selector(search(sender:)), for: UIControlEvents.editingChanged)
  117. }
  118. @objc func search(sender: UITextField) {
  119. let searchText = sender.text!
  120. self.presenter?.search(text: searchText)
  121. }
  122. private func setupDelegates() {
  123. self.tableView.delegate = self
  124. self.tableView.dataSource = self
  125. }
  126. }
  127. // MARK: TransactionHistoryViewInterface
  128. extension TransactionHistoryViewController: TransactionHistoryViewInterface {
  129. func showLoading() {
  130. self.showProgressHud()
  131. }
  132. func hideLoading() {
  133. self.hideProgressHud()
  134. }
  135. func show(error: String) {
  136. self.alert(message: error)
  137. }
  138. func show(models: [TransactionModel]) {
  139. self.transactions = models
  140. }
  141. }
  142. // MARK: TableViewDelegate
  143. extension TransactionHistoryViewController: UITableViewDelegate {
  144. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  145. self.presenter?.showDetailOf(index: indexPath.row)
  146. }
  147. }
  148. // MARK: TableViewDatasource
  149. extension TransactionHistoryViewController: UITableViewDataSource {
  150. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  151. return transactions.count
  152. }
  153. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  154. let cell = tableView.dequeueReusableCell(withIdentifier: "TransactionHistoryTableViewCell") as! TransactionHistoryTableViewCell
  155. cell.model = self.transactions.elementAt(index: indexPath.row)
  156. cell.setup()
  157. return cell
  158. }
  159. }