added iOS source code
[wl-app.git] / 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 (file)
index 0000000..a48e836
--- /dev/null
@@ -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)
+    }
+}