1// Copyright 2017-present 650 Industries. All rights reserved.
2
3#import <EXMediaLibrary/EXMediaLibraryMediaLibraryPermissionRequester.h>
4
5@implementation EXMediaLibraryMediaLibraryPermissionRequester
6
7+ (NSString *)permissionType
8{
9  return @"mediaLibrary";
10}
11
12#ifdef __IPHONE_14_0
13- (PHAccessLevel)accessLevel
14{
15  return PHAccessLevelReadWrite;
16}
17#endif
18
19- (NSDictionary *)getPermissions
20{
21  EXPermissionStatus status;
22  NSString *scope;
23
24  PHAuthorizationStatus permissions;
25#ifdef __IPHONE_14_0
26  if (@available(iOS 14, *)) {
27    permissions = [PHPhotoLibrary authorizationStatusForAccessLevel:[self accessLevel]];
28  } else {
29    permissions = [PHPhotoLibrary authorizationStatus];
30  }
31#else
32  permissions = [PHPhotoLibrary authorizationStatus];
33#endif
34
35  switch (permissions) {
36    case PHAuthorizationStatusAuthorized:
37      status = EXPermissionStatusGranted;
38      scope = @"all";
39      break;
40#ifdef __IPHONE_14_0
41    case PHAuthorizationStatusLimited:
42      status = EXPermissionStatusGranted;
43      scope = @"limited";
44      break;
45#endif
46    case PHAuthorizationStatusDenied:
47    case PHAuthorizationStatusRestricted:
48      status = EXPermissionStatusDenied;
49      scope = @"none";
50      break;
51    case PHAuthorizationStatusNotDetermined:
52      status = EXPermissionStatusUndetermined;
53      scope = @"none";
54      break;
55  }
56
57  return @{
58    @"status": @(status),
59    @"accessPrivileges": scope,
60    @"granted": @(status == EXPermissionStatusGranted)
61  };
62}
63
64- (void)requestPermissionsWithResolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject
65{
66  EX_WEAKIFY(self)
67  void(^handler)(PHAuthorizationStatus) = ^(PHAuthorizationStatus status) {
68    EX_STRONGIFY(self)
69    resolve([self getPermissions]);
70  };
71
72#ifdef __IPHONE_14_0
73  if (@available(iOS 14, *)) {
74    [PHPhotoLibrary requestAuthorizationForAccessLevel:[self accessLevel] handler:handler];
75  } else {
76    [PHPhotoLibrary requestAuthorization:handler];
77  }
78#else
79  [PHPhotoLibrary requestAuthorization:handler];
80#endif
81}
82
83@end
84