1// Copyright © 2019-present 650 Industries. All rights reserved.
2
3#if __has_include(<EXLocalAuthentication/EXLocalAuthentication.h>)
4#import "EXScopedLocalAuthentication.h"
5#import <LocalAuthentication/LocalAuthentication.h>
6#import <UMCore/UMUtilities.h>
7#import "EXConstantsBinding.h"
8#import <UMConstantsInterface/UMConstantsInterface.h>
9
10@interface EXScopedLocalAuthentication ()
11
12@property (nonatomic, assign) BOOL isInExpoClient;
13
14@end
15
16@implementation EXScopedLocalAuthentication
17
18- (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry
19{
20  _isInExpoClient = [((EXConstantsBinding *)[moduleRegistry getModuleImplementingProtocol:@protocol(UMConstantsInterface)]).appOwnership isEqualToString:@"expo"];
21}
22
23UM_EXPORT_METHOD_AS(authenticateAsync,
24                    authenticateWithOptions:(NSDictionary *)options
25                    resolve:(UMPromiseResolveBlock)resolve
26                    reject:(UMPromiseRejectBlock)reject)
27{
28  BOOL isInExpoClient = _isInExpoClient;
29  [super authenticateWithOptions:options resolve:^(NSDictionary *result) {
30    if (isInExpoClient && [[self class] isFaceIdDevice]) {
31      NSString *usageDescription = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"NSFaceIDUsageDescription"];
32
33      if (!usageDescription) {
34        NSMutableDictionary *scopedResult = [[NSMutableDictionary alloc] initWithDictionary:result];
35        scopedResult[@"warning"] = @"Face ID is not available in Expo Go. You can use it in a standalone Expo app by providing `NSFaceIDUsageDescription`.";
36        resolve(scopedResult);
37        return;
38      }
39    }
40    resolve(result);
41  } reject:reject];
42}
43
44@end
45#endif
46