X-Git-Url: https://git.mdrn.pl/wl-app.git/blobdiff_plain/53b27422d140022594fc241cca91c3183be57bca..48b2fe9f7c2dc3d9aeaaa6dbfb27c7da4f3235ff:/iOS/WolneLektury/Screens/Common/ListViewController.swift diff --git a/iOS/WolneLektury/Screens/Common/ListViewController.swift b/iOS/WolneLektury/Screens/Common/ListViewController.swift new file mode 100644 index 0000000..a48e836 --- /dev/null +++ b/iOS/WolneLektury/Screens/Common/ListViewController.swift @@ -0,0 +1,193 @@ +// +// 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) + } +}