1// Copyright 2018-present 650 Industries. All rights reserved.
2
3#import <ABI47_0_0EXAppleAuthentication/ABI47_0_0EXAppleAuthenticationRequest.h>
4#import <ABI47_0_0EXAppleAuthentication/ABI47_0_0EXAppleAuthenticationMappings.h>
5
6#import <ABI47_0_0ExpoModulesCore/ABI47_0_0EXDefines.h>
7
8@interface ABI47_0_0EXAppleAuthenticationRequest ()
9
10@property (nonatomic, strong, nonnull) NSDictionary *options;
11@property (nonatomic, strong, nullable) void(^callback)(NSDictionary *, NSError *);
12@property (nonatomic, strong, nonnull) ASAuthorizationController *authController;
13
14@end
15
16@implementation ABI47_0_0EXAppleAuthenticationRequest
17
18- (instancetype)initWithOptions:(NSDictionary *)options
19                    andCallback:(void(^)(NSDictionary *response, NSError *error))callback
20{
21  if (self = [super init]) {
22    _options = options;
23    _callback = callback;
24  }
25  return self;
26}
27
28- (void)performOperation:(ASAuthorizationProviderAuthorizationOperation)operation
29{
30  ASAuthorizationAppleIDProvider* appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
31  ASAuthorizationAppleIDRequest* request = [appleIDProvider createRequest];
32
33  NSArray<NSNumber *> *requestedScopes = _options[@"requestedScopes"];
34
35  request.requestedScopes = [ABI47_0_0EXAppleAuthenticationMappings importScopes:requestedScopes];
36  request.requestedOperation = operation;
37
38  if (_options[@"user"]) {
39    request.user = _options[@"user"];
40  }
41  if (_options[@"state"]) {
42    request.state = _options[@"state"];
43  }
44  if (_options[@"nonce"]) {
45    request.nonce = _options[@"nonce"];
46  }
47
48  _authController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
49  _authController.presentationContextProvider = self;
50  _authController.delegate = self;
51
52  [_authController performRequests];
53}
54
55+ (ABI47_0_0EXAppleAuthenticationRequest *)performOperation:(ASAuthorizationProviderAuthorizationOperation)operation
56                                       withOptions:(NSDictionary *)options
57                                      withCallback:(void(^)(NSDictionary *, NSError *))callback
58{
59  ABI47_0_0EXAppleAuthenticationRequest *authRequest = [[ABI47_0_0EXAppleAuthenticationRequest alloc] initWithOptions:options andCallback:callback];
60  [authRequest performOperation:operation];
61  return authRequest;
62}
63
64#pragma mark - ASAuthorizationControllerDelegate
65
66- (void)authorizationController:(ASAuthorizationController *)controller
67   didCompleteWithAuthorization:(ASAuthorization *)authorization
68{
69  ASAuthorizationAppleIDCredential *credential = authorization.credential;
70
71  NSDictionary *fullName;
72  if (credential.fullName) {
73    fullName = [ABI47_0_0EXAppleAuthenticationMappings exportFullName:credential.fullName];
74  }
75  NSString *authorizationCode;
76  if (credential.authorizationCode) {
77    authorizationCode = [ABI47_0_0EXAppleAuthenticationMappings exportData:credential.authorizationCode];
78  }
79  NSString *identityToken;
80  if (credential.identityToken) {
81    identityToken = [ABI47_0_0EXAppleAuthenticationMappings exportData:credential.identityToken];
82  }
83
84  NSDictionary *response = @{
85                         @"fullName": ABI47_0_0EXNullIfNil(fullName),
86                         @"email": ABI47_0_0EXNullIfNil(credential.email),
87                         @"user": credential.user,
88                         @"realUserStatus": [ABI47_0_0EXAppleAuthenticationMappings exportRealUserStatus:credential.realUserStatus],
89                         @"state": ABI47_0_0EXNullIfNil(credential.state),
90                         @"authorizationCode": ABI47_0_0EXNullIfNil(authorizationCode),
91                         @"identityToken": ABI47_0_0EXNullIfNil(identityToken),
92                         };
93
94  if (_callback) {
95    _callback(response, nil);
96    _callback = nil;
97  }
98}
99
100- (void)authorizationController:(ASAuthorizationController *)controller
101           didCompleteWithError:(NSError *)error
102{
103  if (_callback) {
104    _callback(nil, error);
105    _callback = nil;
106  }
107}
108
109#pragma mark - ASAuthorizationControllerPresentationContextProviding
110
111- (nonnull ASPresentationAnchor)presentationAnchorForAuthorizationController:(nonnull ASAuthorizationController *)controller
112{
113  return [[UIApplication sharedApplication] keyWindow];
114}
115
116@end
117