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