mirror of
https://github.com/status-im/react-native-camera-roll.git
synced 2026-08-27 11:21:08 +00:00
91 lines
3.5 KiB
Objective-C
91 lines
3.5 KiB
Objective-C
#import <React/RCTUtils.h>
|
|
#import "RNCPermissionHelper.h"
|
|
|
|
@import Photos;
|
|
@import PhotosUI;
|
|
|
|
@implementation RNCPermissionHelper
|
|
|
|
#pragma mark - Access Levels
|
|
static NSString * const ADD_ONLY = @"addOnly";
|
|
static NSString * const READ_WRITE = @"readWrite";
|
|
|
|
+ (void)checkCameraRollPermission:(NSString *) accessLevel
|
|
resolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
|
|
rejecter:(void (^ _Nonnull)(NSString *code, NSString *message))reject {
|
|
PHAuthorizationStatus status;
|
|
|
|
if (@available(iOS 14.0, *)) {
|
|
PHAccessLevel requestedAccessLevel;
|
|
if ([accessLevel isEqualToString: ADD_ONLY]) {
|
|
requestedAccessLevel = PHAccessLevelAddOnly;
|
|
} else if ([accessLevel isEqualToString: READ_WRITE]) {
|
|
requestedAccessLevel = PHAccessLevelReadWrite;
|
|
} else {
|
|
return reject(@"incorrect_access_level", @"The requested access level does not exist");
|
|
}
|
|
status = [PHPhotoLibrary authorizationStatusForAccessLevel:requestedAccessLevel];
|
|
} else {
|
|
status = [PHPhotoLibrary authorizationStatus];
|
|
}
|
|
|
|
switch (status) {
|
|
case PHAuthorizationStatusNotDetermined:
|
|
return resolve(RNPermissionStatusNotDetermined);
|
|
case PHAuthorizationStatusRestricted:
|
|
return resolve(RNPermissionStatusRestricted);
|
|
case PHAuthorizationStatusDenied:
|
|
return resolve(RNPermissionStatusDenied);
|
|
case PHAuthorizationStatusLimited:
|
|
return resolve(RNPermissionStatusLimited);
|
|
case PHAuthorizationStatusAuthorized:
|
|
return resolve(RNPermissionStatusAuthorized);
|
|
}
|
|
|
|
}
|
|
|
|
+ (void)requestCameraRollReadWritePermission:(void (^ _Nonnull)(RNPermissionStatus))resolve
|
|
rejecter:(void (^ _Nonnull)(NSString *code, NSString *message))reject {
|
|
if (@available(iOS 14.0, *)) {
|
|
[PHPhotoLibrary requestAuthorizationForAccessLevel:PHAccessLevelReadWrite handler:^(__unused PHAuthorizationStatus status) {
|
|
[self checkCameraRollPermission: READ_WRITE resolver: resolve rejecter:reject];
|
|
}];
|
|
} else {
|
|
[PHPhotoLibrary requestAuthorization:^(__unused PHAuthorizationStatus status) {
|
|
[self checkCameraRollPermission: READ_WRITE resolver: resolve rejecter:reject];
|
|
}];
|
|
}
|
|
}
|
|
|
|
+ (void)requestCameraRollAddOnlyPermission:(void (^ _Nonnull)(RNPermissionStatus))resolve
|
|
rejecter:(void (^ _Nonnull)(NSString *code, NSString *message))reject {
|
|
if (@available(iOS 14.0, *)) {
|
|
[PHPhotoLibrary requestAuthorizationForAccessLevel:PHAccessLevelAddOnly handler:^(__unused PHAuthorizationStatus status) {
|
|
[self checkCameraRollPermission: ADD_ONLY resolver: resolve rejecter:reject];
|
|
}];
|
|
} else {
|
|
[PHPhotoLibrary requestAuthorization:^(__unused PHAuthorizationStatus status) {
|
|
[self checkCameraRollPermission: ADD_ONLY resolver: resolve rejecter:reject];
|
|
}];
|
|
}
|
|
}
|
|
|
|
|
|
+ (void)refreshLimitedPhotoselection:(RCTPromiseResolveBlock _Nonnull)resolve
|
|
rejecter:(RCTPromiseRejectBlock _Nonnull)reject {
|
|
if (@available(iOS 14, *)) {
|
|
if ([PHPhotoLibrary authorizationStatusForAccessLevel:PHAccessLevelReadWrite] != PHAuthorizationStatusLimited) {
|
|
return reject(@"cannot_open_limited_picker", @"Photo library permission isn't limited", nil);
|
|
}
|
|
|
|
UIViewController *presentedViewController = RCTPresentedViewController();
|
|
[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:presentedViewController];
|
|
|
|
resolve(@(true));
|
|
} else {
|
|
reject(@"cannot_open_limited_picker", @"Available on iOS 14 or higher", nil);
|
|
}
|
|
}
|
|
|
|
@end
|