-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCalendarNotification.swift
179 lines (156 loc) · 4.9 KB
/
CalendarNotification.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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
//
// CalendarNotification.swift
// PreSales-Huddle
//
// Created by Vinaya Mandke on 22/07/15.
// Copyright (c) 2015 synerzip. All rights reserved.
//
import EventKit
import Dispatch
class CalendarNotification {
var status = EKAuthorizationStatus.NotDetermined
var allowed: Bool {
get {
switch status {
case EKAuthorizationStatus.Authorized: return true
default: return false
}
}
}
let store = EKEventStore()
var calendar: EKCalendar? {
get {
if allowed {
return findCalendarByTitle(EKEventStore(), title: "Calendar")!
} else {
return nil
}
}
}
var prospectID: Int?
private let defaults = NSUserDefaults.standardUserDefaults()
var user : String {
get {
return defaults.objectForKey("userID") as! String
}
}
var userCalId: String {
get {
return user + "-\(prospectID)"
}
}
var userCalendarEvents = [String:String]() {
didSet {
defaults.setObject(userCalendarEvents, forKey: user + "--CalNotifications")
}
}
var semaphore = dispatch_semaphore_create(0)
private let concurrentSaveNotification = dispatch_queue_create(
"com.synerzip.PreSalesHuddle.saveNotification", DISPATCH_QUEUE_CONCURRENT)
// MARK: AUTH
func requestAuth(){
if status == EKAuthorizationStatus.NotDetermined {
let store = EKEventStore()
store.requestAccessToEntityType(EKEntityTypeEvent, completion: { (granted, error: NSError?) -> Void in
if granted {
self.status = EKAuthorizationStatus.Authorized
} else {
self.status = EKAuthorizationStatus.Denied
}
dispatch_semaphore_signal(self.semaphore)
})
}
else {
dispatch_semaphore_signal(self.semaphore)
}
}
func getAuthStatus() -> EKAuthorizationStatus {
return EKEventStore.authorizationStatusForEntityType(EKEntityTypeEvent)
}
// MARK: EKCalendar
func findCalendarByTitle(store: EKEventStore, title: String) -> EKCalendar? {
let calendars = store.calendarsForEntityType(EKEntityTypeEvent) as! [EKCalendar]
for calendar in calendars {
if calendar.title == title {
return calendar
}
}
return nil
}
// MARK: Update Entries
private func updateCalendarEntryStartDate(event: EKEvent, startDate: NSDate) -> Bool {
event.startDate = startDate
return (saveEvent(event) != nil)
}
private func updateCalendarEntryEndDate(event: EKEvent, endDate: NSDate) -> Bool {
event.endDate = endDate
return (saveEvent(event) != nil)
}
private func updateCalendarEntryTitle(event: EKEvent, title: String) -> Bool {
event.title = title
return (saveEvent(event) != nil)
}
private func addNotesToCalendarEntry(eventIdentifier: String, notes: String) -> Bool {
if let event = store.eventWithIdentifier(eventIdentifier) {
event.notes = notes
return true
}
return false
}
// MARK: Save Event
private func saveEvent(event: EKEvent) -> EKEvent? {
var error: NSError?
let result = store.saveEvent(event, span: EKSpanThisEvent, error: &error)
if result == false {
if let theError = error {
println("An error occured \(theError)")
println("\(event)")
}
return nil
}
userCalendarEvents[userCalId] = event.eventIdentifier
return event
}
private func addInCalendar(title: String, startDate: NSDate, endDate: NSDate) -> Bool {
let event = EKEvent(eventStore: store)
if let cal = calendar {
event.calendar = cal
event.title = title
event.startDate = startDate
event.endDate = endDate
return (saveEvent(event) != nil)
}
return false
}
private func getUserCalendarEvents() -> [String:String] {
if let userEvents: AnyObject = defaults.objectForKey(user + "--CalNotifications") {
return userEvents as! [String : String]
} else {
return [String:String]()
}
}
func addEntry(prospID: Int, title: String, startDate: NSDate, endDate: NSDate) -> Bool {
requestAuth()
prospectID = prospID
userCalendarEvents = getUserCalendarEvents()
var done:Bool
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER)
// check if this is aldready in notifications
if userCalendarEvents[userCalId] == nil {
// need to add notification
done = addInCalendar(title, startDate: startDate, endDate: endDate)
} else {
let eventID = self.userCalendarEvents[userCalId]!
//update
if let event = self.store.eventWithIdentifier(eventID) {
done = updateCalendarEntryEndDate(event, endDate: endDate)
done = updateCalendarEntryStartDate(event, startDate: startDate)
done = updateCalendarEntryTitle(event, title: title)
} else {
userCalendarEvents[userCalId] = nil
done = addInCalendar(title, startDate: startDate, endDate: endDate)
}
}
return done
}
}