1c9802ebaSStanisław Chmiela// Copyright © 2019-present 650 Industries. All rights reserved.
2c9802ebaSStanisław Chmiela
3631604b1STomasz Sapeta#if __has_include(<EXLocalAuthentication/EXLocalAuthentication.h>)
4c9802ebaSStanisław Chmiela#import <LocalAuthentication/LocalAuthentication.h>
5*efd75decSTomasz Sapeta#import <ExpoModulesCore/EXUtilities.h>
665d041d7STomasz Sapeta#import <ExpoModulesCore/EXConstantsInterface.h>
765d041d7STomasz Sapeta
865d041d7STomasz Sapeta#import "EXScopedLocalAuthentication.h"
9c9802ebaSStanisław Chmiela#import "EXConstantsBinding.h"
10c9802ebaSStanisław Chmiela
11c9802ebaSStanisław Chmiela@interface EXScopedLocalAuthentication ()
12c9802ebaSStanisław Chmiela
13c9802ebaSStanisław Chmiela@property (nonatomic, assign) BOOL isInExpoClient;
14c9802ebaSStanisław Chmiela
15c9802ebaSStanisław Chmiela@end
16c9802ebaSStanisław Chmiela
17c9802ebaSStanisław Chmiela@implementation EXScopedLocalAuthentication
18c9802ebaSStanisław Chmiela
19*efd75decSTomasz Sapeta- (void)setModuleRegistry:(EXModuleRegistry *)moduleRegistry
20c9802ebaSStanisław Chmiela{
2165d041d7STomasz Sapeta  _isInExpoClient = [((EXConstantsBinding *)[moduleRegistry getModuleImplementingProtocol:@protocol(EXConstantsInterface)]).appOwnership isEqualToString:@"expo"];
22c9802ebaSStanisław Chmiela}
23c9802ebaSStanisław Chmiela
24*efd75decSTomasz SapetaEX_EXPORT_METHOD_AS(authenticateAsync,
259e39fcedSTomasz Sapeta                    authenticateWithOptions:(NSDictionary *)options
26*efd75decSTomasz Sapeta                    resolve:(EXPromiseResolveBlock)resolve
27*efd75decSTomasz Sapeta                    reject:(EXPromiseRejectBlock)reject)
28c9802ebaSStanisław Chmiela{
29c9802ebaSStanisław Chmiela  BOOL isInExpoClient = _isInExpoClient;
309e39fcedSTomasz Sapeta  [super authenticateWithOptions:options resolve:^(NSDictionary *result) {
31c9802ebaSStanisław Chmiela    if (isInExpoClient && [[self class] isFaceIdDevice]) {
32c9802ebaSStanisław Chmiela      NSString *usageDescription = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"NSFaceIDUsageDescription"];
33c9802ebaSStanisław Chmiela
34c9802ebaSStanisław Chmiela      if (!usageDescription) {
35c9802ebaSStanisław Chmiela        NSMutableDictionary *scopedResult = [[NSMutableDictionary alloc] initWithDictionary:result];
36dc898499SJames Ide        scopedResult[@"warning"] = @"Face ID is not available in Expo Go. You can use it in a standalone Expo app by providing `NSFaceIDUsageDescription`.";
37c9802ebaSStanisław Chmiela        resolve(scopedResult);
38c9802ebaSStanisław Chmiela        return;
39c9802ebaSStanisław Chmiela      }
40c9802ebaSStanisław Chmiela    }
41c9802ebaSStanisław Chmiela    resolve(result);
42c9802ebaSStanisław Chmiela  } reject:reject];
43c9802ebaSStanisław Chmiela}
44c9802ebaSStanisław Chmiela
45c9802ebaSStanisław Chmiela@end
46631604b1STomasz Sapeta#endif
47