@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.
@@ -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(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 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(me : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) {
82
- [[self manager] me:resolve reject:reject];
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 = { (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
- }
47
+ let callback = tokenCallback(resolve, reject: reject)
63
48
  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
- }
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(42)
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 scopes = scopeInfo?.scopes {
188
- resolve(scopes.map { s in
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 != nil {
216
- resolve(42)
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
- _ resolve: @escaping RCTPromiseResolveBlock,
461
+ _ propertyKeys: [String]?,
462
+ secureResource: NSNumber?,
463
+ resolve: @escaping RCTPromiseResolveBlock,
341
464
  reject: @escaping RCTPromiseRejectBlock
342
465
  ) {
343
466
  onMain {
344
- UserApi.shared.me { user, error in
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
- "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
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
@@ -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 `serviceTerms`');
37
- return _NativeKakaoUser.default.login(serviceTerms ?? [], prompts ?? [], useKakaoAccountLogin ?? false, scopes ?? [], nonce);
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 logout() {
40
- return _NativeKakaoUser.default.logout();
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
- return _NativeKakaoUser.default.unlink();
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
- return _NativeKakaoUser.default.me();
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
- return {};
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