NewsVC.swift 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. //
  2. // NewsVC.swift
  3. // Sirani
  4. //
  5. // Created by Anhar Solehudin on 06/04/19.
  6. // Copyright © 2019 Anhar Solehudin. All rights reserved.
  7. //
  8. import UIKit
  9. class NewsVC: UIViewController {
  10. // Outlets
  11. @IBOutlet weak var newsTV: UITableView!
  12. @IBOutlet weak var layoutNoData: UIView!
  13. @IBOutlet weak var progressLoading: UIView!
  14. // Segue
  15. private let unwindToHomeId = "unwindNewsToHomeSegueId"
  16. private let detailSegueId = "newsDetailSegueId"
  17. private let searchSegueId = "searchNewsSegueId"
  18. // View Id
  19. private let newsCellId = "NewsListCellId"
  20. // Constant Values
  21. private let alertNoConnectionTitle = "Informasi"
  22. private let alertNoConnectionMsg = "Sepertinya Anda sedang tidak tersambung pada koneksi internet"
  23. private let alertNoConnectionActionYes = "OK"
  24. // Initialize
  25. private var presenter: NewsPresenter!
  26. private var dataList = [News]()
  27. // Request Params
  28. private var jenis: String = ""
  29. private var columns: String = ""
  30. private var keyword: String = ""
  31. private var cursor: Int = 0
  32. private var prev: Int = 1
  33. // Others
  34. private var loading = false
  35. private var lastDataLoadedEmpty = false
  36. private var selectedNewsId = 0
  37. private var loadMore = false
  38. // View Lifecycles
  39. override var preferredStatusBarStyle: UIStatusBarStyle {
  40. return .lightContent
  41. }
  42. override func viewDidLoad() {
  43. super.viewDidLoad()
  44. newsTV.delegate = self
  45. newsTV.dataSource = self
  46. let footer = UIView()
  47. footer.backgroundColor = #colorLiteral(red: 0.9814968705, green: 0.9760531783, blue: 1, alpha: 1)
  48. newsTV.tableFooterView = footer
  49. presenter = NewsPresenter(siraniApiServices: SiraniApiServices())
  50. presenter.attachView(view: self)
  51. loadData()
  52. }
  53. override func viewWillAppear(_ animated: Bool) {
  54. presenter.attachView(view: self)
  55. }
  56. override func viewDidDisappear(_ animated: Bool) {
  57. presenter.detachView()
  58. }
  59. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  60. if let detailsVC = segue.destination as? NewsDetailVC {
  61. detailsVC.newsId = selectedNewsId
  62. detailsVC.segueId = detailsVC.SEGUE_NEWS_LIST_ID
  63. }
  64. if let searchVC = segue.destination as? SearchNewsVC {
  65. searchVC.delegate = self
  66. }
  67. }
  68. // private functions
  69. private func loadData() {
  70. if !loading && !lastDataLoadedEmpty {
  71. if ConnectionHelper.isConnectedToNetwork() {
  72. presenter.loadData(cursor: cursor, prev: prev, jenis: jenis, columns: columns, keyword: keyword)
  73. } else {
  74. showNoConnection()
  75. }
  76. }
  77. }
  78. // Actions
  79. @IBAction func onBtnBackTap(_ sender: Any) {
  80. performSegue(withIdentifier: unwindToHomeId, sender: self)
  81. }
  82. @IBAction func onBtnSearchTap(_ sender: Any) {
  83. performSegue(withIdentifier: searchSegueId, sender: self)
  84. }
  85. @IBAction func unwindToNewsList(segue: UIStoryboardSegue) {}
  86. }
  87. // News View Delegate
  88. extension NewsVC: NewsViewDelegate {
  89. func showNoConnection() {
  90. let alertNoConnection = UIAlertController(
  91. title: alertNoConnectionTitle,
  92. message: alertNoConnectionMsg,
  93. preferredStyle: .alert
  94. )
  95. alertNoConnection.addAction(
  96. UIAlertAction(title: alertNoConnectionActionYes, style: .default, handler: nil)
  97. )
  98. self.present(alertNoConnection, animated: true, completion: nil)
  99. }
  100. func showLoading() {
  101. loading = true
  102. progressLoading.show()
  103. }
  104. func hideLoading() {
  105. loading = false
  106. progressLoading.hide()
  107. }
  108. func showNoDataLayout() {
  109. if cursor == 0 {
  110. layoutNoData.show()
  111. }
  112. }
  113. func hideNoDataLayout() {
  114. layoutNoData.hide()
  115. }
  116. func setDataList(dataList: [News]) {
  117. if cursor == 0 {
  118. layoutNoData.hide()
  119. }
  120. if dataList.count > 0 {
  121. for data in dataList {
  122. self.dataList.append(data)
  123. newsTV.beginUpdates()
  124. newsTV.insertRows(
  125. at: [IndexPath(row: self.dataList.count-1, section: 0)],
  126. with: .none
  127. )
  128. newsTV.endUpdates()
  129. }
  130. let totalData = dataList.count
  131. cursor += totalData
  132. loadMore = true
  133. } else {
  134. lastDataLoadedEmpty = true
  135. loadMore = false
  136. }
  137. }
  138. }
  139. // Table View Delegate
  140. extension NewsVC: UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate {
  141. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  142. return dataList.count
  143. }
  144. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  145. if tableView == newsTV {
  146. if let cell = tableView.dequeueReusableCell(withIdentifier: newsCellId, for: indexPath) as? NewsCell {
  147. let news = dataList[indexPath.row]
  148. cell.updateViews(news: news)
  149. return cell
  150. } else {
  151. return NewsCell()
  152. }
  153. } else {
  154. return NewsCell()
  155. }
  156. }
  157. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  158. print("KUY")
  159. let selectedNews = dataList[indexPath.row]
  160. selectedNewsId = selectedNews.id
  161. performSegue(withIdentifier: detailSegueId, sender: self)
  162. }
  163. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  164. let threshold = -5
  165. let contentOffset = scrollView.contentOffset.y
  166. let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
  167. if loadMore && !loading && (Int(maximumOffset - contentOffset) <= threshold) {
  168. loadData()
  169. }
  170. }
  171. }
  172. // Search Delegate Protocols
  173. extension NewsVC: SearchNewsDelegate {
  174. func onSearch(search: String, parameter: String, jenis: String) {
  175. presenter.attachView(view: self)
  176. loadMore = false
  177. loading = false
  178. lastDataLoadedEmpty = false
  179. self.cursor = 0
  180. self.prev = 1
  181. self.keyword = search
  182. self.jenis = jenis
  183. self.columns = parameter
  184. dataList.removeAll()
  185. newsTV.reloadData()
  186. loadData()
  187. }
  188. }