2 // ListViewController.swift
5 // Created by Pawel Dabrowski on 15/09/2018.
6 // Copyright © 2018 Fundacja Nowoczesna Polska. All rights reserved.
11 enum ListViewControllerType{
21 return "\(self)".localized
24 var emptyTitle: String{
25 return "\(self)_empty_list".localized
28 var canLoadMore: Bool{
30 case .reading_now, .audiobooks, .news, .favourites, .completed:
37 var menuItem: MenuItem? {
55 class ListViewController: MainViewController {
57 @IBOutlet weak var footerViewActivityIndicator: UIActivityIndicatorView!
58 @IBOutlet weak var tableView: UITableView!
59 @IBOutlet weak var noDataLabel: UILabel!
60 @IBOutlet weak var refreshDataButton: ActivityIndicatorButton!
62 var currentParams = FilterBooksParameters()
63 var canLoadMore = false
64 var loadingMore = false
65 var dataSource: [Any]!
66 var listViewControllerType: ListViewControllerType!
68 override func name() -> String {
69 return "\(listViewControllerType!)List"
72 override func viewDidLoad() {
74 if listViewControllerType! == .audiobooks {
75 navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "navbar_search"), style: .plain, target: self, action: #selector(presentSearch))
78 title = listViewControllerType.title
80 noDataLabel.text = listViewControllerType.emptyTitle
81 noDataLabel.isHidden = true
83 refreshDataButton.tintColor = .black
86 refreshDataButton.setIndicatorButtonState(state: .hidden)
87 if dataSource.count == 0{
92 func setupTableView(){
93 tableView.separatorStyle = .none
94 tableView.delegate = self
95 tableView.dataSource = self
96 tableView.rowHeight = 137
97 var insets = tableView.contentInset
99 tableView.contentInset = insets
100 footerViewActivityIndicator.color = Constants.Colors.darkGreenBgColor()
101 footerViewActivityIndicator.hidesWhenStopped = true
104 @objc func presentSearch() {
105 appDelegate.mainNavigator.presentSearch()
108 @IBAction func refreshDataButtonAction(_ sender: Any) {
109 loadData(more: false)
112 func getLastObjectAfterParameter() -> String? {
113 assertionFailure("This method should be overriden")
117 func getTableViewCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
118 assertionFailure("This method should be overriden")
119 return UITableViewCell()
122 func didSelectRow(row: Int) {
123 assertionFailure("This method should be overriden")
126 func loadData(more: Bool){
130 currentParams.after = getLastObjectAfterParameter()
133 noDataLabel.isHidden = true
134 footerViewActivityIndicator.startAnimating()
136 syncManager.getDataForListType(listViewControllerType: listViewControllerType, params: listViewControllerType.canLoadMore ? currentParams : nil) { [weak self] (result) in
138 guard let strongSelf = self else{
142 strongSelf.loadingMore = false
143 strongSelf.footerViewActivityIndicator.stopAnimating()
146 case .success(let model):
148 let array = model as! [Any]
149 strongSelf.canLoadMore =
150 strongSelf.listViewControllerType.canLoadMore
151 && array.count == FilterBooksParameters.SEARCH_ITEMS_COUNT
152 strongSelf.dataSource.append(contentsOf: array)
153 strongSelf.refreshDataButton.setIndicatorButtonState(state: .hidden)
155 strongSelf.noDataLabel.isHidden = strongSelf.dataSource.count > 0
156 strongSelf.tableView.reloadData()
158 case .failure/*(let error)*/:
159 if strongSelf.dataSource.count > 0{
160 strongSelf.canLoadMore = false
161 strongSelf.refreshDataButton.setIndicatorButtonState(state: .hidden)
164 strongSelf.refreshDataButton.setIndicatorButtonState(state: .button)
171 extension ListViewController: UITableViewDataSource{
172 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
173 return dataSource.count
176 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
178 return getTableViewCell(tableView: tableView, indexPath: indexPath)
181 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
182 if indexPath.row > 0 && indexPath.row == (dataSource.count-1) && canLoadMore && !loadingMore{
183 let _ = loadData(more: true)
188 extension ListViewController: UITableViewDelegate{
189 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
190 tableView.deselectRow(at: indexPath, animated: true)
191 didSelectRow(row: indexPath.row)