@react-native-kakao/user 3.0.0 → 3.1.0-next.1

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.
@@ -17,19 +17,65 @@ 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(login : (NSArray*)serviceTerms prompts : (NSArray*)
21
- prompts useKakaoAccountLogin : (BOOL)useKakaoAccountLogin scopes : (NSArray*)
22
- scopes nonce : (NSString*)nonce resolve : (RCTPromiseResolveBlock)
23
- resolve reject : (RCTPromiseRejectBlock)reject) {
20
+ RCT_EXPORT_METHOD(
21
+ login : (NSArray*)serviceTerms prompts : (NSArray*)prompts useKakaoAccountLogin : (BOOL)
22
+ useKakaoAccountLogin scopes : (NSArray*)scopes nonce : (NSString*)
23
+ 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
27
29
  scopes:scopes
28
30
  nonce:nonce
31
+ loginHint:loginHint
32
+ channelPublicIds:channelPublicIds
29
33
  resolve:resolve
30
34
  reject:reject];
31
35
  }
32
36
 
37
+ RCT_EXPORT_METHOD(signup : (NSDictionary*)properties resolve : (RCTPromiseResolveBlock)
38
+ resolve reject : (RCTPromiseRejectBlock)reject) {
39
+ [[self manager] signup:properties resolve:resolve reject:reject];
40
+ }
41
+
42
+ RCT_EXPORT_METHOD(loginWithKakao : (NSString*)uiMode orientation : (NSString*)
43
+ orientation launchMethod : (NSString*)launchMethod prompts : (NSArray*)
44
+ prompts loginHint : (NSString*)loginHint nonce : (NSString*)
45
+ nonce channelPublicIds : (NSArray*)channelPublicIds serviceTerms : (
46
+ NSArray*)serviceTerms resolve : (RCTPromiseResolveBlock)
47
+ resolve reject : (RCTPromiseRejectBlock)reject) {
48
+ [[self manager] loginWithKakao:uiMode
49
+ orientation:orientation
50
+ launchMethod:launchMethod
51
+ prompts:prompts
52
+ loginHint:loginHint
53
+ nonce:nonce
54
+ channelPublicIds:channelPublicIds
55
+ serviceTerms:serviceTerms
56
+ resolve:resolve
57
+ reject:reject];
58
+ }
59
+
60
+ RCT_EXPORT_METHOD(issueAccessTokenWithCode : (NSString*)code codeVerifier : (
61
+ NSString*)codeVerifier redirectUri : (NSString*)redirectUri resolve : (RCTPromiseResolveBlock)
62
+ resolve reject : (RCTPromiseRejectBlock)reject) {
63
+ [[self manager] issueAccessTokenWithCode:code
64
+ codeVerifier:codeVerifier
65
+ redirectUri:redirectUri
66
+ resolve:resolve
67
+ reject:reject];
68
+ }
69
+
70
+ RCT_EXPORT_METHOD(refreshToken : (NSDictionary*)token iosLoggingEnabled : (NSNumber*)
71
+ iosLoggingEnabled resolve : (RCTPromiseResolveBlock)
72
+ resolve reject : (RCTPromiseRejectBlock)reject) {
73
+ [[self manager] refreshToken:token
74
+ loggingEnabled:iosLoggingEnabled
75
+ resolve:resolve
76
+ reject:reject];
77
+ }
78
+
33
79
  RCT_EXPORT_METHOD(logout : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
34
80
  [[self manager] logout:resolve reject:reject];
35
81
  }
@@ -43,6 +89,11 @@ RCT_EXPORT_METHOD(isLogined : (RCTPromiseResolveBlock)resolve reject : (RCTPromi
43
89
  [[self manager] isLogined:resolve reject:reject];
44
90
  }
45
91
 
92
+ RCT_EXPORT_METHOD(hasToken : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
93
+ reject) {
94
+ [[self manager] hasToken:resolve reject:reject];
95
+ }
96
+
46
97
  RCT_EXPORT_METHOD(scopes : (NSArray*)scopes resolve : (RCTPromiseResolveBlock)
47
98
  resolve reject : (RCTPromiseRejectBlock)reject) {
48
99
  [[self manager] scopes:scopes resolve:resolve reject:reject];
@@ -53,18 +104,39 @@ RCT_EXPORT_METHOD(revokeScopes : (NSArray*)scopes resolve : (RCTPromiseResolveBl
53
104
  [[self manager] revokeScopes:scopes resolve:resolve reject:reject];
54
105
  }
55
106
 
56
- RCT_EXPORT_METHOD(serviceTerms : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
57
- reject) {
58
- [[self manager] serviceTerms:resolve reject:reject];
107
+ RCT_EXPORT_METHOD(serviceTerms : (NSString*)result tags : (NSArray*)tags resolve : (
108
+ RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
109
+ [[self manager] serviceTerms:result tags:tags resolve:resolve reject:reject];
110
+ }
111
+
112
+ RCT_EXPORT_METHOD(shippingAddresses : (NSNumber*)addressId fromUpdatedAt : (
113
+ NSNumber*)fromUpdatedAt pageSize : (NSNumber*)pageSize resolve : (RCTPromiseResolveBlock)
114
+ resolve reject : (RCTPromiseRejectBlock)reject) {
115
+ [[self manager] shippingAddresses:addressId
116
+ fromUpdatedAt:fromUpdatedAt
117
+ pageSize:pageSize
118
+ resolve:resolve
119
+ reject:reject];
120
+ }
121
+
122
+ RCT_EXPORT_METHOD(revokeServiceTerms : (NSArray*)tags resolve : (RCTPromiseResolveBlock)
123
+ resolve reject : (RCTPromiseRejectBlock)reject) {
124
+ [[self manager] revokeServiceTerms:tags resolve:resolve reject:reject];
125
+ }
126
+
127
+ RCT_EXPORT_METHOD(updateProfile : (NSDictionary*)properties resolve : (RCTPromiseResolveBlock)
128
+ resolve reject : (RCTPromiseRejectBlock)reject) {
129
+ [[self manager] updateProfile:properties resolve:resolve reject:reject];
59
130
  }
60
131
 
61
- RCT_EXPORT_METHOD(shippingAddresses : (RCTPromiseResolveBlock)
132
+ RCT_EXPORT_METHOD(me : (NSNumber*)secureResource resolve : (RCTPromiseResolveBlock)
62
133
  resolve reject : (RCTPromiseRejectBlock)reject) {
63
- [[self manager] shippingAddresses:resolve reject:reject];
134
+ [[self manager] me:secureResource resolve:resolve reject:reject];
64
135
  }
65
136
 
66
- RCT_EXPORT_METHOD(me : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
67
- [[self manager] me:resolve reject:reject];
137
+ RCT_EXPORT_METHOD(selectShippingAddress : (RCTPromiseResolveBlock)
138
+ resolve reject : (RCTPromiseRejectBlock)reject) {
139
+ [[self manager] selectShippingAddress:resolve reject:reject];
68
140
  }
69
141
 
70
142
  RCT_EXPORT_METHOD(getAccessToken : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)
@@ -33,6 +33,8 @@ import RNCKakaoCore
33
33
  useKakaoAccountLogin: Bool,
34
34
  scopes: [String],
35
35
  nonce: String?,
36
+ loginHint: String?,
37
+ channelPublicIds: [String],
36
38
  resolve: @escaping RCTPromiseResolveBlock,
37
39
  reject: @escaping RCTPromiseRejectBlock
38
40
  ) {
@@ -41,47 +43,25 @@ import RNCKakaoCore
41
43
  RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
42
44
  return
43
45
  }
44
- let callback = { (token: OAuthToken?, error: Error?) in
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
- }
46
+ let callback = tokenCallback(resolve, reject: reject)
63
47
  let accountLogin = {
64
- var _prompts: [Prompt] = []
65
- for p in prompts {
66
- if p == "Login" {
67
- _prompts.append(.Login)
68
- }
69
- if p == "Cert" {
70
- _prompts.append(.Cert)
71
- }
72
- if p == "Create" {
73
- _prompts.append(.Create)
74
- }
75
- if p == "SelectAccount" {
76
- _prompts.append(.SelectAccount)
77
- }
48
+ let _prompts = self.loginPrompts(prompts)
49
+ if let loginHint {
50
+ UserApi.shared.loginWithKakaoAccount(
51
+ prompts: self.emptyArrayToNil(_prompts),
52
+ loginHint: loginHint,
53
+ nonce: nonce,
54
+ completion: callback
55
+ )
56
+ } else {
57
+ UserApi.shared.loginWithKakaoAccount(
58
+ prompts: self.emptyArrayToNil(_prompts),
59
+ channelPublicIds: self.emptyArrayToNil(channelPublicIds),
60
+ serviceTerms: self.emptyArrayToNil(serviceTerms),
61
+ nonce: nonce,
62
+ completion: callback
63
+ )
78
64
  }
79
- UserApi.shared.loginWithKakaoAccount(
80
- prompts: self.emptyArrayToNil(_prompts),
81
- serviceTerms: self.emptyArrayToNil(serviceTerms),
82
- nonce: nonce,
83
- completion: callback
84
- )
85
65
  }
86
66
 
87
67
  if !scopes.isEmpty {
@@ -103,6 +83,7 @@ import RNCKakaoCore
103
83
  }
104
84
  }
105
85
  UserApi.shared.loginWithKakaoTalk(
86
+ channelPublicIds: emptyArrayToNil(channelPublicIds),
106
87
  serviceTerms: emptyArrayToNil(serviceTerms),
107
88
  nonce: nonce,
108
89
  completion: talkCallback
@@ -113,6 +94,135 @@ import RNCKakaoCore
113
94
  }
114
95
  }
115
96
 
97
+ @objc public func loginWithKakao(
98
+ _ uiMode: String,
99
+ orientation: String,
100
+ launchMethod: String,
101
+ prompts: [String],
102
+ loginHint: String?,
103
+ nonce: String?,
104
+ channelPublicIds: [String],
105
+ serviceTerms: [String],
106
+ resolve: @escaping RCTPromiseResolveBlock,
107
+ reject: @escaping RCTPromiseRejectBlock
108
+ ) {
109
+ onMain { [self] in
110
+ guard let _ = try? KakaoSDK.shared.appKey() else {
111
+ RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
112
+ return
113
+ }
114
+ guard nonce == nil else {
115
+ RNCKakaoUtil.reject(
116
+ reject,
117
+ RNCKakaoError
118
+ .unknown(
119
+ "The Kakao iOS login chooser does not forward nonce for account login. Use login instead."
120
+ )
121
+ )
122
+ return
123
+ }
124
+ UserApi.shared.loginWithKakao(
125
+ BridgeConfiguration(
126
+ orientation: LoginOrientation(rawValue: orientation),
127
+ uiMode: LoginUiMode(rawValue: uiMode)
128
+ ),
129
+ loginProperties: LoginConfiguration(
130
+ talk: LoginConfiguration
131
+ .Talk(launchMethod: launchMethod == "CustomScheme" ? .CustomScheme : .UniversalLink),
132
+ account: LoginConfiguration.Account(
133
+ prompts: emptyArrayToNil(loginPrompts(prompts)),
134
+ loginHint: loginHint
135
+ ),
136
+ channelPublicIds: emptyArrayToNil(channelPublicIds),
137
+ serviceTerms: emptyArrayToNil(serviceTerms),
138
+ nonce: nonce
139
+ ),
140
+ completion: tokenCallback(resolve, reject: reject)
141
+ )
142
+ }
143
+ }
144
+
145
+ @objc public func issueAccessTokenWithCode(
146
+ _ code: String,
147
+ codeVerifier: String?,
148
+ redirectUri: String?,
149
+ resolve: @escaping RCTPromiseResolveBlock,
150
+ reject: @escaping RCTPromiseRejectBlock
151
+ ) {
152
+ onMain { [self] in
153
+ guard let _ = try? KakaoSDK.shared.appKey() else {
154
+ RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
155
+ return
156
+ }
157
+ AuthApi.shared.token(
158
+ code: code,
159
+ codeVerifier: codeVerifier,
160
+ redirectUri: redirectUri ?? KakaoSDK.shared.redirectUri(),
161
+ completion: tokenCallback(resolve, reject: reject)
162
+ )
163
+ }
164
+ }
165
+
166
+ @objc public func refreshToken(
167
+ _ token: [String: Any]?,
168
+ loggingEnabled: NSNumber?,
169
+ resolve: @escaping RCTPromiseResolveBlock,
170
+ reject: @escaping RCTPromiseRejectBlock
171
+ ) {
172
+ onMain { [self] in
173
+ guard let _ = try? KakaoSDK.shared.appKey() else {
174
+ RNCKakaoUtil.reject(reject, RNCKakaoError.sdkNotInitialized)
175
+ return
176
+ }
177
+ var oldToken: OAuthToken?
178
+ if let token {
179
+ guard let accessToken = token["accessToken"] as? String,
180
+ let refreshToken = token["refreshToken"] as? String,
181
+ let accessTokenExpiresAt = token["accessTokenExpiresAt"] as? Double,
182
+ let refreshTokenExpiresAt = token["refreshTokenExpiresAt"] as? Double,
183
+ let scopes = token["scopes"] as? [String]
184
+ else {
185
+ RNCKakaoUtil.reject(reject, SdkError(reason: .BadParameter))
186
+ return
187
+ }
188
+ let now = Date().timeIntervalSince1970
189
+ oldToken = OAuthToken(
190
+ accessToken: accessToken,
191
+ expiresIn: accessTokenExpiresAt - now,
192
+ expiredAt: Date(timeIntervalSince1970: accessTokenExpiresAt),
193
+ tokenType: token["tokenType"] as? String ?? "bearer",
194
+ refreshToken: refreshToken,
195
+ refreshTokenExpiresIn: refreshTokenExpiresAt - now,
196
+ refreshTokenExpiredAt: Date(timeIntervalSince1970: refreshTokenExpiresAt),
197
+ scope: scopes.isEmpty ? nil : scopes.joined(separator: " "),
198
+ scopes: scopes,
199
+ idToken: token["idToken"] as? String
200
+ )
201
+ }
202
+ AuthApi.shared.refreshToken(
203
+ token: oldToken,
204
+ loggingEnabled: loggingEnabled?.boolValue ?? true,
205
+ completion: tokenCallback(resolve, reject: reject)
206
+ )
207
+ }
208
+ }
209
+
210
+ @objc public func signup(
211
+ _ properties: [String: String]?,
212
+ resolve: @escaping RCTPromiseResolveBlock,
213
+ reject: @escaping RCTPromiseRejectBlock
214
+ ) {
215
+ onMain {
216
+ UserApi.shared.signup(properties: properties) { _, error in
217
+ if let error {
218
+ RNCKakaoUtil.reject(reject, error)
219
+ } else {
220
+ resolve(nil)
221
+ }
222
+ }
223
+ }
224
+ }
225
+
116
226
  @objc public func logout(
117
227
  _ resolve: @escaping RCTPromiseResolveBlock,
118
228
  reject: @escaping RCTPromiseRejectBlock
@@ -166,6 +276,15 @@ import RNCKakaoCore
166
276
  }
167
277
  }
168
278
 
279
+ @objc public func hasToken(
280
+ _ resolve: @escaping RCTPromiseResolveBlock,
281
+ reject _: @escaping RCTPromiseRejectBlock
282
+ ) {
283
+ onMain {
284
+ resolve(AuthApi.hasToken())
285
+ }
286
+ }
287
+
169
288
  @objc public func scopes(
170
289
  _ scopes: [String]? = nil,
171
290
  resolve: @escaping RCTPromiseResolveBlock,
@@ -213,22 +332,27 @@ import RNCKakaoCore
213
332
  }
214
333
 
215
334
  @objc public func serviceTerms(
216
- _ resolve: @escaping RCTPromiseResolveBlock,
335
+ _ result: String?,
336
+ tags: [String]?,
337
+ resolve: @escaping RCTPromiseResolveBlock,
217
338
  reject: @escaping RCTPromiseRejectBlock
218
339
  ) {
219
340
  onMain {
220
- UserApi.shared.serviceTerms { serviceTerms, error in
341
+ UserApi.shared.serviceTerms(result: result, tags: tags) { serviceTerms, error in
221
342
  if let error {
222
343
  RNCKakaoUtil.reject(reject, error)
223
- } else if let serviceTerms = serviceTerms?.serviceTerms {
224
- resolve(serviceTerms.map {
225
- [
226
- "tag": $0.tag,
227
- "agreedAt": $0.agreedAt?.timeIntervalSince1970 as Any,
228
- "agreed": $0.agreed,
229
- "required": $0.required,
230
- "revocable": $0.revocable
344
+ } else if let serviceTerms {
345
+ resolve((serviceTerms.serviceTerms ?? []).map { term in
346
+ var response: [String: Any] = [
347
+ "tag": term.tag,
348
+ "agreed": term.agreed,
349
+ "required": term.required,
350
+ "revocable": term.revocable
231
351
  ]
352
+ if let agreedAt = term.agreedAt {
353
+ response["agreedAt"] = agreedAt.timeIntervalSince1970
354
+ }
355
+ return response
232
356
  })
233
357
  } else {
234
358
  RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "serviceTerms"))
@@ -238,11 +362,14 @@ import RNCKakaoCore
238
362
  }
239
363
 
240
364
  @objc public func shippingAddresses(
241
- _ resolve: @escaping RCTPromiseResolveBlock,
365
+ _ addressId: NSNumber?,
366
+ fromUpdatedAt: NSNumber?,
367
+ pageSize: NSNumber?,
368
+ resolve: @escaping RCTPromiseResolveBlock,
242
369
  reject: @escaping RCTPromiseRejectBlock
243
370
  ) {
244
371
  onMain {
245
- UserApi.shared.shippingAddresses { s, error in
372
+ let completion: (UserShippingAddresses?, Error?) -> Void = { s, error in
246
373
  if let error {
247
374
  RNCKakaoUtil.reject(reject, error)
248
375
  } else if let s {
@@ -270,20 +397,86 @@ import RNCKakaoCore
270
397
  RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "shippingAddresses"))
271
398
  }
272
399
  }
400
+ if let addressId {
401
+ UserApi.shared.shippingAddresses(addressId: addressId.int64Value, completion: completion)
402
+ } else {
403
+ UserApi.shared.shippingAddresses(
404
+ fromUpdatedAt: fromUpdatedAt.map { Date(timeIntervalSince1970: $0.doubleValue) },
405
+ pageSize: pageSize?.intValue,
406
+ completion: completion
407
+ )
408
+ }
273
409
  }
274
410
  }
275
411
 
276
- @objc public func me(
412
+ @objc public func revokeServiceTerms(
413
+ _ tags: [String],
414
+ resolve: @escaping RCTPromiseResolveBlock,
415
+ reject: @escaping RCTPromiseRejectBlock
416
+ ) {
417
+ onMain {
418
+ UserApi.shared.revokeServiceTerms(tags: tags) { response, error in
419
+ if let error {
420
+ RNCKakaoUtil.reject(reject, error)
421
+ } else if let response {
422
+ resolve((response.revokedServiceTerms ?? []).map {
423
+ ["tag": $0.tag, "agreed": $0.agreed]
424
+ })
425
+ } else {
426
+ RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "revokeServiceTerms"))
427
+ }
428
+ }
429
+ }
430
+ }
431
+
432
+ @objc public func selectShippingAddress(
277
433
  _ resolve: @escaping RCTPromiseResolveBlock,
278
434
  reject: @escaping RCTPromiseRejectBlock
279
435
  ) {
280
436
  onMain {
281
- UserApi.shared.me { user, error in
437
+ UserApi.shared.selectShippingAddress { addressId, error in
438
+ if let error {
439
+ RNCKakaoUtil.reject(reject, error)
440
+ } else if let addressId {
441
+ resolve(addressId)
442
+ } else {
443
+ RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "addressId"))
444
+ }
445
+ }
446
+ }
447
+ }
448
+
449
+ @objc public func updateProfile(
450
+ _ properties: [String: String],
451
+ resolve: @escaping RCTPromiseResolveBlock,
452
+ reject: @escaping RCTPromiseRejectBlock
453
+ ) {
454
+ onMain {
455
+ UserApi.shared.updateProfile(properties: properties) { error in
456
+ if let error {
457
+ RNCKakaoUtil.reject(reject, error)
458
+ } else {
459
+ resolve(nil)
460
+ }
461
+ }
462
+ }
463
+ }
464
+
465
+ @objc public func me(
466
+ _ secureResource: NSNumber?,
467
+ resolve: @escaping RCTPromiseResolveBlock,
468
+ reject: @escaping RCTPromiseRejectBlock
469
+ ) {
470
+ onMain {
471
+ UserApi.shared.me(secureResource: secureResource?.boolValue ?? true) { user, error in
282
472
  if let error {
283
473
  RNCKakaoUtil.reject(reject, error)
284
474
  } else if let user {
285
475
  resolve([
286
476
  "id": user.id as Any,
477
+ "uuid": user.uuid as Any,
478
+ "groupUserToken": user.groupUserToken as Any,
479
+ "hasSignedUp": user.hasSignedUp as Any,
287
480
  "connectedAt": user.connectedAt?.timeIntervalSince1970 as Any,
288
481
  "synchedAt": user.synchedAt?.timeIntervalSince1970 as Any,
289
482
  "name": user.kakaoAccount?.name as Any,
@@ -292,10 +485,12 @@ import RNCKakaoCore
292
485
  "profileImageUrl": user.kakaoAccount?.profile?.profileImageUrl?.absoluteString as Any,
293
486
  "thumbnailImageUrl": user.kakaoAccount?.profile?.thumbnailImageUrl?
294
487
  .absoluteString as Any,
488
+ "isDefaultImage": user.kakaoAccount?.profile?.isDefaultImage as Any,
295
489
  "phoneNumber": user.kakaoAccount?.phoneNumber as Any,
296
490
  "ageRange": user.kakaoAccount?.ageRange?.rawValue as Any,
297
491
  "birthday": user.kakaoAccount?.birthday as Any,
298
- "birthdayType": user.kakaoAccount?.birthdayType as Any,
492
+ "birthdayType": user.kakaoAccount?.birthdayType?.rawValue as Any,
493
+ "isLeapMonth": user.kakaoAccount?.isLeapMonth as Any,
299
494
  "birthyear": user.kakaoAccount?.birthyear as Any,
300
495
  "gender": user.kakaoAccount?.gender?.rawValue as Any,
301
496
  "isEmailValid": user.kakaoAccount?.isEmailValid as Any,
@@ -313,7 +508,12 @@ import RNCKakaoCore
313
508
  "profileImageNeedsAgreement": user.kakaoAccount?.profileImageNeedsAgreement as Any,
314
509
  "profileNicknameNeedsAgreement": user.kakaoAccount?
315
510
  .profileNicknameNeedsAgreement as Any,
316
- "legalBirthDateNeedsAgreement": user.kakaoAccount?.legalBirthDateNeedsAgreement as Any
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
317
517
  ])
318
518
  } else {
319
519
  RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "user"))
@@ -343,6 +543,37 @@ import RNCKakaoCore
343
543
  }
344
544
  }
345
545
 
546
+ private func loginPrompts(_ prompts: [String]) -> [Prompt] {
547
+ prompts
548
+ .compactMap { Prompt(rawValue: $0 == "SelectAccount" ? "select_account" : $0.lowercased()) }
549
+ }
550
+
551
+ private func tokenCallback(
552
+ _ resolve: @escaping RCTPromiseResolveBlock,
553
+ reject: @escaping RCTPromiseRejectBlock
554
+ ) -> (OAuthToken?, Error?) -> Void {
555
+ { (token: OAuthToken?, error: Error?) in
556
+ if let error {
557
+ RNCKakaoUtil.reject(reject, error)
558
+ } else if let token {
559
+ let now = Date()
560
+ resolve([
561
+ "accessToken": token.accessToken,
562
+ "refreshToken": token.refreshToken,
563
+ "tokenType": token.tokenType,
564
+ "idToken": token.idToken as Any,
565
+ "accessTokenExpiresAt": token.expiredAt.timeIntervalSince1970,
566
+ "refreshTokenExpiresAt": token.refreshTokenExpiredAt.timeIntervalSince1970,
567
+ "accessTokenExpiresIn": Int(token.expiredAt.timeIntervalSince(now)),
568
+ "refreshTokenExpiresIn": Int(token.refreshTokenExpiredAt.timeIntervalSince(now)),
569
+ "scopes": token.scopes ?? []
570
+ ])
571
+ } else {
572
+ RNCKakaoUtil.reject(reject, RNCKakaoError.responseNotFound(name: "token"))
573
+ }
574
+ }
575
+ }
576
+
346
577
  private func emptyArrayToNil<T>(_ arr: [T]?) -> [T]? {
347
578
  if arr == nil || arr?.isEmpty == true {
348
579
  return nil