// // ListViewController.swift // WolneLektury // // Created by Pawel Dabrowski on 15/09/2018. // Copyright © 2018 Fundacja Nowoczesna Polska. All rights reserved. // import UIKit enum ListViewControllerType{ case newest case recommended case reading_now case audiobooks case news case favourites case completed var title: String{ return "\(self)".localized } var emptyTitle: String{ return "\(self)_empty_list".localized } var canLoadMore: Bool{ switch self { case .reading_now, .audiobooks, .news, .favourites, .completed: return true default: return false } } var menuItem: MenuItem? { switch self { case .reading_now: return .reading case .audiobooks: return .audiobooks case .news: return .news case .favourites: return .favourites case .completed: return .completed default: return nil } } } class ListViewController: MainViewController { @IBOutlet weak var footerViewActivityIndicator: UIActivityIndicatorView! @IBOutlet weak var tableView: UITableView! @IBOutlet weak var noDataLabel: UILabel! @IBOutlet weak var refreshDataButton: ActivityIndicatorButton! var currentParams = FilterBooksParameters() var canLoadMore = false var loadingMore = false var dataSource: [Any]! var listViewControllerType: ListViewControllerType! override func name() -> String { return "\(listViewControllerType!)List" } override func viewDidLoad() { super.viewDidLoad() if listViewControllerType! == .audiobooks { navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "navbar_search"), style: .plain, target: self, action: #selector(presentSearch)) } title = listViewControllerType.title noDataLabel.text = listViewControllerType.emptyTitle noDataLabel.isHidden = true refreshDataButton.tintColor = .black setupTableView() refreshDataButton.setIndicatorButtonState(state: .hidden) if dataSource.count == 0{ loadData(more: false) } } func setupTableView(){ tableView.separatorStyle = .none tableView.delegate = self tableView.dataSource = self tableView.rowHeight = 137 var insets = tableView.contentInset insets.top = 11 tableView.contentInset = insets footerViewActivityIndicator.color = Constants.Colors.darkGreenBgColor() footerViewActivityIndicator.hidesWhenStopped = true } @objc func presentSearch() { appDelegate.mainNavigator.presentSearch() } @IBAction func refreshDataButtonAction(_ sender: Any) { loadData(more: false) } func getLastObjectAfterParameter() -> String? { assertionFailure("This method should be overriden") return nil } func getTableViewCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell { assertionFailure("This method should be overriden") return UITableViewCell() } func didSelectRow(row: Int) { assertionFailure("This method should be overriden") } func loadData(more: Bool){ if more{ loadingMore = true currentParams.after = getLastObjectAfterParameter() } noDataLabel.isHidden = true footerViewActivityIndicator.startAnimating() syncManager.getDataForListType(listViewControllerType: listViewControllerType, params: listViewControllerType.canLoadMore ? currentParams : nil) { [weak self] (result) in guard let strongSelf = self else{ return } strongSelf.loadingMore = false strongSelf.footerViewActivityIndicator.stopAnimating() switch result { case .success(let model): let array = model as! [Any] strongSelf.canLoadMore = strongSelf.listViewControllerType.canLoadMore && array.count == FilterBooksParameters.SEARCH_ITEMS_COUNT strongSelf.dataSource.append(contentsOf: array) strongSelf.refreshDataButton.setIndicatorButtonState(state: .hidden) strongSelf.noDataLabel.isHidden = strongSelf.dataSource.count > 0 strongSelf.tableView.reloadData() case .failure/*(let error)*/: if strongSelf.dataSource.count > 0{ strongSelf.canLoadMore = false strongSelf.refreshDataButton.setIndicatorButtonState(state: .hidden) } else{ strongSelf.refreshDataButton.setIndicatorButtonState(state: .button) } } } } } extension ListViewController: UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ return dataSource.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ return getTableViewCell(tableView: tableView, indexPath: indexPath) } func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row > 0 && indexPath.row == (dataSource.count-1) && canLoadMore && !loadingMore{ let _ = loadData(more: true) } } } extension ListViewController: UITableViewDelegate{ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) didSelectRow(row: indexPath.row) } }