forked from fossasia/open-event-attendee-ios
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScheduleViewController.swift
128 lines (108 loc) · 4.97 KB
/
ScheduleViewController.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
//
// FirstViewController.swift
// FOSSAsia
//
// Created by Jurvis Tan on 29/1/16.
// Copyright © 2016 FossAsia. All rights reserved.
//
import UIKit
import MGSwipeTableCell
class ScheduleViewController: EventsBaseViewController, SwipeToFavoriteCellPresentable, TableViewRefreshable {
var refreshControl : UIRefreshControl!
// Constants for Storyboard/VC
struct StoryboardConstants {
static let storyboardName = "ScheduleVC"
static let viewControllerId = String(describing: ScheduleViewController.self)
}
lazy var filteredEvents: [EventViewModel] = self.allEvents
var filterString: String? = nil {
didSet {
if filterString == nil || filterString!.isEmpty {
filteredEvents = self.allEvents
} else {
let filterPredicate = NSPredicate(format: "self contains[c] %@", argumentArray: [filterString!])
filteredEvents = allEvents.filter({filterPredicate.evaluate(with: $0.eventName) })
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
viewModel?.delegate = self
DispatchQueue.main.async {
self.refreshControl = UIRefreshControl()
self.refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.refreshControl.addTarget(self, action: #selector(ScheduleViewController.refreshData(_:)), for: .valueChanged)
self.tableView.addSubview(self.refreshControl)
}
}
class func scheduleViewControllerFor(_ schedule: ScheduleViewModel) -> ScheduleViewController {
let storyboard = UIStoryboard(name: ScheduleViewController.StoryboardConstants.storyboardName, bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: ScheduleViewController.StoryboardConstants.viewControllerId) as! ScheduleViewController
viewController.viewModel = schedule
return viewController
}
@objc func refreshData(_ sender: AnyObject) {
viewModel?.refresh()
}
}
extension ScheduleViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
guard searchController.isActive else {
return
}
filterString = searchController.searchBar.text
}
}
extension ScheduleViewController {
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: EventsBaseViewController.kEventCellReuseIdentifier, for: indexPath) as! EventCell
let eventViewModel = allEvents[(indexPath as NSIndexPath).row]
cell.configure(withPresenter: eventViewModel)
cell.delegate = self
return cell
}
}
// MARK: - SwipeToFavoriteCellPresentable Conformance
extension ScheduleViewController {
func favoriteEvent(_ indexPath: IndexPath) {
weak var me = self
let eventViewModel = me!.eventViewModelForIndexPath(indexPath)
eventViewModel.favoriteEvent { (eventViewModel, error) -> Void in
if error == nil {
self.tableView.reloadData()
}
}
}
func swipeTableCell(_ cell: MGSwipeTableCell!, swipeButtonsFor direction: MGSwipeDirection, swipeSettings: MGSwipeSettings!, expansionSettings: MGSwipeExpansionSettings!) -> [AnyObject]! {
swipeSettings.transition = .border
expansionSettings.buttonIndex = 0
weak var me = self
let eventViewModel = me!.eventViewModelForIndexPath(me!.tableView.indexPath(for: cell)!)
if direction == .leftToRight {
expansionSettings.fillOnTrigger = false
expansionSettings.threshold = 2
let faveButton = MGSwipeButton(title: "", icon: (eventViewModel.isFavorite ? UIImage(named: "cell_favorite_selected") : UIImage(named: "cell_favorite")), backgroundColor: Colors.favoriteOrangeColor!) { (sender: MGSwipeTableCell!) -> Bool in
if let sessionCell = sender as? EventCell {
UIView.animate(withDuration: 0.3, animations: { () -> Void in
if (eventViewModel.isFavorite) {
sessionCell.favoriteImage.transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
sessionCell.favoriteImage.alpha = 0.0
} else {
sessionCell.favoriteImage.transform = CGAffineTransform.identity
sessionCell.favoriteImage.alpha = 1.0
}
}, completion: { (done) -> Void in
if done {
self.favoriteEvent(me!.tableView.indexPath(for: cell)!)
}
})
}
return true
}
faveButton.setPadding(CGFloat(20))
cell.leftButtons = [faveButton]
return [faveButton]
}
return nil
}
}