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