1
1
#import " RNCalendarEvents.h"
2
2
#import " RCTConvert.h"
3
+ #import " RCTUtils.h"
3
4
#import < EventKit/EventKit.h>
4
5
5
6
@interface RNCalendarEvents ()
@@ -61,7 +62,6 @@ - (NSString *)authorizationStatusForEventStore
61
62
self.isAccessToEventStoreGranted = NO ;
62
63
return @" restricted" ;
63
64
case EKAuthorizationStatusAuthorized:
64
- [self addNotificationCenter ];
65
65
self.isAccessToEventStoreGranted = YES ;
66
66
return @" authorized" ;
67
67
case EKAuthorizationStatusNotDetermined: {
@@ -73,29 +73,14 @@ - (NSString *)authorizationStatusForEventStore
73
73
#pragma mark -
74
74
#pragma mark Event Store Accessors
75
75
76
- - (void ) addCalendarEvent : ( NSString *)title details : (NSDictionary *)details
76
+ - (NSDictionary *)buildAndSaveEvent : (NSDictionary *)details
77
77
{
78
- if (!self.isAccessToEventStoreGranted ) {
79
- return ;
80
- }
81
-
82
- EKEvent *calendarEvent = [EKEvent eventWithEventStore: self .eventStore];
83
- calendarEvent.calendar = [self .eventStore defaultCalendarForNewEvents ];
84
-
85
- [self buildAndSaveEvent: calendarEvent details: details];
86
- }
87
-
88
- - (void )editEvent : (EKEvent *)calendarEvent details : (NSDictionary *)details
89
- {
90
- if (!self.isAccessToEventStoreGranted ) {
91
- return ;
78
+ if ([[self authorizationStatusForEventStore ] isEqualToString: @" granted" ]) {
79
+ return @{@" success" : [NSNull null ], @" error" : @" unauthorized to access calendar" };
92
80
}
93
81
94
- [self buildAndSaveEvent: calendarEvent details: details];
95
- }
96
-
97
- -(void )buildAndSaveEvent : (EKEvent *)calendarEvent details : (NSDictionary *)details
98
- {
82
+ EKEvent *calendarEvent = nil ;
83
+ NSString *eventId = [RCTConvert NSString: details[_id]];
99
84
NSString *title = [RCTConvert NSString: details[_title]];
100
85
NSString *location = [RCTConvert NSString: details[_location]];
101
86
NSDate *startDate = [RCTConvert NSDate: details[_startDate]];
@@ -105,6 +90,14 @@ -(void)buildAndSaveEvent:(EKEvent *)calendarEvent details:(NSDictionary *)detail
105
90
NSArray *alarms = [RCTConvert NSArray: details[_alarms]];
106
91
NSString *recurrence = [RCTConvert NSString: details[_recurrence]];
107
92
93
+ if (eventId) {
94
+ calendarEvent = (EKEvent *)[self .eventStore calendarItemWithIdentifier: eventId];
95
+
96
+ } else {
97
+ calendarEvent = [EKEvent eventWithEventStore: self .eventStore];
98
+ calendarEvent.calendar = [self .eventStore defaultCalendarForNewEvents ];
99
+ }
100
+
108
101
if (title) {
109
102
calendarEvent.title = title;
110
103
}
@@ -141,36 +134,43 @@ -(void)buildAndSaveEvent:(EKEvent *)calendarEvent details:(NSDictionary *)detail
141
134
calendarEvent.URL = URL;
142
135
}
143
136
144
- [self saveEvent: calendarEvent];
137
+ return [self saveEvent: calendarEvent];
145
138
}
146
139
147
- -( void )saveEvent : (EKEvent *)calendarEvent
140
+ - ( NSDictionary * )saveEvent : (EKEvent *)calendarEvent
148
141
{
142
+ NSMutableDictionary *response = [NSMutableDictionary dictionaryWithDictionary: @{@" success" : [NSNull null ], @" error" : [NSNull null ]}];
143
+
149
144
NSError *error = nil ;
150
145
BOOL success = [self .eventStore saveEvent: calendarEvent span: EKSpanFutureEvents commit: YES error: &error];
146
+
151
147
if (!success) {
152
- [self .bridge.eventDispatcher sendAppEventWithName: @" eventSaveError"
153
- body: @{@" error" : [error.userInfo valueForKey: @" NSLocalizedDescription" ]}];
148
+ [response setValue: [error.userInfo valueForKey: @" NSLocalizedDescription" ] forKey: @" error" ];
154
149
} else {
155
- [self .bridge.eventDispatcher sendAppEventWithName: @" eventSaveSuccess"
156
- body: calendarEvent.calendarItemIdentifier];
150
+ [response setValue: calendarEvent.calendarItemIdentifier forKey: @" success" ];
157
151
}
152
+ return [response copy ];
158
153
}
159
154
160
- - (void )deleteEvent : (NSString *)eventId span : (EKSpan *)span
155
+ - (NSDictionary * )deleteEvent : (NSString *)eventId span : (EKSpan *)span
161
156
{
162
- if (! self. isAccessToEventStoreGranted ) {
163
- return ;
157
+ if ([[ self authorizationStatusForEventStore ] isEqualToString: @" granted " ] ) {
158
+ return @{ @" success " : [ NSNull null ], @" error " : @" unauthorized to access calendar " } ;
164
159
}
165
160
161
+ NSMutableDictionary *response = [NSMutableDictionary dictionaryWithDictionary: @{@" success" : [NSNull null ], @" error" : [NSNull null ]}];
162
+
166
163
EKEvent *calendarEvent = (EKEvent *)[self .eventStore calendarItemWithIdentifier: eventId];
164
+
167
165
NSError *error = nil ;
168
166
BOOL success = [self .eventStore removeEvent: calendarEvent span: span commit: YES error: &error];
169
167
170
168
if (!success) {
171
- [self .bridge.eventDispatcher sendAppEventWithName: @" eventSaveError"
172
- body: @{@" error" : [error.userInfo valueForKey: @" NSLocalizedDescription" ]}];
169
+ [response setValue: [error.userInfo valueForKey: @" NSLocalizedDescription" ] forKey: @" error" ];
170
+ } else {
171
+ [response setValue: @YES forKey: @" success" ];
173
172
}
173
+ return [response copy ];
174
174
}
175
175
176
176
#pragma mark -
@@ -403,7 +403,7 @@ - (NSArray *)serializeCalendarEvents:(NSArray *)calendarEvents
403
403
if (event.occurrenceDate ) {
404
404
[formedCalendarEvent setValue: [dateFormatter stringFromDate: event.occurrenceDate] forKey: _occurrenceDate];
405
405
}
406
-
406
+
407
407
[formedCalendarEvent setValue: [NSNumber numberWithBool: event.isDetached] forKey: _isDetached];
408
408
409
409
[formedCalendarEvent setValue: [NSNumber numberWithBool: event.allDay] forKey: _allDay];
@@ -419,56 +419,36 @@ - (NSArray *)serializeCalendarEvents:(NSArray *)calendarEvents
419
419
return [serializedCalendarEvents copy ];
420
420
}
421
421
422
- #pragma mark -
423
- #pragma mark notifications
424
-
425
- - (void )addNotificationCenter
426
- {
427
- [[NSNotificationCenter defaultCenter ] addObserver: self
428
- selector: @selector (calendarEventUpdateReceived: )
429
- name: EKEventStoreChangedNotification
430
- object: nil ];
431
- }
432
-
433
- - (void )calendarEventUpdateReceived : (NSNotification *)notification
434
- {
435
- __weak RNCalendarEvents *weakSelf = self;
436
- dispatch_async (dispatch_get_main_queue (), ^{
437
- [weakSelf.bridge.eventDispatcher sendAppEventWithName: @" calendarEventsChanged"
438
- body: nil ];
439
- });
440
- }
441
-
442
- - (void ) dealloc
443
- {
444
- [[NSNotificationCenter defaultCenter ] removeObserver: self ];
445
- }
446
-
447
422
#pragma mark -
448
423
#pragma mark RCT Exports
449
424
450
- RCT_EXPORT_METHOD (authorizationStatus:(RCTResponseSenderBlock)callback )
425
+ RCT_EXPORT_METHOD (authorizationStatus:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject )
451
426
{
452
427
NSString *status = [self authorizationStatusForEventStore ];
453
- callback (@[@{@" status" : status}]);
428
+ if (status) {
429
+ resolve (status);
430
+ } else {
431
+ reject (@" error" , @" authorization status error" , nil );
432
+ }
454
433
}
455
434
456
- RCT_EXPORT_METHOD (authorizeEventStore:(RCTResponseSenderBlock)callback )
435
+ RCT_EXPORT_METHOD (authorizeEventStore:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject )
457
436
{
458
437
__weak RNCalendarEvents *weakSelf = self;
459
438
[self .eventStore requestAccessToEntityType: EKEntityTypeEvent completion: ^(BOOL granted, NSError *error) {
460
439
dispatch_async (dispatch_get_main_queue (), ^{
461
440
NSString *status = granted ? @" authorized" : @" denied" ;
462
441
weakSelf.isAccessToEventStoreGranted = granted;
463
442
if (!error) {
464
- [weakSelf addNotificationCenter ];
465
- callback (@[@{@" status" : status}]);
443
+ resolve (status);
444
+ } else {
445
+ reject (@" error" , @" authorization request error" , error);
466
446
}
467
447
});
468
448
}];
469
449
}
470
450
471
- RCT_EXPORT_METHOD (fetchAllEvents:(NSDate *)startDate endDate:(NSDate *)endDate callback:(RCTResponseSenderBlock)callback )
451
+ RCT_EXPORT_METHOD (fetchAllEvents:(NSDate *)startDate endDate:(NSDate *)endDate resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject )
472
452
{
473
453
NSPredicate *predicate = [self .eventStore predicateForEventsWithStartDate: startDate
474
454
endDate: endDate
@@ -478,35 +458,49 @@ - (void) dealloc
478
458
dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
479
459
weakSelf.calendarEvents = [[weakSelf.eventStore eventsMatchingPredicate: predicate] sortedArrayUsingSelector: @selector (compareStartDateWithEvent: )];
480
460
dispatch_async (dispatch_get_main_queue (), ^{
481
- callback (@[[weakSelf serializeCalendarEvents: weakSelf.calendarEvents]]);
461
+ if (weakSelf.calendarEvents ) {
462
+ resolve ([weakSelf serializeCalendarEvents: weakSelf.calendarEvents]);
463
+ } else {
464
+ reject (@" error" , @" calendar event request error" , nil );
465
+ }
482
466
});
483
467
});
484
468
}
485
469
486
- RCT_EXPORT_METHOD (saveEvent:(NSString *)title details:(NSDictionary *)details)
470
+ RCT_EXPORT_METHOD (saveEvent:(NSString *)title details:(NSDictionary *)details resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject )
487
471
{
488
- NSString *eventId = [RCTConvert NSString: details[_id]];
489
-
490
- NSMutableDictionary * options = [NSMutableDictionary dictionaryWithDictionary: details];
472
+ NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary: details];
491
473
[options setValue: title forKey: _title];
492
474
493
- if (eventId) {
494
- EKEvent *calendarEvent = (EKEvent *)[self .eventStore calendarItemWithIdentifier: eventId];
495
- [self editEvent: calendarEvent details: options];
475
+ NSDictionary *response = [self buildAndSaveEvent: options];
496
476
477
+ if ([response valueForKey: @" success" ] != [NSNull null ]) {
478
+ resolve ([response valueForKey: @" success" ]);
497
479
} else {
498
- [ self addCalendarEvent: title details: options] ;
480
+ reject ( @" error " , [response valueForKey: @" error " ], nil ) ;
499
481
}
500
482
}
501
483
502
- RCT_EXPORT_METHOD (removeEvent:(NSString *)eventId)
484
+ RCT_EXPORT_METHOD (removeEvent:(NSString *)eventId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject )
503
485
{
504
- [self deleteEvent: eventId span: EKSpanThisEvent];
486
+ NSDictionary *response = [self deleteEvent: eventId span: EKSpanThisEvent];
487
+
488
+ if ([response valueForKey: @" success" ] != [NSNull null ]) {
489
+ resolve ([response valueForKey: @" success" ]);
490
+ } else {
491
+ reject (@" error" , [response valueForKey: @" error" ], nil );
492
+ }
505
493
}
506
494
507
- RCT_EXPORT_METHOD (removeFutureEvents:(NSString *)eventId)
495
+ RCT_EXPORT_METHOD (removeFutureEvents:(NSString *)eventId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject )
508
496
{
509
- [self deleteEvent: eventId span: EKSpanFutureEvents];
497
+ NSDictionary *response = [self deleteEvent: eventId span: EKSpanFutureEvents];
498
+
499
+ if ([response valueForKey: @" success" ] != [NSNull null ]) {
500
+ resolve ([response valueForKey: @" success" ]);
501
+ } else {
502
+ reject (@" error" , [response valueForKey: @" error" ], nil );
503
+ }
510
504
}
511
505
512
- @end
506
+ @end
0 commit comments