forked from fossasia/open-event-attendee-ios
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEventsBaseListViewController.swift
133 lines (114 loc) · 4.93 KB
/
EventsBaseListViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//
// EventsBaseListViewController.swift
// FOSSAsia
//
// Created by Jurvis Tan on 12/2/16.
// Copyright © 2016 FossAsia. All rights reserved.
//
import UIKit
import Pages
class EventsBaseListViewController: UIViewController, EventListBrowsingByDate, UIViewControllerPreviewingDelegate {
fileprivate var collapseDetailViewController = true
weak var pagesVC: PagesController!
@IBOutlet weak var pagingView: SchedulePagingView!
var currentViewController: EventsBaseViewController! {
didSet {
self.registerForPreviewing(with: self, sourceView: currentViewController.tableView)
currentViewController.delegate = self
}
}
var viewModel: EventsListViewModel? {
didSet {
viewModel?.allSchedules.observe {
[unowned self] in
guard $0.count > 0 else {
return
}
self.onViewModelScheduleChange($0)
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
viewModel = getEventsListViewModel()
pagingView.delegate = self
navigationController?.splitViewController?.delegate = self
splitViewController?.preferredDisplayMode = .allVisible
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "EventsPageViewController") {
if let embeddedPageVC = segue.destination as? PagesController {
self.pagesVC = embeddedPageVC
let storyboard = UIStoryboard(name: LoadingViewController.StoryboardConstants.storyboardName, bundle: nil)
let loadingVC = storyboard.instantiateViewController(withIdentifier: LoadingViewController.StoryboardConstants.viewControllerId)
self.pagesVC.add([loadingVC])
self.pagesVC.enableSwipe = false
self.pagesVC.pagesDelegate = self
}
}
}
func onViewModelScheduleChange(_ newSchedule: [ScheduleViewModel]) {
let viewControllers = newSchedule.map { viewModel in
return ScheduleViewController.scheduleViewControllerFor(viewModel)
}
self.pagesVC.add(viewControllers)
}
}
// MARK: - ScheduleViewControllerDelegate Conformance {
extension EventsBaseListViewController: ScheduleViewControllerDelegate {
func eventDidGetSelected(_ tableView: UITableView, atIndexPath: IndexPath) {
collapseDetailViewController = false
}
}
// MARK: - UISplitViewControllerDelegate Conformance
extension EventsBaseListViewController: UISplitViewControllerDelegate {
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
return collapseDetailViewController
}
}
// MARK: - UIViewControllerPreviewingDelegate Conformance
extension EventsBaseListViewController {
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = self.currentViewController.tableView.indexPathForRow(at: location) else {
return nil
}
let eventVM = self.currentViewController.eventViewModelForIndexPath(indexPath)
if let eventCell = self.currentViewController.tableView.cellForRow(at: indexPath) {
previewingContext.sourceRect = eventCell.frame
}
let eventVC = EventViewController.eventViewControllerForEvent(eventVM)
return eventVC
}
@objc(previewingContext:commitViewController:) func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
navigationController?.pushViewController(viewControllerToCommit, animated: true)
}
}
extension EventsBaseListViewController {
func nextButtonDidPress(_ sender: SchedulePagingView) {
self.pagesVC.moveForward()
}
func prevButtonDidPress(_ sender: SchedulePagingView) {
self.pagesVC.moveBack()
}
func pageViewController(_ pageViewController: UIPageViewController, setViewController viewController: UIViewController, atPage page: Int) {
guard let currentVC = viewController as? EventsBaseViewController else {
return
}
pagingView.dateLabel.text = ((currentVC.viewModel?.date.value)! as NSDate).formattedDate(withFormat: "EEEE, MMM dd")
// Govern Previous Button
if page == 1 {
pagingView.prevButton.isEnabled = false
} else {
pagingView.prevButton.isEnabled = true
}
// Govern Next Button
if let scheduleViewModels = viewModel {
if page == scheduleViewModels.count.value {
pagingView.nextButton.isEnabled = false
} else {
pagingView.nextButton.isEnabled = true
}
}
self.currentViewController = currentVC
}
}