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.

260 lines
7.1 KiB

5 years ago
5 years ago
  1. //
  2. // OrderHistoryViewController.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon Devik Kim on 14/05/2019.
  6. //Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. import XLPagerTabStrip
  10. class OrderHistoryViewController: UIViewController {
  11. // MARK: Properties
  12. var presenter: OrderHistoryModuleInterface?
  13. private lazy var refreshControl = UIRefreshControl()
  14. private lazy var isSearch = false
  15. // MARK: Computed Properties
  16. private var orders: [Order]? {
  17. didSet {
  18. guard
  19. let orders = self.orders,
  20. orders.count != 0
  21. else {
  22. noOrderHistoryLabel.isHidden = false
  23. noOrderHistoryLabel.text = isSearch ? "no_search_orders_message_text".localized() : "no_orders_message_text".localized()
  24. tableView.reloadData()
  25. return
  26. }
  27. tableView.reloadData()
  28. noOrderHistoryLabel.isHidden = true
  29. }
  30. }
  31. // MARK: IBOutlets
  32. @IBOutlet private weak var tableView: UITableView!
  33. @IBOutlet private weak var searchBar: UISearchBar!
  34. @IBOutlet private weak var periodView: UIView!
  35. @IBOutlet private weak var perioidContentView: UIView!
  36. @IBOutlet private weak var noOrderHistoryLabel: UILabel!
  37. @IBOutlet private weak var startDateLabel: UILabel!
  38. @IBOutlet private weak var endDateLabel: UILabel!
  39. @IBOutlet private weak var orderedColorLabel: UILabel!
  40. @IBOutlet private weak var receivedColorLabel: UILabel!
  41. @IBOutlet private weak var canceledColorLabel: UILabel!
  42. @IBOutlet private weak var periodViewHeightConstraint: NSLayoutConstraint!
  43. // MARK: VC's Life cycle
  44. override func viewDidLoad() {
  45. super.viewDidLoad()
  46. setup()
  47. }
  48. override func viewWillAppear(_ animated: Bool) {
  49. super.viewWillAppear(animated)
  50. if searchBar.text == "" && startDateLabel.text == ""{
  51. isSearch = false
  52. presenter?.fetchOrders(from: "", to: "")
  53. }
  54. }
  55. override func viewWillDisappear(_ animated: Bool) {
  56. super.viewWillDisappear(animated)
  57. }
  58. // MARK: IBActions
  59. @IBAction private func touchCalendar(_ sender: UIButton) {
  60. presenter?.presentDatePicker{ [weak self] (from, to) in
  61. guard let `self` = self else { return }
  62. let originDateFormatter = DateFormatter()
  63. originDateFormatter.dateFormat = "yyyy-MM-dd"
  64. let dateFormatter = DateFormatter()
  65. dateFormatter.dateFormat = "MMM d, yyyy"
  66. guard
  67. let startDate = from,
  68. let endDate = to,
  69. let changeFormatStartDate = originDateFormatter.date(from: startDate),
  70. let changeFormatEndDate = originDateFormatter.date(from: endDate)
  71. else { return }
  72. self.startDateLabel.text = dateFormatter.string(from: changeFormatStartDate)
  73. self.endDateLabel.text = dateFormatter.string(from: changeFormatEndDate)
  74. self.setPeriodViewStatus(isHidden: false)
  75. self.searchBar.text?.removeAll()
  76. self.isSearch = true
  77. self.presenter?.fetchOrders(from: startDate, to: endDate)
  78. }
  79. }
  80. @IBAction func touchHidePerioidContentView(_ sender: Any) {
  81. startDateLabel.text?.removeAll()
  82. endDateLabel.text?.removeAll()
  83. refresh()
  84. }
  85. }
  86. // MARK: OrderHistoryViewInterface
  87. extension OrderHistoryViewController: OrderHistoryViewInterface {
  88. func setOrderHistoryModel(with model: [Order]?) {
  89. orders = model
  90. }
  91. func didFailFetchOrderHistory(with error: Error) {
  92. alert(type: .error, message: error.localizedDescription)
  93. }
  94. func stardLoading() {
  95. showProgressHud()
  96. }
  97. func endLoading() {
  98. hideProgressHud()
  99. DispatchQueue.main.asyncAfter(deadline: .now()){ [weak self] in
  100. guard let `self` = self else { return }
  101. if #available(iOS 10.0, *) {
  102. self.tableView.refreshControl?.endRefreshing()
  103. } else {
  104. self.refreshControl.endRefreshing()
  105. }
  106. }
  107. }
  108. }
  109. // MARK: Other Functions
  110. extension OrderHistoryViewController {
  111. private func setup() {
  112. initDelegate()
  113. initUI()
  114. setMultiLanguage()
  115. orderedColorLabel.layer.cornerRadius = 5
  116. receivedColorLabel.layer.cornerRadius = 5
  117. canceledColorLabel.layer.cornerRadius = 5
  118. perioidContentView.layer.cornerRadius = 10
  119. }
  120. private func setMultiLanguage(){
  121. searchBar.placeholder = "search_text".localized()
  122. orderedColorLabel.text = "ordered_text".localized()
  123. receivedColorLabel.text = "received_text".localized()
  124. canceledColorLabel.text = "canceled_text".localized()
  125. noOrderHistoryLabel.text = "no_orders_message_text".localized()
  126. }
  127. private func initDelegate(){
  128. tableView.delegate = self
  129. tableView.dataSource = self
  130. searchBar.delegate = self
  131. }
  132. private func initUI(){
  133. searchBar.layer.borderWidth = 1
  134. searchBar.layer.borderColor = UIColor.init(hex: "#F9F9F9").cgColor
  135. setPeriodViewStatus(isHidden: true)
  136. addRefreshControl()
  137. }
  138. private func addRefreshControl() {
  139. let colorOption = [NSAttributedString.Key.foregroundColor : AppConstants.themWhiteColor];
  140. let title = NSAttributedString(string: "pull to refresh", attributes: colorOption)
  141. refreshControl.attributedTitle = title
  142. refreshControl.backgroundColor = AppConstants.themeBlueColor
  143. refreshControl.tintColor = AppConstants.themWhiteColor
  144. refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
  145. if #available(iOS 10.0, *) {
  146. tableView.refreshControl = refreshControl
  147. } else {
  148. tableView.addSubview(refreshControl)
  149. }
  150. }
  151. private func setPeriodViewStatus(isHidden: Bool){
  152. periodView.isHidden = isHidden
  153. periodViewHeightConstraint.constant = isHidden ? 0.0 : 35.0
  154. }
  155. @objc
  156. private func refresh() {
  157. setPeriodViewStatus(isHidden: true)
  158. searchBar.text?.removeAll()
  159. isSearch = false
  160. presenter?.fetchOrders(from: "", to: "")
  161. }
  162. }
  163. // MARK: - XLPagerTabStrip'`s IndicatorInfoProvider
  164. extension OrderHistoryViewController: IndicatorInfoProvider {
  165. func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
  166. return IndicatorInfo.init(title: "orders_group_title_text".localized())
  167. }
  168. }
  169. // MARK: - UITableViewDataSource
  170. extension OrderHistoryViewController: UITableViewDataSource {
  171. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  172. guard let orders = self.orders else {
  173. return 0
  174. }
  175. return orders.count
  176. }
  177. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  178. guard let cell = tableView.dequeueReusableCell(withIdentifier: "OrderCell") as? OrderCell
  179. else {
  180. return UITableViewCell()
  181. }
  182. cell.setModel(with: orders?[indexPath.row])
  183. return cell
  184. }
  185. }
  186. // MARK: - UITableViewDelegate
  187. extension OrderHistoryViewController: UITableViewDelegate {
  188. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  189. presenter?.pushDetailOrder(with: orders?[indexPath.row])
  190. }
  191. }
  192. // MARK: - UISearchBarDelegate
  193. extension OrderHistoryViewController: UISearchBarDelegate {
  194. func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
  195. isSearch = true
  196. presenter?.fetchFilteredOrders(by: searchText)
  197. }
  198. }