@react-native-kakao/user 3.1.0-next.0 → 3.1.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/android/src/main/java/net/mjstudio/rnkakao/user/RNCKakaoUserModule.kt +325 -150
- package/ios/RNCKakaoUser.mm +59 -6
- package/ios/RNCKakaoUserManager.swift +244 -58
- package/lib/commonjs/index.js +91 -12
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +133 -18
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/spec/NativeKakaoUser.ts +25 -2
- package/lib/module/index.js +86 -13
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +126 -18
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/spec/NativeKakaoUser.ts +25 -2
- package/lib/typescript/src/index.d.ts +90 -25
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/spec/NativeKakaoUser.d.ts +9 -3
- package/lib/typescript/src/spec/NativeKakaoUser.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +213 -35
- package/src/index.web.ts +164 -24
- package/src/spec/NativeKakaoUser.ts +25 -2
package/ios/RNCKakaoUser.mm
CHANGED
|
@@ -17,19 +17,66 @@ RCT_EXPORT_METHOD(isKakaoTalkLoginAvailable : (RCTPromiseResolveBlock)
|
|
|
17
17
|
resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
18
18
|
[[self manager] isKakaoTalkLoginAvailable:resolve reject:reject];
|
|
19
19
|
}
|
|
20
|
-
RCT_EXPORT_METHOD(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
RCT_EXPORT_METHOD(
|
|
21
|
+
login : (NSArray*)serviceTerms prompts : (NSArray*)prompts useKakaoAccountLogin : (BOOL)
|
|
22
|
+
useKakaoAccountLogin iosLaunchMethod : (NSString*)iosLaunchMethod scopes : (NSArray*)scopes
|
|
23
|
+
nonce : (NSString*)nonce loginHint : (NSString*)loginHint channelPublicIds : (NSArray*)
|
|
24
|
+
channelPublicIds androidRequestCode : (NSNumber*)androidRequestCode resolve : (
|
|
25
|
+
RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
24
26
|
[[self manager] login:serviceTerms
|
|
25
27
|
prompts:prompts
|
|
26
28
|
useKakaoAccountLogin:useKakaoAccountLogin
|
|
29
|
+
iosLaunchMethod:iosLaunchMethod
|
|
27
30
|
scopes:scopes
|
|
28
31
|
nonce:nonce
|
|
32
|
+
loginHint:loginHint
|
|
33
|
+
channelPublicIds:channelPublicIds
|
|
29
34
|
resolve:resolve
|
|
30
35
|
reject:reject];
|
|
31
36
|
}
|
|
32
37
|
|
|
38
|
+
RCT_EXPORT_METHOD(signup : (NSDictionary*)properties resolve : (RCTPromiseResolveBlock)
|
|
39
|
+
resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
40
|
+
[[self manager] signup:properties resolve:resolve reject:reject];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
RCT_EXPORT_METHOD(loginWithKakao : (NSString*)uiMode orientation : (NSString*)
|
|
44
|
+
orientation launchMethod : (NSString*)launchMethod prompts : (NSArray*)
|
|
45
|
+
prompts loginHint : (NSString*)loginHint nonce : (NSString*)
|
|
46
|
+
nonce channelPublicIds : (NSArray*)channelPublicIds serviceTerms : (
|
|
47
|
+
NSArray*)serviceTerms resolve : (RCTPromiseResolveBlock)
|
|
48
|
+
resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
49
|
+
[[self manager] loginWithKakao:uiMode
|
|
50
|
+
orientation:orientation
|
|
51
|
+
launchMethod:launchMethod
|
|
52
|
+
prompts:prompts
|
|
53
|
+
loginHint:loginHint
|
|
54
|
+
nonce:nonce
|
|
55
|
+
channelPublicIds:channelPublicIds
|
|
56
|
+
serviceTerms:serviceTerms
|
|
57
|
+
resolve:resolve
|
|
58
|
+
reject:reject];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
RCT_EXPORT_METHOD(issueAccessTokenWithCode : (NSString*)code codeVerifier : (
|
|
62
|
+
NSString*)codeVerifier redirectUri : (NSString*)redirectUri resolve : (RCTPromiseResolveBlock)
|
|
63
|
+
resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
64
|
+
[[self manager] issueAccessTokenWithCode:code
|
|
65
|
+
codeVerifier:codeVerifier
|
|
66
|
+
redirectUri:redirectUri
|
|
67
|
+
resolve:resolve
|
|
68
|
+
reject:reject];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
RCT_EXPORT_METHOD(refreshToken : (NSDictionary*)token iosLoggingEnabled : (NSNumber*)
|
|
72
|
+
iosLoggingEnabled resolve : (RCTPromiseResolveBlock)
|
|
73
|
+
resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
74
|
+
[[self manager] refreshToken:token
|
|
75
|
+
loggingEnabled:iosLoggingEnabled
|
|
76
|
+
resolve:resolve
|
|
77
|
+
reject:reject];
|
|
78
|
+
}
|
|
79
|
+
|
|
33
80
|
RCT_EXPORT_METHOD(logout : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
34
81
|
[[self manager] logout:resolve reject:reject];
|
|
35
82
|
}
|
|
@@ -78,8 +125,14 @@ RCT_EXPORT_METHOD(revokeServiceTerms : (NSArray*)tags resolve : (RCTPromiseResol
|
|
|
78
125
|
[[self manager] revokeServiceTerms:tags resolve:resolve reject:reject];
|
|
79
126
|
}
|
|
80
127
|
|
|
81
|
-
RCT_EXPORT_METHOD(
|
|
82
|
-
|
|
128
|
+
RCT_EXPORT_METHOD(updateProfile : (NSDictionary*)properties resolve : (RCTPromiseResolveBlock)
|
|
129
|
+
resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
130
|
+
[[self manager] updateProfile:properties resolve:resolve reject:reject];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
RCT_EXPORT_METHOD(me : (NSArray*)propertyKeys secureResource : (NSNumber*)secureResource resolve : (
|
|
134
|
+
RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
|
|
135
|
+
[[self manager] me:propertyKeys secureResource:secureResource resolve:resolve reject:reject];
|
|
83
136
|
}
|
|
84
137
|
|
|
85
138
|
RCT_EXPORT_METHOD(selectShippingAddress : (RCTPromiseResolveBlock)
|
|
@@ -31,8 +31,11 @@ import RNCKakaoCore
|
|
|
31
31
|
_ serviceTerms: [String],
|
|
32
32
|
prompts: [String],
|
|
33
33
|
useKakaoAccountLogin: Bool,
|
|
34
|
+
iosLaunchMethod: String,
|
|
34
35
|
scopes: [String],
|
|
35
36
|
nonce: String?,
|
|
37
|
+
loginHint: String?,
|
|
38
|
+
channelPublicIds: [String],
|
|
36
39
|
resolve: @escaping RCTPromiseResolveBlock,
|
|
37
40
|
reject: @escaping RCTPromiseRejectBlock
|
|
38
41
|
) {
|
|
@@ -41,47 +44,25 @@ import RNCKakaoCore
|
|
|
41
44
|
RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
|
|
42
45
|
return
|
|
43
46
|
}
|
|
44
|
-
let callback =
|
|
45
|
-
if let error {
|
|
46
|
-
RNCKakaoUtil.reject(reject, error)
|
|
47
|
-
} else if let token {
|
|
48
|
-
resolve([
|
|
49
|
-
"accessToken": token.accessToken,
|
|
50
|
-
"refreshToken": token.refreshToken,
|
|
51
|
-
"tokenType": token.tokenType,
|
|
52
|
-
"idToken": token.idToken as Any,
|
|
53
|
-
"accessTokenExpiresAt": token.expiredAt.timeIntervalSince1970,
|
|
54
|
-
"refreshTokenExpiresAt": token.refreshTokenExpiredAt.timeIntervalSince1970,
|
|
55
|
-
"accessTokenExpiresIn": token.expiresIn,
|
|
56
|
-
"refreshTokenExpiresIn": token.refreshTokenExpiresIn,
|
|
57
|
-
"scopes": token.scopes ?? []
|
|
58
|
-
])
|
|
59
|
-
} else {
|
|
60
|
-
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "token"))
|
|
61
|
-
}
|
|
62
|
-
}
|
|
47
|
+
let callback = tokenCallback(resolve, reject: reject)
|
|
63
48
|
let accountLogin = {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
49
|
+
let _prompts = self.loginPrompts(prompts)
|
|
50
|
+
if let loginHint {
|
|
51
|
+
UserApi.shared.loginWithKakaoAccount(
|
|
52
|
+
prompts: self.emptyArrayToNil(_prompts),
|
|
53
|
+
loginHint: loginHint,
|
|
54
|
+
nonce: nonce,
|
|
55
|
+
completion: callback
|
|
56
|
+
)
|
|
57
|
+
} else {
|
|
58
|
+
UserApi.shared.loginWithKakaoAccount(
|
|
59
|
+
prompts: self.emptyArrayToNil(_prompts),
|
|
60
|
+
channelPublicIds: self.emptyArrayToNil(channelPublicIds),
|
|
61
|
+
serviceTerms: self.emptyArrayToNil(serviceTerms),
|
|
62
|
+
nonce: nonce,
|
|
63
|
+
completion: callback
|
|
64
|
+
)
|
|
78
65
|
}
|
|
79
|
-
UserApi.shared.loginWithKakaoAccount(
|
|
80
|
-
prompts: self.emptyArrayToNil(_prompts),
|
|
81
|
-
serviceTerms: self.emptyArrayToNil(serviceTerms),
|
|
82
|
-
nonce: nonce,
|
|
83
|
-
completion: callback
|
|
84
|
-
)
|
|
85
66
|
}
|
|
86
67
|
|
|
87
68
|
if !scopes.isEmpty {
|
|
@@ -103,6 +84,8 @@ import RNCKakaoCore
|
|
|
103
84
|
}
|
|
104
85
|
}
|
|
105
86
|
UserApi.shared.loginWithKakaoTalk(
|
|
87
|
+
launchMethod: loginLaunchMethod(iosLaunchMethod),
|
|
88
|
+
channelPublicIds: emptyArrayToNil(channelPublicIds),
|
|
106
89
|
serviceTerms: emptyArrayToNil(serviceTerms),
|
|
107
90
|
nonce: nonce,
|
|
108
91
|
completion: talkCallback
|
|
@@ -113,6 +96,135 @@ import RNCKakaoCore
|
|
|
113
96
|
}
|
|
114
97
|
}
|
|
115
98
|
|
|
99
|
+
@objc public func loginWithKakao(
|
|
100
|
+
_ uiMode: String,
|
|
101
|
+
orientation: String,
|
|
102
|
+
launchMethod: String,
|
|
103
|
+
prompts: [String],
|
|
104
|
+
loginHint: String?,
|
|
105
|
+
nonce: String?,
|
|
106
|
+
channelPublicIds: [String],
|
|
107
|
+
serviceTerms: [String],
|
|
108
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
109
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
110
|
+
) {
|
|
111
|
+
onMain { [self] in
|
|
112
|
+
guard let _ = try? KakaoSDK.shared.appKey() else {
|
|
113
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
|
|
114
|
+
return
|
|
115
|
+
}
|
|
116
|
+
guard nonce == nil else {
|
|
117
|
+
RNCKakaoUtil.reject(
|
|
118
|
+
reject,
|
|
119
|
+
RNCKakaoError
|
|
120
|
+
.unknown(
|
|
121
|
+
"The Kakao iOS login chooser does not forward nonce for account login. Use login instead."
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
return
|
|
125
|
+
}
|
|
126
|
+
UserApi.shared.loginWithKakao(
|
|
127
|
+
BridgeConfiguration(
|
|
128
|
+
orientation: LoginOrientation(rawValue: orientation),
|
|
129
|
+
uiMode: LoginUiMode(rawValue: uiMode)
|
|
130
|
+
),
|
|
131
|
+
loginProperties: LoginConfiguration(
|
|
132
|
+
talk: LoginConfiguration
|
|
133
|
+
.Talk(launchMethod: loginLaunchMethod(launchMethod)),
|
|
134
|
+
account: LoginConfiguration.Account(
|
|
135
|
+
prompts: emptyArrayToNil(loginPrompts(prompts)),
|
|
136
|
+
loginHint: loginHint
|
|
137
|
+
),
|
|
138
|
+
channelPublicIds: emptyArrayToNil(channelPublicIds),
|
|
139
|
+
serviceTerms: emptyArrayToNil(serviceTerms),
|
|
140
|
+
nonce: nonce
|
|
141
|
+
),
|
|
142
|
+
completion: tokenCallback(resolve, reject: reject)
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@objc public func issueAccessTokenWithCode(
|
|
148
|
+
_ code: String,
|
|
149
|
+
codeVerifier: String?,
|
|
150
|
+
redirectUri: String?,
|
|
151
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
152
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
153
|
+
) {
|
|
154
|
+
onMain { [self] in
|
|
155
|
+
guard let _ = try? KakaoSDK.shared.appKey() else {
|
|
156
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
|
|
157
|
+
return
|
|
158
|
+
}
|
|
159
|
+
AuthApi.shared.token(
|
|
160
|
+
code: code,
|
|
161
|
+
codeVerifier: codeVerifier,
|
|
162
|
+
redirectUri: redirectUri ?? KakaoSDK.shared.redirectUri(),
|
|
163
|
+
completion: tokenCallback(resolve, reject: reject)
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@objc public func refreshToken(
|
|
169
|
+
_ token: [String: Any]?,
|
|
170
|
+
loggingEnabled: NSNumber?,
|
|
171
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
172
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
173
|
+
) {
|
|
174
|
+
onMain { [self] in
|
|
175
|
+
guard let _ = try? KakaoSDK.shared.appKey() else {
|
|
176
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
var oldToken: OAuthToken?
|
|
180
|
+
if let token {
|
|
181
|
+
guard let accessToken = token["accessToken"] as? String,
|
|
182
|
+
let refreshToken = token["refreshToken"] as? String,
|
|
183
|
+
let accessTokenExpiresAt = token["accessTokenExpiresAt"] as? Double,
|
|
184
|
+
let refreshTokenExpiresAt = token["refreshTokenExpiresAt"] as? Double,
|
|
185
|
+
let scopes = token["scopes"] as? [String]
|
|
186
|
+
else {
|
|
187
|
+
RNCKakaoUtil.reject(reject, SdkError(reason: .BadParameter))
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
let now = Date().timeIntervalSince1970
|
|
191
|
+
oldToken = OAuthToken(
|
|
192
|
+
accessToken: accessToken,
|
|
193
|
+
expiresIn: accessTokenExpiresAt - now,
|
|
194
|
+
expiredAt: Date(timeIntervalSince1970: accessTokenExpiresAt),
|
|
195
|
+
tokenType: token["tokenType"] as? String ?? "bearer",
|
|
196
|
+
refreshToken: refreshToken,
|
|
197
|
+
refreshTokenExpiresIn: refreshTokenExpiresAt - now,
|
|
198
|
+
refreshTokenExpiredAt: Date(timeIntervalSince1970: refreshTokenExpiresAt),
|
|
199
|
+
scope: scopes.isEmpty ? nil : scopes.joined(separator: " "),
|
|
200
|
+
scopes: scopes,
|
|
201
|
+
idToken: token["idToken"] as? String
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
AuthApi.shared.refreshToken(
|
|
205
|
+
token: oldToken,
|
|
206
|
+
loggingEnabled: loggingEnabled?.boolValue ?? true,
|
|
207
|
+
completion: tokenCallback(resolve, reject: reject)
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@objc public func signup(
|
|
213
|
+
_ properties: [String: String]?,
|
|
214
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
215
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
216
|
+
) {
|
|
217
|
+
onMain {
|
|
218
|
+
UserApi.shared.signup(properties: properties) { _, error in
|
|
219
|
+
if let error {
|
|
220
|
+
RNCKakaoUtil.reject(reject, error)
|
|
221
|
+
} else {
|
|
222
|
+
resolve(nil)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
116
228
|
@objc public func logout(
|
|
117
229
|
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
118
230
|
reject: @escaping RCTPromiseRejectBlock
|
|
@@ -122,7 +234,7 @@ import RNCKakaoCore
|
|
|
122
234
|
if let error {
|
|
123
235
|
RNCKakaoUtil.reject(reject, error)
|
|
124
236
|
} else {
|
|
125
|
-
resolve(
|
|
237
|
+
resolve(nil)
|
|
126
238
|
}
|
|
127
239
|
}
|
|
128
240
|
}
|
|
@@ -184,18 +296,8 @@ import RNCKakaoCore
|
|
|
184
296
|
UserApi.shared.scopes(scopes: emptyArrayToNil(scopes)) { scopeInfo, error in
|
|
185
297
|
if let error {
|
|
186
298
|
RNCKakaoUtil.reject(reject, error)
|
|
187
|
-
} else if let
|
|
188
|
-
resolve(scopes
|
|
189
|
-
[
|
|
190
|
-
"id": s.id,
|
|
191
|
-
"displayName": s.displayName,
|
|
192
|
-
"type": s.type.rawValue,
|
|
193
|
-
"using": s.using,
|
|
194
|
-
"delegated": s.delegated as Any,
|
|
195
|
-
"agreed": s.agreed,
|
|
196
|
-
"revocable": s.revocable as Any
|
|
197
|
-
]
|
|
198
|
-
})
|
|
299
|
+
} else if let scopeInfo {
|
|
300
|
+
resolve(self.mapScopes(scopeInfo.scopes))
|
|
199
301
|
} else {
|
|
200
302
|
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "scopes"))
|
|
201
303
|
}
|
|
@@ -212,8 +314,8 @@ import RNCKakaoCore
|
|
|
212
314
|
UserApi.shared.revokeScopes(scopes: scopes) { info, error in
|
|
213
315
|
if let error {
|
|
214
316
|
RNCKakaoUtil.reject(reject, error)
|
|
215
|
-
} else if info
|
|
216
|
-
resolve(
|
|
317
|
+
} else if let info {
|
|
318
|
+
resolve(self.mapScopes(info.scopes))
|
|
217
319
|
} else {
|
|
218
320
|
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "scopeInfo"))
|
|
219
321
|
}
|
|
@@ -242,6 +344,9 @@ import RNCKakaoCore
|
|
|
242
344
|
if let agreedAt = term.agreedAt {
|
|
243
345
|
response["agreedAt"] = agreedAt.timeIntervalSince1970
|
|
244
346
|
}
|
|
347
|
+
if let referer = term.referer {
|
|
348
|
+
response["agreedBy"] = referer.rawValue
|
|
349
|
+
}
|
|
245
350
|
return response
|
|
246
351
|
})
|
|
247
352
|
} else {
|
|
@@ -336,17 +441,42 @@ import RNCKakaoCore
|
|
|
336
441
|
}
|
|
337
442
|
}
|
|
338
443
|
|
|
444
|
+
@objc public func updateProfile(
|
|
445
|
+
_ properties: [String: String],
|
|
446
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
447
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
448
|
+
) {
|
|
449
|
+
onMain {
|
|
450
|
+
UserApi.shared.updateProfile(properties: properties) { error in
|
|
451
|
+
if let error {
|
|
452
|
+
RNCKakaoUtil.reject(reject, error)
|
|
453
|
+
} else {
|
|
454
|
+
resolve(nil)
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
339
460
|
@objc public func me(
|
|
340
|
-
_
|
|
461
|
+
_ propertyKeys: [String]?,
|
|
462
|
+
secureResource: NSNumber?,
|
|
463
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
341
464
|
reject: @escaping RCTPromiseRejectBlock
|
|
342
465
|
) {
|
|
343
466
|
onMain {
|
|
344
|
-
UserApi.shared.me
|
|
467
|
+
UserApi.shared.me(
|
|
468
|
+
propertyKeys: propertyKeys,
|
|
469
|
+
secureResource: secureResource?.boolValue ?? true
|
|
470
|
+
) { user, error in
|
|
345
471
|
if let error {
|
|
346
472
|
RNCKakaoUtil.reject(reject, error)
|
|
347
473
|
} else if let user {
|
|
348
474
|
resolve([
|
|
349
475
|
"id": user.id as Any,
|
|
476
|
+
"properties": user.properties ?? [:],
|
|
477
|
+
"uuid": user.uuid as Any,
|
|
478
|
+
"groupUserToken": user.groupUserToken as Any,
|
|
479
|
+
"hasSignedUp": user.hasSignedUp as Any,
|
|
350
480
|
"connectedAt": user.connectedAt?.timeIntervalSince1970 as Any,
|
|
351
481
|
"synchedAt": user.synchedAt?.timeIntervalSince1970 as Any,
|
|
352
482
|
"name": user.kakaoAccount?.name as Any,
|
|
@@ -355,10 +485,12 @@ import RNCKakaoCore
|
|
|
355
485
|
"profileImageUrl": user.kakaoAccount?.profile?.profileImageUrl?.absoluteString as Any,
|
|
356
486
|
"thumbnailImageUrl": user.kakaoAccount?.profile?.thumbnailImageUrl?
|
|
357
487
|
.absoluteString as Any,
|
|
488
|
+
"isDefaultImage": user.kakaoAccount?.profile?.isDefaultImage as Any,
|
|
358
489
|
"phoneNumber": user.kakaoAccount?.phoneNumber as Any,
|
|
359
490
|
"ageRange": user.kakaoAccount?.ageRange?.rawValue as Any,
|
|
360
491
|
"birthday": user.kakaoAccount?.birthday as Any,
|
|
361
|
-
"birthdayType": user.kakaoAccount?.birthdayType as Any,
|
|
492
|
+
"birthdayType": user.kakaoAccount?.birthdayType?.rawValue as Any,
|
|
493
|
+
"isLeapMonth": user.kakaoAccount?.isLeapMonth as Any,
|
|
362
494
|
"birthyear": user.kakaoAccount?.birthyear as Any,
|
|
363
495
|
"gender": user.kakaoAccount?.gender?.rawValue as Any,
|
|
364
496
|
"isEmailValid": user.kakaoAccount?.isEmailValid as Any,
|
|
@@ -376,7 +508,12 @@ import RNCKakaoCore
|
|
|
376
508
|
"profileImageNeedsAgreement": user.kakaoAccount?.profileImageNeedsAgreement as Any,
|
|
377
509
|
"profileNicknameNeedsAgreement": user.kakaoAccount?
|
|
378
510
|
.profileNicknameNeedsAgreement as Any,
|
|
379
|
-
"
|
|
511
|
+
"legalName": user.kakaoAccount?.legalName as Any,
|
|
512
|
+
"legalNameNeedsAgreement": user.kakaoAccount?.legalNameNeedsAgreement as Any,
|
|
513
|
+
"legalBirthDate": user.kakaoAccount?.legalBirthDate as Any,
|
|
514
|
+
"legalBirthDateNeedsAgreement": user.kakaoAccount?.legalBirthDateNeedsAgreement as Any,
|
|
515
|
+
"legalGender": user.kakaoAccount?.legalGender?.rawValue as Any,
|
|
516
|
+
"legalGenderNeedsAgreement": user.kakaoAccount?.legalGenderNeedsAgreement as Any
|
|
380
517
|
])
|
|
381
518
|
} else {
|
|
382
519
|
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "user"))
|
|
@@ -406,6 +543,55 @@ import RNCKakaoCore
|
|
|
406
543
|
}
|
|
407
544
|
}
|
|
408
545
|
|
|
546
|
+
private func mapScopes(_ scopes: [Scope]?) -> [[String: Any]] {
|
|
547
|
+
(scopes ?? []).map { scope in
|
|
548
|
+
[
|
|
549
|
+
"id": scope.id,
|
|
550
|
+
"displayName": scope.displayName,
|
|
551
|
+
"type": scope.type.rawValue,
|
|
552
|
+
"using": scope.using,
|
|
553
|
+
"delegated": scope.delegated as Any,
|
|
554
|
+
"agreed": scope.agreed,
|
|
555
|
+
"revocable": scope.revocable as Any
|
|
556
|
+
]
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
private func loginLaunchMethod(_ value: String) -> LaunchMethod {
|
|
561
|
+
value == "CustomScheme" ? .CustomScheme : .UniversalLink
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
private func loginPrompts(_ prompts: [String]) -> [Prompt] {
|
|
565
|
+
prompts
|
|
566
|
+
.compactMap { Prompt(rawValue: $0 == "SelectAccount" ? "select_account" : $0.lowercased()) }
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
private func tokenCallback(
|
|
570
|
+
_ resolve: @escaping RCTPromiseResolveBlock,
|
|
571
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
572
|
+
) -> (OAuthToken?, Error?) -> Void {
|
|
573
|
+
{ (token: OAuthToken?, error: Error?) in
|
|
574
|
+
if let error {
|
|
575
|
+
RNCKakaoUtil.reject(reject, error)
|
|
576
|
+
} else if let token {
|
|
577
|
+
let now = Date()
|
|
578
|
+
resolve([
|
|
579
|
+
"accessToken": token.accessToken,
|
|
580
|
+
"refreshToken": token.refreshToken,
|
|
581
|
+
"tokenType": token.tokenType,
|
|
582
|
+
"idToken": token.idToken as Any,
|
|
583
|
+
"accessTokenExpiresAt": token.expiredAt.timeIntervalSince1970,
|
|
584
|
+
"refreshTokenExpiresAt": token.refreshTokenExpiredAt.timeIntervalSince1970,
|
|
585
|
+
"accessTokenExpiresIn": Int(token.expiredAt.timeIntervalSince(now)),
|
|
586
|
+
"refreshTokenExpiresIn": Int(token.refreshTokenExpiredAt.timeIntervalSince(now)),
|
|
587
|
+
"scopes": token.scopes ?? []
|
|
588
|
+
])
|
|
589
|
+
} else {
|
|
590
|
+
RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "token"))
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
409
595
|
private func emptyArrayToNil<T>(_ arr: [T]?) -> [T]? {
|
|
410
596
|
if arr == nil || arr?.isEmpty == true {
|
|
411
597
|
return nil
|
package/lib/commonjs/index.js
CHANGED
|
@@ -8,39 +8,84 @@ exports.getAccessToken = getAccessToken;
|
|
|
8
8
|
exports.hasToken = void 0;
|
|
9
9
|
exports.isKakaoTalkLoginAvailable = isKakaoTalkLoginAvailable;
|
|
10
10
|
exports.isLogined = isLogined;
|
|
11
|
+
exports.issueAccessTokenWithCode = issueAccessTokenWithCode;
|
|
11
12
|
exports.issueAccessTokenWithCodeWeb = issueAccessTokenWithCodeWeb;
|
|
12
13
|
exports.login = login;
|
|
14
|
+
exports.loginWithKakao = loginWithKakao;
|
|
13
15
|
exports.logout = logout;
|
|
14
16
|
exports.me = me;
|
|
17
|
+
exports.refreshToken = refreshToken;
|
|
15
18
|
exports.revokeScopes = revokeScopes;
|
|
19
|
+
exports.revokeScopesWithResult = revokeScopesWithResult;
|
|
16
20
|
exports.revokeServiceTerms = revokeServiceTerms;
|
|
17
21
|
exports.scopes = scopes;
|
|
18
22
|
exports.selectShippingAddress = selectShippingAddress;
|
|
19
23
|
exports.serviceTerms = serviceTerms;
|
|
20
24
|
exports.setAccessTokenWeb = setAccessTokenWeb;
|
|
21
25
|
exports.shippingAddresses = shippingAddresses;
|
|
26
|
+
exports.signup = signup;
|
|
22
27
|
exports.unlink = unlink;
|
|
28
|
+
exports.updateProfile = updateProfile;
|
|
23
29
|
var _jsUtil = require("@mj-studio/js-util");
|
|
24
30
|
var _core = require("@react-native-kakao/core");
|
|
25
31
|
var _NativeKakaoUser = _interopRequireDefault(require("./spec/NativeKakaoUser"));
|
|
26
32
|
var _validateShippingAddressOptions = require("./validateShippingAddressOptions");
|
|
27
33
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
34
|
+
const minActivityRequestCode = -2147483648;
|
|
35
|
+
const maxActivityRequestCode = 2147483647;
|
|
36
|
+
const defaultTalkLaunchMethod = 'UniversalLink';
|
|
37
|
+
const webOnlyErrorCode = 'Package-UnsupportedPlatform';
|
|
28
38
|
function login({
|
|
29
39
|
serviceTerms,
|
|
30
40
|
prompts,
|
|
31
41
|
useKakaoAccountLogin,
|
|
32
42
|
scopes,
|
|
33
|
-
nonce
|
|
43
|
+
nonce,
|
|
44
|
+
loginHint,
|
|
45
|
+
channelPublicIds,
|
|
46
|
+
android,
|
|
47
|
+
ios
|
|
34
48
|
} = {}) {
|
|
49
|
+
const requestCode = android?.requestCode;
|
|
50
|
+
(0, _core.kAssert)(requestCode == null || Number.isInteger(requestCode) && requestCode >= minActivityRequestCode && requestCode <= maxActivityRequestCode, `[login] android.requestCode must be an integer from ${minActivityRequestCode} to ${maxActivityRequestCode}`);
|
|
35
51
|
(0, _core.kAssert)(!useKakaoAccountLogin ? !_jsUtil.is.notEmptyArray(prompts) && !_jsUtil.is.notEmptyArray(scopes) : true, '[login] `prompts` and `scopes` cannot be passed if useKakaoAccountLogin is false.');
|
|
36
|
-
(0, _core.kAssert)(_jsUtil.is.notEmptyArray(scopes) ? !_jsUtil.is.notEmptyArray(prompts) && !_jsUtil.is.notEmptyArray(serviceTerms) : true, '[login] `scopes` cannot be passed with `prompts` or `
|
|
37
|
-
|
|
52
|
+
(0, _core.kAssert)(_jsUtil.is.notEmptyArray(scopes) ? !_jsUtil.is.notEmptyArray(prompts) && !_jsUtil.is.notEmptyArray(serviceTerms) && !_jsUtil.is.notEmptyArray(channelPublicIds) : true, '[login] `scopes` cannot be passed with `prompts`, `serviceTerms`, or `channelPublicIds`');
|
|
53
|
+
(0, _core.kAssert)(loginHint == null || !_jsUtil.is.notEmptyArray(scopes) && !_jsUtil.is.notEmptyArray(serviceTerms) && !_jsUtil.is.notEmptyArray(channelPublicIds), '[login] `loginHint` cannot be passed with `scopes`, `serviceTerms`, or `channelPublicIds` on native platforms.');
|
|
54
|
+
return _NativeKakaoUser.default.login(serviceTerms ?? [], prompts ?? [], useKakaoAccountLogin ?? false, ios?.launchMethod ?? defaultTalkLaunchMethod, scopes ?? [], nonce, loginHint, channelPublicIds ?? [], requestCode);
|
|
38
55
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
56
|
+
async function signup({
|
|
57
|
+
properties
|
|
58
|
+
} = {}) {
|
|
59
|
+
await _NativeKakaoUser.default.signup(properties);
|
|
60
|
+
}
|
|
61
|
+
function loginWithKakao({
|
|
62
|
+
uiMode = 'auto',
|
|
63
|
+
prompts,
|
|
64
|
+
loginHint,
|
|
65
|
+
nonce,
|
|
66
|
+
channelPublicIds,
|
|
67
|
+
serviceTerms,
|
|
68
|
+
ios
|
|
69
|
+
} = {}) {
|
|
70
|
+
return _NativeKakaoUser.default.loginWithKakao(uiMode, ios?.orientation ?? 'auto', ios?.launchMethod ?? defaultTalkLaunchMethod, prompts ?? [], loginHint, nonce, channelPublicIds ?? [], serviceTerms ?? []);
|
|
71
|
+
}
|
|
72
|
+
function refreshToken({
|
|
73
|
+
token,
|
|
74
|
+
ios
|
|
75
|
+
} = {}) {
|
|
76
|
+
(0, _core.kAssert)(ios?.loggingEnabled == null || typeof ios.loggingEnabled === 'boolean', '[refreshToken] ios.loggingEnabled must be a boolean');
|
|
77
|
+
if (token !== undefined) {
|
|
78
|
+
(0, _core.kAssert)(token != null && _jsUtil.is.string(token.accessToken) && token.accessToken.length > 0 && _jsUtil.is.string(token.refreshToken) && token.refreshToken.length > 0, '[refreshToken] token must contain non-empty accessToken and refreshToken strings');
|
|
79
|
+
(0, _core.kAssert)([token.accessTokenExpiresAt, token.refreshTokenExpiresAt].every(value => Number.isFinite(value) && !Number.isNaN(new Date(value * 1000).getTime())) && [token.accessTokenExpiresIn, token.refreshTokenExpiresIn].every(Number.isFinite), '[refreshToken] token expiry timestamps must be valid Unix seconds and lifetimes must be finite');
|
|
80
|
+
(0, _core.kAssert)((token.tokenType == null || _jsUtil.is.string(token.tokenType)) && (token.idToken == null || _jsUtil.is.string(token.idToken)) && Array.isArray(token.scopes) && token.scopes.every(scope => _jsUtil.is.string(scope)), '[refreshToken] tokenType and idToken must be strings when present, and scopes must be strings');
|
|
81
|
+
}
|
|
82
|
+
return _NativeKakaoUser.default.refreshToken(token, ios?.loggingEnabled ?? true);
|
|
83
|
+
}
|
|
84
|
+
async function logout() {
|
|
85
|
+
await _NativeKakaoUser.default.logout();
|
|
41
86
|
}
|
|
42
|
-
function unlink() {
|
|
43
|
-
|
|
87
|
+
async function unlink() {
|
|
88
|
+
await _NativeKakaoUser.default.unlink();
|
|
44
89
|
}
|
|
45
90
|
function isLogined() {
|
|
46
91
|
return _NativeKakaoUser.default.isLogined();
|
|
@@ -52,7 +97,10 @@ function isKakaoTalkLoginAvailable() {
|
|
|
52
97
|
function scopes(scopes) {
|
|
53
98
|
return _NativeKakaoUser.default.scopes(scopes);
|
|
54
99
|
}
|
|
55
|
-
function revokeScopes(scopes) {
|
|
100
|
+
async function revokeScopes(scopes) {
|
|
101
|
+
await _NativeKakaoUser.default.revokeScopes(scopes);
|
|
102
|
+
}
|
|
103
|
+
function revokeScopesWithResult(scopes) {
|
|
56
104
|
return _NativeKakaoUser.default.revokeScopes(scopes);
|
|
57
105
|
}
|
|
58
106
|
function serviceTerms({
|
|
@@ -79,21 +127,50 @@ function revokeServiceTerms(tags) {
|
|
|
79
127
|
function selectShippingAddress() {
|
|
80
128
|
return _NativeKakaoUser.default.selectShippingAddress();
|
|
81
129
|
}
|
|
82
|
-
function me(
|
|
83
|
-
|
|
130
|
+
function me({
|
|
131
|
+
propertyKeys,
|
|
132
|
+
secureResource = true
|
|
133
|
+
} = {}) {
|
|
134
|
+
return _NativeKakaoUser.default.me(propertyKeys, secureResource);
|
|
135
|
+
}
|
|
136
|
+
async function issueAccessTokenWithCode({
|
|
137
|
+
code,
|
|
138
|
+
codeVerifier,
|
|
139
|
+
redirectUri
|
|
140
|
+
}) {
|
|
141
|
+
(0, _core.kAssert)(_jsUtil.is.string(code) && code.length > 0, '[issueAccessTokenWithCode] code is required');
|
|
142
|
+
return _NativeKakaoUser.default.issueAccessTokenWithCode(code, codeVerifier, redirectUri);
|
|
84
143
|
}
|
|
85
144
|
function getAccessToken() {
|
|
86
145
|
return _NativeKakaoUser.default.getAccessToken();
|
|
87
146
|
}
|
|
147
|
+
async function updateProfile({
|
|
148
|
+
properties
|
|
149
|
+
}) {
|
|
150
|
+
await _NativeKakaoUser.default.updateProfile(properties);
|
|
151
|
+
}
|
|
88
152
|
|
|
89
153
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
90
|
-
function setAccessTokenWeb(token) {
|
|
154
|
+
function setAccessTokenWeb(token) {
|
|
155
|
+
(0, _core.kCreateWebError)({
|
|
156
|
+
code: webOnlyErrorCode,
|
|
157
|
+
message: '[setAccessTokenWeb] This API is only supported on web.'
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
91
161
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
92
162
|
async function issueAccessTokenWithCodeWeb(params) {
|
|
93
|
-
|
|
163
|
+
(0, _core.kCreateWebError)({
|
|
164
|
+
code: webOnlyErrorCode,
|
|
165
|
+
message: '[issueAccessTokenWithCodeWeb] This API is only supported on web.'
|
|
166
|
+
});
|
|
94
167
|
}
|
|
95
168
|
const KakaoUser = {
|
|
96
169
|
login,
|
|
170
|
+
loginWithKakao,
|
|
171
|
+
refreshToken,
|
|
172
|
+
issueAccessTokenWithCode,
|
|
173
|
+
signup,
|
|
97
174
|
logout,
|
|
98
175
|
unlink,
|
|
99
176
|
isLogined,
|
|
@@ -101,11 +178,13 @@ const KakaoUser = {
|
|
|
101
178
|
isKakaoTalkLoginAvailable,
|
|
102
179
|
scopes,
|
|
103
180
|
revokeScopes,
|
|
181
|
+
revokeScopesWithResult,
|
|
104
182
|
serviceTerms,
|
|
105
183
|
revokeServiceTerms,
|
|
106
184
|
shippingAddresses,
|
|
107
185
|
selectShippingAddress,
|
|
108
186
|
me,
|
|
187
|
+
updateProfile,
|
|
109
188
|
getAccessToken,
|
|
110
189
|
setAccessTokenWeb,
|
|
111
190
|
issueAccessTokenWithCodeWeb
|