103846faaSStanisław Chmiela// Copyright 2018-present 650 Industries. All rights reserved. 203846faaSStanisław Chmiela 303846faaSStanisław Chmiela#import <EXNotifications/EXNotificationsHandlerModule.h> 403846faaSStanisław Chmiela#import <EXNotifications/EXNotificationSerializer.h> 503846faaSStanisław Chmiela#import <EXNotifications/EXNotificationCenterDelegate.h> 603846faaSStanisław Chmiela 7*efd75decSTomasz Sapeta#import <ExpoModulesCore/EXEventEmitterService.h> 803846faaSStanisław Chmiela 903846faaSStanisław Chmiela@interface EXNotificationsHandlerModule () 1003846faaSStanisław Chmiela 1103846faaSStanisław Chmiela@property (nonatomic, weak) id<EXNotificationCenterDelegate> notificationCenterDelegate; 1203846faaSStanisław Chmiela 1303846faaSStanisław Chmiela@property (nonatomic, assign) BOOL isListening; 1403846faaSStanisław Chmiela@property (nonatomic, assign) BOOL isBeingObserved; 1503846faaSStanisław Chmiela 16*efd75decSTomasz Sapeta@property (nonatomic, weak) id<EXEventEmitterService> eventEmitter; 1703846faaSStanisław Chmiela 1803846faaSStanisław Chmiela@property (nonatomic, strong) NSMutableDictionary<NSString *, EXSingleNotificationHandlerTask *> *tasksMap; 1903846faaSStanisław Chmiela 2003846faaSStanisław Chmiela@end 2103846faaSStanisław Chmiela 2203846faaSStanisław Chmiela@implementation EXNotificationsHandlerModule 2303846faaSStanisław Chmiela 24*efd75decSTomasz SapetaEX_EXPORT_MODULE(ExpoNotificationsHandlerModule); 2503846faaSStanisław Chmiela 2603846faaSStanisław Chmiela- (instancetype)init 2703846faaSStanisław Chmiela{ 2803846faaSStanisław Chmiela if (self = [super init]) { 2903846faaSStanisław Chmiela _tasksMap = [NSMutableDictionary dictionary]; 3003846faaSStanisław Chmiela } 3103846faaSStanisław Chmiela return self; 3203846faaSStanisław Chmiela} 3303846faaSStanisław Chmiela 3403846faaSStanisław Chmiela# pragma mark - Exported methods 3503846faaSStanisław Chmiela 36*efd75decSTomasz SapetaEX_EXPORT_METHOD_AS(handleNotificationAsync, 37*efd75decSTomasz Sapeta handleNotificationAsync:(NSString *)identifier withBehavior:(NSDictionary *)behavior resolver:(EXPromiseResolveBlock)resolve rejecter:(EXPromiseRejectBlock)reject) 3803846faaSStanisław Chmiela{ 3903846faaSStanisław Chmiela EXSingleNotificationHandlerTask *task = _tasksMap[identifier]; 4003846faaSStanisław Chmiela if (!task) { 4103846faaSStanisław Chmiela NSString *message = [NSString stringWithFormat:@"Failed to handle notification %@, it has already been handled.", identifier]; 4203846faaSStanisław Chmiela return reject(@"ERR_NOTIFICATION_HANDLED", message, nil); 4303846faaSStanisław Chmiela } 4403846faaSStanisław Chmiela NSError *error = [task handleResponse:behavior]; 4503846faaSStanisław Chmiela if (error) { 4603846faaSStanisław Chmiela return reject(error.userInfo[@"code"], error.userInfo[@"message"], error); 4703846faaSStanisław Chmiela } else { 4803846faaSStanisław Chmiela resolve(nil); 4903846faaSStanisław Chmiela } 5003846faaSStanisław Chmiela} 5103846faaSStanisław Chmiela 52*efd75decSTomasz Sapeta# pragma mark - EXModuleRegistryConsumer 5303846faaSStanisław Chmiela 54*efd75decSTomasz Sapeta- (void)setModuleRegistry:(EXModuleRegistry *)moduleRegistry 5503846faaSStanisław Chmiela{ 56*efd75decSTomasz Sapeta _eventEmitter = [moduleRegistry getModuleImplementingProtocol:@protocol(EXEventEmitterService)]; 5703846faaSStanisław Chmiela _notificationCenterDelegate = [moduleRegistry getSingletonModuleForName:@"NotificationCenterDelegate"]; 5803846faaSStanisław Chmiela} 5903846faaSStanisław Chmiela 60*efd75decSTomasz Sapeta# pragma mark - EXEventEmitter 6103846faaSStanisław Chmiela 6203846faaSStanisław Chmiela- (NSArray<NSString *> *)supportedEvents 6303846faaSStanisław Chmiela{ 6403846faaSStanisław Chmiela return [EXSingleNotificationHandlerTask eventNames]; 6503846faaSStanisław Chmiela} 6603846faaSStanisław Chmiela 6703846faaSStanisław Chmiela- (void)startObserving 6803846faaSStanisław Chmiela{ 6903846faaSStanisław Chmiela [self setIsBeingObserved:YES]; 7003846faaSStanisław Chmiela} 7103846faaSStanisław Chmiela 7203846faaSStanisław Chmiela- (void)stopObserving 7303846faaSStanisław Chmiela{ 7403846faaSStanisław Chmiela [self setIsBeingObserved:NO]; 7503846faaSStanisław Chmiela} 7603846faaSStanisław Chmiela 7703846faaSStanisław Chmiela- (void)setIsBeingObserved:(BOOL)isBeingObserved 7803846faaSStanisław Chmiela{ 7903846faaSStanisław Chmiela _isBeingObserved = isBeingObserved; 8003846faaSStanisław Chmiela BOOL shouldListen = _isBeingObserved; 8103846faaSStanisław Chmiela if (shouldListen && !_isListening) { 8203846faaSStanisław Chmiela [_notificationCenterDelegate addDelegate:self]; 8303846faaSStanisław Chmiela _isListening = YES; 8403846faaSStanisław Chmiela } else if (!shouldListen && _isListening) { 8503846faaSStanisław Chmiela [_notificationCenterDelegate removeDelegate:self]; 8603846faaSStanisław Chmiela _isListening = NO; 8703846faaSStanisław Chmiela } 8803846faaSStanisław Chmiela} 8903846faaSStanisław Chmiela 9003846faaSStanisław Chmiela# pragma mark - EXNotificationsDelegate 9103846faaSStanisław Chmiela 9203846faaSStanisław Chmiela- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler 9303846faaSStanisław Chmiela{ 9403846faaSStanisław Chmiela EXSingleNotificationHandlerTask *task = [[EXSingleNotificationHandlerTask alloc] initWithEventEmitter:_eventEmitter 9503846faaSStanisław Chmiela notification:notification 9603846faaSStanisław Chmiela completionHandler:completionHandler 9703846faaSStanisław Chmiela delegate:self]; 9803846faaSStanisław Chmiela [_tasksMap setObject:task forKey:task.identifier]; 9903846faaSStanisław Chmiela [task start]; 10003846faaSStanisław Chmiela} 10103846faaSStanisław Chmiela 10203846faaSStanisław Chmiela# pragma mark - EXSingleNotificationHandlerTaskDelegate 10303846faaSStanisław Chmiela 10403846faaSStanisław Chmiela- (void)taskDidFinish:(EXSingleNotificationHandlerTask *)task 10503846faaSStanisław Chmiela{ 10603846faaSStanisław Chmiela [_tasksMap removeObjectForKey:task.identifier]; 10703846faaSStanisław Chmiela} 10803846faaSStanisław Chmiela 10903846faaSStanisław Chmiela@end 110