1// Copyright 2018-present 650 Industries. All rights reserved.
2
3#import <EXNotifications/EXNotificationPermissionsModule.h>
4
5#import <ExpoModulesCore/EXPermissionsInterface.h>
6#import <ExpoModulesCore/EXPermissionsMethodsDelegate.h>
7
8#import <EXNotifications/EXLegacyRemoteNotificationPermissionRequester.h>
9#import <EXNotifications/EXUserFacingNotificationsPermissionsRequester.h>
10
11@interface EXNotificationPermissionsModule ()
12
13@property (nonatomic, weak) id<EXPermissionsInterface> permissionsManager;
14@property (nonatomic, strong) EXUserFacingNotificationsPermissionsRequester *requester;
15@property (nonatomic, strong) EXLegacyRemoteNotificationPermissionRequester *legacyRemoteNotificationsRequester;
16
17@end
18
19@implementation EXNotificationPermissionsModule
20
21EX_EXPORT_MODULE(ExpoNotificationPermissionsModule);
22
23- (instancetype)init
24{
25  if (self = [super init]) {
26    _requester = [[EXUserFacingNotificationsPermissionsRequester alloc] initWithMethodQueue:self.methodQueue];
27  }
28  return self;
29}
30
31# pragma mark - Exported methods
32
33EX_EXPORT_METHOD_AS(getPermissionsAsync,
34                    getPermissionsAsync:(EXPromiseResolveBlock)resolve
35                    rejecter:(EXPromiseRejectBlock)reject)
36{
37  [EXPermissionsMethodsDelegate getPermissionWithPermissionsManager:_permissionsManager
38                                                      withRequester:[EXUserFacingNotificationsPermissionsRequester class]
39                                                            resolve:resolve
40                                                             reject:reject];
41}
42
43EX_EXPORT_METHOD_AS(requestPermissionsAsync,
44                    requestPermissionsAsync:(NSDictionary *)requestedPermissions
45                    requester:(EXPromiseResolveBlock)resolve
46                    rejecter:(EXPromiseRejectBlock)reject)
47{
48  [EXUserFacingNotificationsPermissionsRequester setRequestedPermissions:requestedPermissions];
49  [EXPermissionsMethodsDelegate askForPermissionWithPermissionsManager:_permissionsManager
50                                                         withRequester:[EXUserFacingNotificationsPermissionsRequester class]
51                                                               resolve:resolve
52                                                                reject:reject];
53}
54
55# pragma mark - EXModuleRegistryConsumer
56
57- (void)setModuleRegistry:(EXModuleRegistry *)moduleRegistry {
58  _permissionsManager = [moduleRegistry getModuleImplementingProtocol:@protocol(EXPermissionsInterface)];
59  if (!_legacyRemoteNotificationsRequester) {
60    // TODO: Remove once we deprecate and remove "notifications" permission type
61    _legacyRemoteNotificationsRequester = [[EXLegacyRemoteNotificationPermissionRequester alloc] initWithUserNotificationPermissionRequester:_requester permissionPublisher:[moduleRegistry getSingletonModuleForName:@"RemoteNotificationPermissionPublisher"] withMethodQueue:self.methodQueue];
62  }
63  [EXPermissionsMethodsDelegate registerRequesters:@[_requester, _legacyRemoteNotificationsRequester]
64                            withPermissionsManager:_permissionsManager];
65}
66
67@end
68