added iOS source code
[wl-app.git] / iOS / WolneLektury / Screens / Common / ListViewController.swift
1 //
2 //  ListViewController.swift
3 //  WolneLektury
4 //
5 //  Created by Pawel Dabrowski on 15/09/2018.
6 //  Copyright © 2018 Fundacja Nowoczesna Polska. All rights reserved.
7 //
8
9 import UIKit
10
11 enum ListViewControllerType{
12     case newest
13     case recommended
14     case reading_now
15     case audiobooks
16     case news
17     case favourites
18     case completed
19
20     var title: String{
21         return "\(self)".localized
22     }
23     
24     var emptyTitle: String{
25         return "\(self)_empty_list".localized
26     }
27         
28     var canLoadMore: Bool{
29         switch self {
30         case .reading_now, .audiobooks, .news, .favourites, .completed:
31             return true
32         default:
33             return false
34         }
35     }
36     
37     var menuItem: MenuItem? {
38         switch self {
39         case .reading_now:
40             return .reading
41         case .audiobooks:
42             return .audiobooks
43         case .news:
44             return .news
45         case .favourites:
46             return .favourites
47         case .completed:
48             return .completed
49         default:
50             return nil
51         }
52     }
53 }
54
55 class ListViewController: MainViewController  {
56     
57     @IBOutlet weak var footerViewActivityIndicator: UIActivityIndicatorView!
58     @IBOutlet weak var tableView: UITableView!
59     @IBOutlet weak var noDataLabel: UILabel!
60     @IBOutlet weak var refreshDataButton: ActivityIndicatorButton!
61     
62     var currentParams =  FilterBooksParameters()
63     var canLoadMore = false
64     var loadingMore = false
65     var dataSource: [Any]!
66     var listViewControllerType: ListViewControllerType!
67     
68     override func name() -> String {
69         return "\(listViewControllerType!)List"
70     }
71     
72     override func viewDidLoad() {
73         super.viewDidLoad()
74         if listViewControllerType! == .audiobooks {
75             navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "navbar_search"), style: .plain, target: self, action: #selector(presentSearch))
76         }
77         
78         title = listViewControllerType.title
79         
80         noDataLabel.text = listViewControllerType.emptyTitle
81         noDataLabel.isHidden = true
82         
83         refreshDataButton.tintColor = .black
84         setupTableView()
85         
86         refreshDataButton.setIndicatorButtonState(state: .hidden)
87         if dataSource.count == 0{
88             loadData(more: false)
89         }
90     }
91     
92     func setupTableView(){
93         tableView.separatorStyle = .none
94         tableView.delegate = self
95         tableView.dataSource = self
96         tableView.rowHeight = 137
97         var insets = tableView.contentInset
98         insets.top = 11
99         tableView.contentInset = insets
100         footerViewActivityIndicator.color = Constants.Colors.darkGreenBgColor()
101         footerViewActivityIndicator.hidesWhenStopped = true
102     }
103     
104     @objc func presentSearch() {
105         appDelegate.mainNavigator.presentSearch()
106     }
107
108     @IBAction func refreshDataButtonAction(_ sender: Any) {
109         loadData(more: false)
110     }
111     
112     func getLastObjectAfterParameter() -> String? {
113         assertionFailure("This method should be overriden")
114         return nil
115     }
116     
117     func getTableViewCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
118         assertionFailure("This method should be overriden")
119         return UITableViewCell()
120     }
121     
122     func didSelectRow(row: Int) {
123         assertionFailure("This method should be overriden")
124     }
125     
126     func loadData(more: Bool){
127         
128         if more{
129             loadingMore = true
130             currentParams.after = getLastObjectAfterParameter()
131         }
132         
133         noDataLabel.isHidden = true
134         footerViewActivityIndicator.startAnimating()
135
136         syncManager.getDataForListType(listViewControllerType: listViewControllerType, params: listViewControllerType.canLoadMore ? currentParams : nil) { [weak self] (result) in
137             
138             guard let strongSelf = self else{
139                 return
140             }
141             
142             strongSelf.loadingMore = false
143             strongSelf.footerViewActivityIndicator.stopAnimating()
144
145             switch result {
146             case .success(let model):
147                 
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)
154                 
155                 strongSelf.noDataLabel.isHidden = strongSelf.dataSource.count > 0
156                 strongSelf.tableView.reloadData()
157                 
158             case .failure/*(let error)*/:
159                 if strongSelf.dataSource.count > 0{
160                     strongSelf.canLoadMore = false
161                     strongSelf.refreshDataButton.setIndicatorButtonState(state: .hidden)
162                 }
163                 else{
164                     strongSelf.refreshDataButton.setIndicatorButtonState(state: .button)
165                 }
166             }
167         }
168     }
169 }
170
171 extension ListViewController: UITableViewDataSource{
172     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
173         return dataSource.count
174     }
175     
176     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
177         
178         return getTableViewCell(tableView: tableView, indexPath: indexPath)
179     }
180     
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)
184         }
185     }
186 }
187
188 extension ListViewController: UITableViewDelegate{
189     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
190         tableView.deselectRow(at: indexPath, animated: true)
191         didSelectRow(row: indexPath.row)
192     }
193 }