Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: uses new method for requesting calendar permissions on iOS 17 #448

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

KTDevelopment
Copy link

fixes issue described in
#440

fix was posted by @daxaxelrod

alperpacin referenced this pull request in alperpacin/react-native-calendar-events Mar 1, 2024
Copy link

@anton-patrushev anton-patrushev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

our local patch file is also changing a few more methods with explicit separate logic for iOS >=17:

  1. isCalendarAcessGranted method
  2. checkPermissions method
  3. requestPermissions method (you already covered that)

you can try to apply this patch file and update the PR

diff --git a/node_modules/react-native-calendar-events/ios/RNCalendarEvents.m b/node_modules/react-native-calendar-events/ios/RNCalendarEvents.m
index a85c013..4d40020 100644
--- a/node_modules/react-native-calendar-events/ios/RNCalendarEvents.m
+++ b/node_modules/react-native-calendar-events/ios/RNCalendarEvents.m
@@ -95,7 +95,11 @@ - (BOOL)isCalendarAccessGranted
 {
     EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
 
-    return status == EKAuthorizationStatusAuthorized;
+    if (@available(iOS 17, *)) {
+        return (status == EKAuthorizationStatusFullAccess || status == EKAuthorizationStatusAuthorized);
+    } else {
+        return status == EKAuthorizationStatusAuthorized;
+    }
 }
 
 #pragma mark -
@@ -741,19 +745,39 @@ - (NSDictionary *)serializeCalendarEvent:(EKEvent *)event
     NSString *status;
     EKAuthorizationStatus authStatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent];
 
-    switch (authStatus) {
-        case EKAuthorizationStatusDenied:
-            status = @"denied";
-            break;
-        case EKAuthorizationStatusRestricted:
-            status = @"restricted";
-            break;
-        case EKAuthorizationStatusAuthorized:
-            status = @"authorized";
-            break;
-        default:
-            status = @"undetermined";
-            break;
+    if (@available(iOS 17, *)) {
+        switch (authStatus) {
+            case EKAuthorizationStatusDenied:
+                status = @"denied";
+                break;
+            case EKAuthorizationStatusRestricted:
+                status = @"restricted";
+                break;
+            case EKAuthorizationStatusFullAccess:
+                status = @"authorized";
+                break;
+            case EKAuthorizationStatusWriteOnly:
+                status = @"writeOnly";
+                break;
+            default:
+                status = @"undetermined";
+                break;
+        }
+    } else {
+        switch (authStatus) {
+            case EKAuthorizationStatusDenied:
+                status = @"denied";
+                break;
+            case EKAuthorizationStatusRestricted:
+                status = @"restricted";
+                break;
+            case EKAuthorizationStatusAuthorized:
+                status = @"authorized";
+                break;
+            default:
+                status = @"undetermined";
+                break;
+        }
     }
 
     resolve(status);
@@ -762,12 +786,23 @@ - (NSDictionary *)serializeCalendarEvent:(EKEvent *)event
 RCT_EXPORT_METHOD(requestPermissions:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
 {
     [self.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
-        NSString *status = granted ? @"authorized" : @"denied";
-        if (!error) {
-            resolve(status);
+        if (@available(iOS 17, *)) {
+            [self.eventStore requestFullAccessToEventsWithCompletion:^(BOOL granted, NSError *error) {
+                NSString *status = granted ? @"authorized" : @"denied";
+                if (!error) {
+                    resolve(status);
+                } else {
+                    reject(@"error", @"authorization request error", error);
+                }
+            }];
         } else {
-            reject(@"error", @"authorization request error", error);
-        }
+            NSString *status = granted ? @"authorized" : @"denied";
+            if (!error) {
+                resolve(status);
+            } else {
+                reject(@"error", @"authorization request error", error);
+            }
+         }
     }];
 }
 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants