added iOS source code
[wl-app.git] / iOS / WolneLektury / Screens / Menu / MenuViewController.swift
1 //
2 //  MenuViewController.swift
3 //  WolneLektury
4 //
5 //  Created by Pawel Dabrowski on 29/05/2018.
6 //  Copyright © 2018 Fundacja Nowoczesna Polska. All rights reserved.
7 //
8
9 import UIKit
10 import OAuthSwift
11 import SafariServices
12
13 class MenuViewController: UIViewController {
14
15     @IBOutlet weak var tableView: UITableView!
16     
17     var cellsArray: [WLTableViewCell]!
18     var loggedIn = false
19     
20     @IBOutlet weak var bottomView: UIView!
21     @IBOutlet weak var bottomViewBgView: UIView!
22
23     @IBOutlet weak var guestBottomView: UIView!
24     @IBOutlet weak var loginButton: UIButton!
25     
26     @IBOutlet weak var userBottomView: UIView!
27     @IBOutlet weak var loggedInLabel: UILabel!
28     @IBOutlet weak var logoutButton: UIButton!
29     
30     @IBOutlet weak var bottomViewHeightConstraint: NSLayoutConstraint!
31     
32     var selectedRow: IndexPath?
33     var wlRow: Int = 0
34     var firstAppear = true
35     override func viewDidLoad() {
36         super.viewDidLoad()
37         tableView.separatorStyle = .none
38
39         var contentInset = tableView.contentInset
40         contentInset.top = 10
41         tableView.contentInset = contentInset
42         
43         loginButton.text = "menu_login".localized
44         logoutButton.text = "sign_out".localized
45         loginButton.layer.cornerRadius = 15
46         loginButton.layer.borderColor = UIColor.white.cgColor
47         loginButton.layer.borderWidth = 1
48         logoutButton.layer.cornerRadius = 15
49         logoutButton.layer.borderColor = UIColor.white.cgColor
50         logoutButton.layer.borderWidth = 1
51
52         bottomView.backgroundColor = Constants.Colors.menuTintColor()
53         bottomViewBgView.backgroundColor = Constants.Colors.menuTintColor()
54
55         
56         setup()
57         
58         appDelegate.sideMenuNavigationController = self.navigationController
59         
60     }
61     
62     override func viewDidAppear(_ animated: Bool) {
63         super.viewDidAppear(animated)
64         if firstAppear{
65             tableView.selectRow(at: IndexPath(row: wlRow, section: 0), animated: false, scrollPosition: .none)
66             firstAppear = false
67         }
68     }
69     func setup() {
70         if syncManager.isLoggedIn(){
71             cellsArray = [WLTableViewCell]()
72             
73             if DatabaseManager.shared.isUserPremium() == false && Constants.donateEnabled{
74                 cellsArray.append(MenuSupportUsTableViewCell.instance(delegate: self))
75             }
76             
77             if selectedRow == nil {
78                 selectedRow = IndexPath(row: cellsArray.count, section: 0)
79                 tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
80             }
81
82             cellsArray.append(MenuTableViewCell.instance(menuItem: .wolne_lektury))
83             wlRow = cellsArray.count - 1
84             cellsArray.append(MenuLineTableViewCell.instance())
85             if Constants.donateEnabled {
86                 cellsArray.append(MenuTableViewCell.instance(menuItem: .premium))
87             }
88             cellsArray.append(MenuTableViewCell.instance(menuItem: .catalog))
89             cellsArray.append(MenuTableViewCell.instance(menuItem: .audiobooks))
90             cellsArray.append(MenuTableViewCell.instance(menuItem: .reading))
91             cellsArray.append(MenuTableViewCell.instance(menuItem: .favourites))
92             cellsArray.append(MenuTableViewCell.instance(menuItem: .completed))
93             cellsArray.append(MenuLineTableViewCell.instance())
94             cellsArray.append(MenuTableViewCell.instance(menuItem: .downloaded))
95             cellsArray.append(MenuLineTableViewCell.instance())
96             cellsArray.append(MenuTableViewCell.instance(menuItem: .news))
97             cellsArray.append(MenuTableViewCell.instance(menuItem: .settings))
98             cellsArray.append(MenuTableViewCell.instance(menuItem: .about))
99             
100         }
101         else{
102             cellsArray = [WLTableViewCell]()
103             
104             if Constants.donateEnabled {
105                 cellsArray.append(MenuSupportUsTableViewCell.instance(delegate: self))
106             }
107
108             if selectedRow == nil {
109                 selectedRow = IndexPath(row: cellsArray.count, section: 0)
110                 tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
111             }
112
113             cellsArray.append(MenuTableViewCell.instance(menuItem: .wolne_lektury))
114             wlRow = cellsArray.count - 1
115             cellsArray.append(MenuLineTableViewCell.instance())
116             if Constants.donateEnabled {
117                 cellsArray.append(MenuTableViewCell.instance(menuItem: .premium))
118             }
119             
120             cellsArray.append(MenuTableViewCell.instance(menuItem: .catalog))
121             cellsArray.append(MenuTableViewCell.instance(menuItem: .audiobooks))
122             cellsArray.append(MenuLineTableViewCell.instance())
123             cellsArray.append(MenuTableViewCell.instance(menuItem: .downloaded))
124             cellsArray.append(MenuLineTableViewCell.instance())
125             cellsArray.append(MenuTableViewCell.instance(menuItem: .news))
126             cellsArray.append(MenuTableViewCell.instance(menuItem: .settings))
127             cellsArray.append(MenuTableViewCell.instance(menuItem: .about))
128         }
129         tableView.reloadData()
130         
131         refreshBottomView()
132     }
133     
134     func selectItem(menuItem: MenuItem){
135         var index = 0
136         for cell in cellsArray {
137             if let cell = cell as? MenuTableViewCell, cell.menuItem == menuItem {
138                 tableView.selectRow(at: IndexPath(row: index, section: 0), animated: false, scrollPosition: .none)
139                 return
140             }
141             index += 1
142         }
143     }
144     
145     func refreshBottomView() {
146         
147         userBottomView.isHidden = true
148         guestBottomView.isHidden = true
149         
150         if syncManager.isLoggedIn(){
151             
152             var titleText = NSMutableAttributedString(string: "")
153             
154             if let user = DatabaseManager.shared.rlmApplication?.user {
155                 
156                 titleText = NSMutableAttributedString(attributedString: NSAttributedString(string: "logged_as".localized + "\n", font: UIFont.systemFont(ofSize: 10)))
157                 titleText.append(NSAttributedString(string: user.username, font: UIFont.systemFont(ofSize: 12)))
158                 loggedInLabel.attributedText = titleText
159             }
160
161             userBottomView.isHidden = false
162             bottomViewHeightConstraint.constant = userBottomView.frame.size.height
163         }
164         else{
165             guestBottomView.isHidden = false
166             bottomViewHeightConstraint.constant = guestBottomView.frame.size.height
167         }
168     }
169     
170     func getPreview() {
171         appDelegate.showWindowHud()
172         syncManager.getPreview { [weak self] (result) in
173             
174             guard let strongSelf = self else { return }
175             strongSelf.appDelegate.hideWindowHud()
176             switch result {
177             case .success(let model):
178                 let array = model as! [BookModel]
179                 if array.count > 0 {
180                     let book = array[0]
181                     
182                     strongSelf.appDelegate.mainNavigator.presentPremiumBook(bookSlug: book.slug)
183                 }
184                 else {
185                     strongSelf.presentNoPremiereAlert()
186                 }
187                 
188             case .failure/*(let error)*/:
189                 strongSelf.presentToast(message: "fetching_premium_failed".localized)
190             }
191         }
192     }
193     
194     func presentNoPremiereAlert() {
195     
196         let message = syncManager.isLoggedIn() ? "no_prapremiere_message_logged".localized : "no_prapremiere_message".localized
197         
198         let alertController = UIAlertController(
199             title: "no_prapremiere_title".localized,
200             message: message,
201             preferredStyle: UIAlertControllerStyle.alert
202         )
203         
204         if syncManager.isLoggedIn() {
205             let action = UIAlertAction(title: "OK".localized, style: UIAlertActionStyle.cancel, handler: nil)
206             alertController.addAction(action)
207         }
208         else{
209             let cancelAction = UIAlertAction(title: "no_thanks".localized, style: UIAlertActionStyle.cancel, handler: nil)
210             alertController.addAction(cancelAction)
211             
212             let okAction = UIAlertAction(title: "become_a_friend".localized, style: UIAlertActionStyle.default) { [weak self]
213                 (result : UIAlertAction) -> Void in
214                 self?.onBecomeAFriendClick()
215             }
216             alertController.addAction(okAction)
217         }
218         present(alertController, animated: true, completion: nil)
219     }
220     
221     func onBecomeAFriendClick() {
222         if syncManager.isLoggedIn() {
223             showPremiumForm()
224         }
225         else {
226             showLoginFirst()
227         }
228     }
229     
230     func showPremiumForm() {
231         showPayPalForm()
232     }
233     
234     func showPayPalForm() {
235         
236         if syncManager.isLoggedIn() {
237             appDelegate.mainNavigator.presentPayPalForm()
238         }
239         else {
240             presentToast(message: "login_first".localized)
241         }
242     }
243     
244     func showLoginFirst() {
245         
246         let alertController = UIAlertController(
247             title: "login".localized,
248             message: "login_first".localized,
249             preferredStyle: UIAlertControllerStyle.alert
250         )
251         
252         let cancelAction = UIAlertAction(title: "no_thanks".localized, style: UIAlertActionStyle.cancel, handler: nil)
253         alertController.addAction(cancelAction)
254         
255         let loginAction = UIAlertAction(title: "login".localized, style: UIAlertActionStyle.default) { [weak self]
256             (result : UIAlertAction) -> Void in
257             self?.onLoginClicked()
258         }
259         alertController.addAction(loginAction)
260
261         self.present(alertController, animated: true, completion: nil)
262     }
263     
264     func onLoginClicked() {
265         appDelegate.login(fromViewController: self)
266     }
267
268     deinit {
269         print("deinit")
270         appDelegate.sideMenuNavigationController = nil
271     }
272     
273     @IBAction func logoutButtonAction(_ sender: Any) {
274         syncManager.logout()
275         appDelegate.mainNavigator.reset()
276     }
277     
278     @IBAction func loginButtonAction(_ sender: Any) {
279         onLoginClicked()
280     }
281 }
282
283 extension MenuViewController: UITableViewDataSource{
284     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
285         return cellsArray[indexPath.row]
286     }
287     
288     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
289         return cellsArray.count
290     }
291     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
292         return cellsArray[indexPath.row].getHeight()
293     }
294 }
295
296 extension MenuViewController: UITableViewDelegate{
297     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
298         
299         if let cell = cellsArray[indexPath.row] as? MenuTableViewCell{
300             switch cell.menuItem{
301             case .wolne_lektury:
302                 appDelegate.mainNavigator.presentLibrary(dismissSideMenu: true)
303             case .premium:
304                 getPreview()
305                 if let selectedRow = selectedRow{
306                     tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
307                 }
308                 return
309             case .audiobooks:
310                 appDelegate.mainNavigator.presentBookList(listViewControllerType: .audiobooks)
311             case .downloaded:
312                 appDelegate.mainNavigator.presentDownloaded()
313             case .catalog:
314                 appDelegate.mainNavigator.presentSearch()
315             case .news:
316                 appDelegate.mainNavigator.presentNews()
317             case .settings:
318                 appDelegate.mainNavigator.presentSettings()
319             case .about:
320                 appDelegate.mainNavigator.presentAbout()
321             case .reading:
322                 appDelegate.mainNavigator.presentBookList(listViewControllerType: .reading_now)
323             case .favourites:
324                 appDelegate.mainNavigator.presentBookList(listViewControllerType: .favourites)
325             case .completed:
326                 appDelegate.mainNavigator.presentBookList(listViewControllerType: .completed)
327             default:
328                 break
329             }
330             selectedRow = indexPath
331         }
332         else if cellsArray[indexPath.row] is MenuSupportUsTableViewCell{
333             selectedRow = indexPath
334         }
335         else {
336             if let selectedRow = selectedRow{
337                 tableView.selectRow(at: selectedRow, animated: false, scrollPosition: .none)
338             }
339         }
340     }
341 }
342
343 extension MenuViewController: MenuSupportUsTableViewCellDelegate{
344     func menuSupportUsButtonTapped(){
345         appDelegate.mainNavigator.presentSupportUs()
346     }
347 }
348