-
Notifications
You must be signed in to change notification settings - Fork 10
/
RCTVkSdkLoginManager.m
153 lines (118 loc) · 4.54 KB
/
RCTVkSdkLoginManager.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#import "RCTVkSdkLoginManager.h"
#import "VKSdk/VKSdk.h"
#import <RCTUtils.h>
@implementation RCTVkSdkLoginManager
{
VKSdk *_sdkInstance;
RCTResponseSenderBlock callback;
}
RCT_EXPORT_MODULE();
- (dispatch_queue_t)methodQueue
{
return dispatch_get_main_queue();
}
- (instancetype)init
{
if ((self = [super init])) {
NSString *VkAppID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"VkAppID"];
NSLog(@"RCTVkSdkLoginManager starts with ID %@", VkAppID);
_sdkInstance = [VKSdk initializeWithAppId:VkAppID];
[_sdkInstance registerDelegate:self];
[_sdkInstance setUiDelegate:self];
}
return self;
}
#pragma mark RN Export
RCT_EXPORT_METHOD(authorize:(RCTResponseSenderBlock)jsCallback)
{
NSLog(@"RCTVkSdkLoginManager#authorize");
self->callback = jsCallback;
[self _authorize];
};
RCT_EXPORT_METHOD(logout)
{
NSLog(@"RCTVkSdkLoginManager#logout");
[VKSdk forceLogout];
};
#pragma mark VKSdkDelegate
- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result {
NSLog(@"vkSdkAccessAuthorizationFinishedWithResult %@", result);
if (result.error) {
NSDictionary *jsError = [self _NSError2JS:result.error];
self->callback(@[jsError, [NSNull null]]);
} else if (result.token) {
NSDictionary *loginData = [self buildResponseData];
self->callback(@[[NSNull null], loginData]);
}
}
- (void)vkSdkUserAuthorizationFailed:(VKError *)error {
NSLog(@"vkSdkUserAuthorizationFailed %@", error);
self->callback(@[error, [NSNull null]]);
}
#pragma mark VKSdkUIDelegate
-(void) vkSdkNeedCaptchaEnter:(VKError*) captchaError
{
NSLog(@"vkSdkNeedCaptchaEnter %@", captchaError);
VKCaptchaViewController * vc = [VKCaptchaViewController captchaControllerWithError:captchaError];
UIWindow *keyWindow = RCTSharedApplication().keyWindow;
UIViewController *rootViewController = keyWindow.rootViewController;
[vc presentIn:rootViewController];
}
- (void)vkSdkShouldPresentViewController:(UIViewController *)controller {
NSLog(@"vkSdkShouldPresentViewController");
UIWindow *keyWindow = RCTSharedApplication().keyWindow;
UIViewController *rootViewController = keyWindow.rootViewController;
[rootViewController presentViewController:controller animated:YES completion:nil];
}
#pragma mark - helpers
- (void)_authorize
{
NSArray *SCOPE = @[VK_PER_FRIENDS, VK_PER_EMAIL];
[VKSdk wakeUpSession:SCOPE completeBlock:^(VKAuthorizationState state, NSError *error) {
if (state == VKAuthorizationAuthorized) {
// VKAuthorizationAuthorized - means a previous session is okay, and you can continue working with user data.
NSLog(@"VKSdk wakeUpSession result VKAuthorizationAuthorized");
NSDictionary *loginData = [self buildResponseData];
self->callback(@[[NSNull null], loginData]);
} else if (state == VKAuthorizationInitialized) {
// VKAuthorizationInitialized – means the SDK is ready to work, and you can authorize user with `+authorize:` method. Probably, an old session has expired, and we wiped it out. *This is not an error.*
NSLog(@"VKSdk wakeUpSession result VKAuthorizationInitialized");
[VKSdk authorize:SCOPE];
} else if (state == VKAuthorizationError) {
// VKAuthorizationError - means some error happened when we tried to check the authorization. Probably, the internet connection has a bad quality. You have to try again later.
NSLog(@"VKSdk wakeUpSession result VKAuthorizationError");
self->callback(@[@"VKAuthorizationError", [NSNull null]]);
} else if (error) {
NSLog(@"VKSdk wakeUpSession error %@", error);
NSDictionary *jsError = [self _NSError2JS:error];
self->callback(@[jsError, [NSNull null]]);
}
}];
}
- (NSDictionary *)buildCredentials {
NSDictionary *credentials = nil;
VKAccessToken *token = [VKSdk accessToken];
if (token) {
credentials = @{
@"token" : token.accessToken,
@"userId" : token.userId,
@"permissions" : token.permissions
};
}
return credentials;
}
- (NSDictionary *)buildResponseData {
NSDictionary *responseData = @{
@"credentials": [self buildCredentials]
};
return responseData;
}
- (NSDictionary *)_NSError2JS:(NSError *)error {
NSDictionary *jsError = @{
@"code" : [NSNumber numberWithLong:error.code],
@"domain" : error.domain,
@"description" : error.localizedDescription
};
return jsError;
}
@end