@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.
@@ -1,9 +1,11 @@
1
1
  import type { TurboModule } from 'react-native';
2
2
  import { TurboModuleRegistry } from 'react-native';
3
+ import type { UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes';
3
4
 
4
5
  import type {
5
6
  KakaoAccessTokenInfo,
6
7
  KakaoLoginToken,
8
+ KakaoRevokedServiceTerms,
7
9
  KakaoScopeInfo,
8
10
  KakaoServiceTerms,
9
11
  KakaoShippingAddressResult,
@@ -18,15 +20,43 @@ export interface Spec extends TurboModule {
18
20
  useKakaoAccountLogin: boolean,
19
21
  scopes?: string[],
20
22
  nonce?: string,
23
+ loginHint?: string,
24
+ channelPublicIds?: string[],
25
+ androidRequestCode?: number,
21
26
  ): Promise<KakaoLoginToken>;
27
+ loginWithKakao(
28
+ uiMode: string,
29
+ orientation: string,
30
+ launchMethod: string,
31
+ prompts: string[],
32
+ loginHint?: string,
33
+ nonce?: string,
34
+ channelPublicIds?: string[],
35
+ serviceTerms?: string[],
36
+ ): Promise<KakaoLoginToken>;
37
+ issueAccessTokenWithCode(
38
+ code: string,
39
+ codeVerifier?: string,
40
+ redirectUri?: string,
41
+ ): Promise<KakaoLoginToken>;
42
+ refreshToken(token?: UnsafeObject, iosLoggingEnabled?: boolean): Promise<KakaoLoginToken>;
43
+ signup(properties?: UnsafeObject): Promise<void>;
22
44
  logout(): Promise<void>;
23
45
  unlink(): Promise<void>;
24
46
  isLogined(): Promise<boolean>;
47
+ hasToken(): Promise<boolean>;
25
48
  scopes(scopes?: string[]): Promise<KakaoScopeInfo[]>;
26
49
  revokeScopes(scopes: string[]): Promise<void>;
27
- serviceTerms(): Promise<KakaoServiceTerms[]>;
28
- shippingAddresses(): Promise<KakaoShippingAddressResult>;
29
- me(): Promise<KakaoUser>;
50
+ serviceTerms(result?: string, tags?: string[]): Promise<KakaoServiceTerms[]>;
51
+ revokeServiceTerms(tags: string[]): Promise<KakaoRevokedServiceTerms[]>;
52
+ shippingAddresses(
53
+ addressId?: number,
54
+ fromUpdatedAt?: number,
55
+ pageSize?: number,
56
+ ): Promise<KakaoShippingAddressResult>;
57
+ selectShippingAddress(): Promise<number>;
58
+ me(secureResource?: boolean): Promise<KakaoUser>;
59
+ updateProfile(properties: UnsafeObject): Promise<void>;
30
60
  getAccessToken(): Promise<KakaoAccessTokenInfo>;
31
61
  }
32
62
 
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.validateShippingAddressOptions = validateShippingAddressOptions;
7
+ var _core = require("@react-native-kakao/core");
8
+ function validateShippingAddressOptions({
9
+ addressId,
10
+ fromUpdatedAt,
11
+ pageSize
12
+ }) {
13
+ if (addressId != null) {
14
+ (0, _core.kAssert)(Number.isSafeInteger(addressId), '[shippingAddresses] addressId must be a safe integer');
15
+ return;
16
+ }
17
+ (0, _core.kAssert)(fromUpdatedAt == null || Number.isSafeInteger(fromUpdatedAt) && fromUpdatedAt >= 0, '[shippingAddresses] fromUpdatedAt must be a non-negative safe integer in Unix seconds');
18
+ (0, _core.kAssert)(pageSize == null || Number.isInteger(pageSize) && pageSize >= 2 && pageSize <= 2147483647, '[shippingAddresses] pageSize must be an integer between 2 and 2147483647');
19
+ }
20
+ //# sourceMappingURL=validateShippingAddressOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_core","require","validateShippingAddressOptions","addressId","fromUpdatedAt","pageSize","kAssert","Number","isSafeInteger","isInteger"],"sourceRoot":"../../src","sources":["validateShippingAddressOptions.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEO,SAASC,8BAA8BA,CAAC;EAC7CC,SAAS;EACTC,aAAa;EACbC;AAKF,CAAC,EAAE;EACD,IAAIF,SAAS,IAAI,IAAI,EAAE;IACrB,IAAAG,aAAO,EACLC,MAAM,CAACC,aAAa,CAACL,SAAS,CAAC,EAC/B,sDACF,CAAC;IAED;EACF;EAEA,IAAAG,aAAO,EACLF,aAAa,IAAI,IAAI,IAAKG,MAAM,CAACC,aAAa,CAACJ,aAAa,CAAC,IAAIA,aAAa,IAAI,CAAE,EACpF,uFACF,CAAC;EAED,IAAAE,aAAO,EACLD,QAAQ,IAAI,IAAI,IAAKE,MAAM,CAACE,SAAS,CAACJ,QAAQ,CAAC,IAAIA,QAAQ,IAAI,CAAC,IAAIA,QAAQ,IAAI,UAAW,EAC3F,0EACF,CAAC;AACH","ignoreList":[]}
@@ -3,16 +3,53 @@
3
3
  import { is } from '@mj-studio/js-util';
4
4
  import { kAssert } from '@react-native-kakao/core';
5
5
  import Native from './spec/NativeKakaoUser';
6
+ import { validateShippingAddressOptions } from './validateShippingAddressOptions';
7
+ const minActivityRequestCode = -2147483648;
8
+ const maxActivityRequestCode = 2147483647;
6
9
  export function login({
7
10
  serviceTerms,
8
11
  prompts,
9
12
  useKakaoAccountLogin,
10
13
  scopes,
11
- nonce
14
+ nonce,
15
+ loginHint,
16
+ channelPublicIds,
17
+ android
12
18
  } = {}) {
19
+ const requestCode = android?.requestCode;
20
+ kAssert(requestCode == null || Number.isInteger(requestCode) && requestCode >= minActivityRequestCode && requestCode <= maxActivityRequestCode, `[login] android.requestCode must be an integer from ${minActivityRequestCode} to ${maxActivityRequestCode}`);
13
21
  kAssert(!useKakaoAccountLogin ? !is.notEmptyArray(prompts) && !is.notEmptyArray(scopes) : true, '[login] `prompts` and `scopes` cannot be passed if useKakaoAccountLogin is false.');
14
- kAssert(is.notEmptyArray(scopes) ? !is.notEmptyArray(prompts) && !is.notEmptyArray(serviceTerms) : true, '[login] `scopes` cannot be passed with `prompts` or `serviceTerms`');
15
- return Native.login(serviceTerms ?? [], prompts ?? [], useKakaoAccountLogin ?? false, scopes ?? [], nonce);
22
+ kAssert(is.notEmptyArray(scopes) ? !is.notEmptyArray(prompts) && !is.notEmptyArray(serviceTerms) && !is.notEmptyArray(channelPublicIds) : true, '[login] `scopes` cannot be passed with `prompts`, `serviceTerms`, or `channelPublicIds`');
23
+ kAssert(loginHint == null || !is.notEmptyArray(scopes) && !is.notEmptyArray(serviceTerms) && !is.notEmptyArray(channelPublicIds), '[login] `loginHint` cannot be passed with `scopes`, `serviceTerms`, or `channelPublicIds` on native platforms.');
24
+ return Native.login(serviceTerms ?? [], prompts ?? [], useKakaoAccountLogin ?? false, scopes ?? [], nonce, loginHint, channelPublicIds ?? [], requestCode);
25
+ }
26
+ export async function signup({
27
+ properties
28
+ } = {}) {
29
+ await Native.signup(properties);
30
+ }
31
+ export function loginWithKakao({
32
+ uiMode = 'auto',
33
+ prompts,
34
+ loginHint,
35
+ nonce,
36
+ channelPublicIds,
37
+ serviceTerms,
38
+ ios
39
+ } = {}) {
40
+ return Native.loginWithKakao(uiMode, ios?.orientation ?? 'auto', ios?.launchMethod ?? 'UniversalLink', prompts ?? [], loginHint, nonce, channelPublicIds ?? [], serviceTerms ?? []);
41
+ }
42
+ export function refreshToken({
43
+ token,
44
+ ios
45
+ } = {}) {
46
+ kAssert(ios?.loggingEnabled == null || typeof ios.loggingEnabled === 'boolean', '[refreshToken] ios.loggingEnabled must be a boolean');
47
+ if (token !== undefined) {
48
+ kAssert(token != null && is.string(token.accessToken) && token.accessToken.length > 0 && is.string(token.refreshToken) && token.refreshToken.length > 0, '[refreshToken] token must contain non-empty accessToken and refreshToken strings');
49
+ 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');
50
+ kAssert((token.tokenType == null || is.string(token.tokenType)) && (token.idToken == null || is.string(token.idToken)) && Array.isArray(token.scopes) && token.scopes.every(scope => is.string(scope)), '[refreshToken] tokenType and idToken must be strings when present, and scopes must be strings');
51
+ }
52
+ return Native.refreshToken(token, ios?.loggingEnabled ?? true);
16
53
  }
17
54
  export function logout() {
18
55
  return Native.logout();
@@ -23,6 +60,7 @@ export function unlink() {
23
60
  export function isLogined() {
24
61
  return Native.isLogined();
25
62
  }
63
+ export const hasToken = Native.hasToken;
26
64
  export function isKakaoTalkLoginAvailable() {
27
65
  return Native.isKakaoTalkLoginAvailable();
28
66
  }
@@ -32,18 +70,51 @@ export function scopes(scopes) {
32
70
  export function revokeScopes(scopes) {
33
71
  return Native.revokeScopes(scopes);
34
72
  }
35
- export function serviceTerms() {
36
- return Native.serviceTerms();
73
+ export function serviceTerms({
74
+ result,
75
+ tags
76
+ } = {}) {
77
+ return Native.serviceTerms(result, tags);
78
+ }
79
+ export async function shippingAddresses({
80
+ addressId,
81
+ fromUpdatedAt,
82
+ pageSize
83
+ } = {}) {
84
+ validateShippingAddressOptions({
85
+ addressId,
86
+ fromUpdatedAt,
87
+ pageSize
88
+ });
89
+ return Native.shippingAddresses(addressId, fromUpdatedAt, pageSize);
37
90
  }
38
- export function shippingAddresses() {
39
- return Native.shippingAddresses();
91
+ export function revokeServiceTerms(tags) {
92
+ return Native.revokeServiceTerms(tags);
40
93
  }
41
- export function me() {
42
- return Native.me();
94
+ export function selectShippingAddress() {
95
+ return Native.selectShippingAddress();
96
+ }
97
+ export function me({
98
+ secureResource = true
99
+ } = {}) {
100
+ return Native.me(secureResource);
101
+ }
102
+ export async function issueAccessTokenWithCode({
103
+ code,
104
+ codeVerifier,
105
+ redirectUri
106
+ }) {
107
+ kAssert(is.string(code) && code.length > 0, '[issueAccessTokenWithCode] code is required');
108
+ return Native.issueAccessTokenWithCode(code, codeVerifier, redirectUri);
43
109
  }
44
110
  export function getAccessToken() {
45
111
  return Native.getAccessToken();
46
112
  }
113
+ export function updateProfile({
114
+ properties
115
+ }) {
116
+ return Native.updateProfile(properties);
117
+ }
47
118
 
48
119
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
120
  export function setAccessTokenWeb(token) {}
@@ -53,15 +124,23 @@ export async function issueAccessTokenWithCodeWeb(params) {
53
124
  }
54
125
  const KakaoUser = {
55
126
  login,
127
+ loginWithKakao,
128
+ refreshToken,
129
+ issueAccessTokenWithCode,
130
+ signup,
56
131
  logout,
57
132
  unlink,
58
133
  isLogined,
134
+ hasToken,
59
135
  isKakaoTalkLoginAvailable,
60
136
  scopes,
61
137
  revokeScopes,
62
138
  serviceTerms,
139
+ revokeServiceTerms,
63
140
  shippingAddresses,
141
+ selectShippingAddress,
64
142
  me,
143
+ updateProfile,
65
144
  getAccessToken,
66
145
  setAccessTokenWeb,
67
146
  issueAccessTokenWithCodeWeb
@@ -1 +1 @@
1
- {"version":3,"names":["is","kAssert","Native","login","serviceTerms","prompts","useKakaoAccountLogin","scopes","nonce","notEmptyArray","logout","unlink","isLogined","isKakaoTalkLoginAvailable","revokeScopes","shippingAddresses","me","getAccessToken","setAccessTokenWeb","token","issueAccessTokenWithCodeWeb","params","KakaoUser"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,EAAE,QAAQ,oBAAoB;AACvC,SAASC,OAAO,QAAQ,0BAA0B;AAElD,OAAOC,MAAM,MAAM,wBAAwB;AAyF3C,OAAO,SAASC,KAAKA,CAAC;EACpBC,YAAY;EACZC,OAAO;EACPC,oBAAoB;EACpBC,MAAM;EACNC;AAiBF,CAAC,GAAG,CAAC,CAAC,EAA4B;EAChCP,OAAO,CACL,CAACK,oBAAoB,GAAG,CAACN,EAAE,CAACS,aAAa,CAACJ,OAAO,CAAC,IAAI,CAACL,EAAE,CAACS,aAAa,CAACF,MAAM,CAAC,GAAG,IAAI,EACtF,mFACF,CAAC;EAEDN,OAAO,CACLD,EAAE,CAACS,aAAa,CAACF,MAAM,CAAC,GAAG,CAACP,EAAE,CAACS,aAAa,CAACJ,OAAO,CAAC,IAAI,CAACL,EAAE,CAACS,aAAa,CAACL,YAAY,CAAC,GAAG,IAAI,EAC/F,oEACF,CAAC;EAED,OAAOF,MAAM,CAACC,KAAK,CACjBC,YAAY,IAAI,EAAE,EAClBC,OAAO,IAAI,EAAE,EACbC,oBAAoB,IAAI,KAAK,EAC7BC,MAAM,IAAI,EAAE,EACZC,KACF,CAAC;AACH;AAEA,OAAO,SAASE,MAAMA,CAAA,EAAG;EACvB,OAAOR,MAAM,CAACQ,MAAM,CAAC,CAAC;AACxB;AAEA,OAAO,SAASC,MAAMA,CAAA,EAAG;EACvB,OAAOT,MAAM,CAACS,MAAM,CAAC,CAAC;AACxB;AAEA,OAAO,SAASC,SAASA,CAAA,EAAG;EAC1B,OAAOV,MAAM,CAACU,SAAS,CAAC,CAAC;AAC3B;AAEA,OAAO,SAASC,yBAAyBA,CAAA,EAAqB;EAC5D,OAAOX,MAAM,CAACW,yBAAyB,CAAC,CAAC;AAC3C;AAEA,OAAO,SAASN,MAAMA,CAACA,MAAiB,EAA6B;EACnE,OAAOL,MAAM,CAACK,MAAM,CAACA,MAAM,CAAC;AAC9B;AAEA,OAAO,SAASO,YAAYA,CAACP,MAAgB,EAAiB;EAC5D,OAAOL,MAAM,CAACY,YAAY,CAACP,MAAM,CAAC;AACpC;AAEA,OAAO,SAASH,YAAYA,CAAA,EAAiC;EAC3D,OAAOF,MAAM,CAACE,YAAY,CAAC,CAAC;AAC9B;AAEA,OAAO,SAASW,iBAAiBA,CAAA,EAAwC;EACvE,OAAOb,MAAM,CAACa,iBAAiB,CAAC,CAAC;AACnC;AAEA,OAAO,SAASC,EAAEA,CAAA,EAAuB;EACvC,OAAOd,MAAM,CAACc,EAAE,CAAC,CAAC;AACpB;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAkC;EAC9D,OAAOf,MAAM,CAACe,cAAc,CAAC,CAAC;AAChC;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAACC,KAAa,EAAE,CAAC;AAClD;AACA,OAAO,eAAeC,2BAA2BA,CAACC,MAIjD,EAQE;EACD,OAAO,CAAC,CAAC;AACX;AAEA,MAAMC,SAAS,GAAG;EAChBnB,KAAK;EACLO,MAAM;EACNC,MAAM;EACNC,SAAS;EACTC,yBAAyB;EACzBN,MAAM;EACNO,YAAY;EACZV,YAAY;EACZW,iBAAiB;EACjBC,EAAE;EACFC,cAAc;EACdC,iBAAiB;EACjBE;AACF,CAAC;AACD,eAAeE,SAAS","ignoreList":[]}
1
+ {"version":3,"names":["is","kAssert","Native","validateShippingAddressOptions","minActivityRequestCode","maxActivityRequestCode","login","serviceTerms","prompts","useKakaoAccountLogin","scopes","nonce","loginHint","channelPublicIds","android","requestCode","Number","isInteger","notEmptyArray","signup","properties","loginWithKakao","uiMode","ios","orientation","launchMethod","refreshToken","token","loggingEnabled","undefined","string","accessToken","length","accessTokenExpiresAt","refreshTokenExpiresAt","every","value","isFinite","isNaN","Date","getTime","accessTokenExpiresIn","refreshTokenExpiresIn","tokenType","idToken","Array","isArray","scope","logout","unlink","isLogined","hasToken","isKakaoTalkLoginAvailable","revokeScopes","result","tags","shippingAddresses","addressId","fromUpdatedAt","pageSize","revokeServiceTerms","selectShippingAddress","me","secureResource","issueAccessTokenWithCode","code","codeVerifier","redirectUri","getAccessToken","updateProfile","setAccessTokenWeb","issueAccessTokenWithCodeWeb","params","KakaoUser"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  import { camelCaseObject, filterNonNullishKeys, is } from '@mj-studio/js-util';
4
- import { kFetch, kFetchFormUrlEncoded, kGlobalStorage, kRunWebAPI } from '@react-native-kakao/core';
5
- import * as querystring from 'querystring';
4
+ import { kAssert, kCreateWebError, kFetch, kFetchFormUrlEncoded, kGlobalStorage, kRunWebAPI } from '@react-native-kakao/core';
5
+ import { validateShippingAddressOptions } from './validateShippingAddressOptions';
6
6
  function isoToUnix(value) {
7
7
  if (!is.string(value)) {
8
8
  return value;
@@ -10,25 +10,76 @@ function isoToUnix(value) {
10
10
  return Date.parse(value) / 1000;
11
11
  }
12
12
  const KakaoUser = {
13
+ loginWithKakao: () => kRunWebAPI(() => {
14
+ throw {
15
+ code: 'Package-UnsupportedPlatform',
16
+ message: 'loginWithKakao is supported on Android and iOS. Use login with web.redirectUri on web.'
17
+ };
18
+ }),
19
+ refreshToken: () => kRunWebAPI(() => {
20
+ throw {
21
+ code: 'Package-UnsupportedPlatform',
22
+ message: 'The Kakao JavaScript SDK does not support refreshToken.'
23
+ };
24
+ }),
25
+ hasToken: () => kRunWebAPI(() => Kakao.Auth.getAccessToken() != null),
13
26
  getAccessToken: () => kRunWebAPI(async () => {
14
27
  const {
15
28
  id,
16
29
  expires_in,
17
30
  app_id
18
- } = (await kFetch('https://kapi.kakao.com/v1/user/access_token_info', {
19
- headers: {
20
- ...kGlobalStorage.headers
21
- }
22
- })).body;
31
+ } = await Kakao.API.request({
32
+ url: '/v1/user/access_token_info'
33
+ });
23
34
  return {
24
35
  id,
25
36
  expiresIn: expires_in,
26
37
  appId: app_id
27
38
  };
28
39
  }),
40
+ issueAccessTokenWithCode: ({
41
+ code,
42
+ codeVerifier,
43
+ redirectUri,
44
+ web
45
+ }) => kRunWebAPI(async () => {
46
+ kAssert(is.string(code) && code.length > 0 && is.string(redirectUri) && redirectUri.length > 0, '[issueAccessTokenWithCode] code and redirectUri are required on web');
47
+ if (typeof Kakao === 'undefined' || !Kakao.isInitialized()) {
48
+ kCreateWebError({
49
+ code: 'Package-SDKNotInitialized',
50
+ message: 'Initialize the Kakao SDK before exchanging an authorization code.'
51
+ });
52
+ }
53
+ const token = await KakaoUser.issueAccessTokenWithCodeWeb({
54
+ code,
55
+ codeVerifier,
56
+ redirectUri: redirectUri,
57
+ clientSecret: web?.clientSecret
58
+ });
59
+ if (!is.string(token.accessToken) || !token.accessToken || !is.string(token.refreshToken) || !token.refreshToken || !is.string(token.tokenType) || token.idToken != null && !is.string(token.idToken) || !Number.isFinite(token.expiresIn) || token.expiresIn < 0 || !Number.isFinite(token.refreshTokenExpiresIn) || token.refreshTokenExpiresIn < 0 || token.scope != null && !is.string(token.scope)) {
60
+ kCreateWebError({
61
+ code: 'Package-APIResponseNotFound',
62
+ message: 'issueAccessTokenWithCode returned invalid token data.'
63
+ });
64
+ }
65
+ const issuedAt = Math.floor(Date.now() / 1000);
66
+ KakaoUser.setAccessTokenWeb(token.accessToken);
67
+ return {
68
+ accessToken: token.accessToken,
69
+ refreshToken: token.refreshToken,
70
+ tokenType: token.tokenType,
71
+ idToken: token.idToken,
72
+ accessTokenExpiresIn: token.expiresIn,
73
+ refreshTokenExpiresIn: token.refreshTokenExpiresIn,
74
+ accessTokenExpiresAt: issuedAt + token.expiresIn,
75
+ refreshTokenExpiresAt: issuedAt + token.refreshTokenExpiresIn,
76
+ scopes: token.scope?.split(' ').filter(Boolean) ?? []
77
+ };
78
+ }),
29
79
  issueAccessTokenWithCodeWeb: ({
30
80
  clientSecret,
31
81
  code,
82
+ codeVerifier,
32
83
  redirectUri
33
84
  }) => kRunWebAPI(async () => {
34
85
  const res = await kFetchFormUrlEncoded('https://kauth.kakao.com/oauth/token', {
@@ -36,19 +87,17 @@ const KakaoUser = {
36
87
  body: filterNonNullishKeys({
37
88
  grant_type: 'authorization_code',
38
89
  client_id: kGlobalStorage.restApiKey,
39
- redirect_uri: encodeURIComponent(redirectUri),
90
+ redirect_uri: redirectUri,
40
91
  code,
92
+ code_verifier: codeVerifier,
41
93
  client_secret: clientSecret
42
94
  })
43
95
  }).then(r => r.body);
44
96
  return camelCaseObject(res);
45
97
  }),
46
98
  setAccessTokenWeb: token => {
99
+ Kakao.Auth.setAccessToken(token);
47
100
  kGlobalStorage.accessToken = token;
48
- return new Promise(r => {
49
- Kakao.Auth.setAccessToken(token);
50
- r(42);
51
- });
52
101
  },
53
102
  login: params => kRunWebAPI(() => {
54
103
  const {
@@ -61,18 +110,36 @@ const KakaoUser = {
61
110
  throughTalk,
62
111
  serviceTerms
63
112
  } = params?.web ?? {};
113
+ const channelPublicIds = params?.channelPublicIds;
64
114
  return Kakao.Auth.authorize(filterNonNullishKeys({
65
- loginHint,
115
+ loginHint: params?.loginHint ?? loginHint,
116
+ channelPublicId: channelPublicIds?.length ? channelPublicIds.join(',') : undefined,
66
117
  nonce: params?.nonce ?? nonce,
67
- prompt: prompt?.join(','),
118
+ prompt: (prompt ?? params?.prompts?.map(value => value === 'SelectAccount' ? 'select_account' : value.toLowerCase()))?.join(','),
68
119
  redirectUri,
69
- scope: scope?.join(','),
70
- serviceTerms: serviceTerms?.join(','),
120
+ scope: (scope ?? params?.scopes)?.join(','),
121
+ serviceTerms: (serviceTerms ?? params?.serviceTerms)?.join(','),
71
122
  state,
72
- throughTalk
123
+ throughTalk: throughTalk ?? (params?.useKakaoAccountLogin ? false : undefined)
73
124
  }));
74
125
  }),
75
- logout: () => kRunWebAPI(() => Kakao.Auth.logout()),
126
+ signup: ({
127
+ properties
128
+ } = {}) => kRunWebAPI(async () => {
129
+ await Kakao.API.request({
130
+ url: '/v1/user/signup',
131
+ data: filterNonNullishKeys({
132
+ properties
133
+ })
134
+ });
135
+ }),
136
+ logout: () => kRunWebAPI(async () => {
137
+ try {
138
+ await Kakao.Auth.logout();
139
+ } finally {
140
+ kGlobalStorage.clearAccessToken();
141
+ }
142
+ }),
76
143
  isLogined: async () => {
77
144
  try {
78
145
  const {
@@ -84,68 +151,195 @@ const KakaoUser = {
84
151
  }
85
152
  },
86
153
  isKakaoTalkLoginAvailable: async () => false,
87
- unlink: () => kRunWebAPI(() => Kakao.API.request({
88
- url: '/v1/user/unlink'
89
- })),
154
+ unlink: () => kRunWebAPI(async () => {
155
+ await Kakao.API.request({
156
+ url: '/v1/user/unlink'
157
+ });
158
+ Kakao.Auth.setAccessToken(null);
159
+ kGlobalStorage.clearAccessToken();
160
+ }),
90
161
  scopes: scopes => kRunWebAPI(async () => {
91
162
  const response = await Kakao.API.request({
92
- url: `/v2/user/scopes${scopes ? '?' + querystring.stringify({
163
+ url: '/v2/user/scopes',
164
+ data: scopes?.length ? {
93
165
  scopes
94
- }) : ''}`
166
+ } : undefined
95
167
  });
96
168
  return camelCaseObject(response.scopes);
97
169
  }),
98
- revokeScopes: scopes => kRunWebAPI(() => Kakao.API.request({
99
- url: '/v2/user/revoke/scopes',
100
- data: {
101
- scopes
170
+ revokeScopes: scopes => kRunWebAPI(async () => {
171
+ await Kakao.API.request({
172
+ url: '/v2/user/revoke/scopes',
173
+ data: {
174
+ scopes
175
+ }
176
+ });
177
+ }),
178
+ serviceTerms: ({
179
+ result,
180
+ tags
181
+ } = {}) => kRunWebAPI(async () => {
182
+ const response = await Kakao.API.request({
183
+ url: '/v2/user/service_terms',
184
+ data: filterNonNullishKeys({
185
+ result,
186
+ tags: tags?.join(',')
187
+ })
188
+ });
189
+ return (response.service_terms ?? []).map(term => ({
190
+ tag: term.tag,
191
+ agreedAt: term.agreed_at ? isoToUnix(term.agreed_at) : undefined,
192
+ agreed: term.agreed,
193
+ required: term.required,
194
+ revocable: term.revocable
195
+ }));
196
+ }),
197
+ revokeServiceTerms: tags => kRunWebAPI(async () => {
198
+ const response = await Kakao.API.request({
199
+ url: '/v2/user/revoke/service_terms',
200
+ data: {
201
+ tags: tags.join(',')
202
+ }
203
+ });
204
+ return response.revoked_service_terms ?? [];
205
+ }),
206
+ shippingAddresses: ({
207
+ addressId,
208
+ fromUpdatedAt,
209
+ pageSize
210
+ } = {}) => kRunWebAPI(async () => {
211
+ validateShippingAddressOptions({
212
+ addressId,
213
+ fromUpdatedAt,
214
+ pageSize
215
+ });
216
+ const query = new URLSearchParams(Object.entries(filterNonNullishKeys(addressId != null ? {
217
+ address_id: addressId
218
+ } : {
219
+ from_updated_at: fromUpdatedAt,
220
+ page_size: pageSize
221
+ })).map(([key, value]) => [key, String(value)]));
222
+ const {
223
+ body
224
+ } = await kFetch(`https://kapi.kakao.com/v1/user/shipping_address?${query}`, {
225
+ headers: {
226
+ Authorization: `Bearer ${Kakao.Auth.getAccessToken() ?? ''}`
227
+ }
228
+ });
229
+ const response = camelCaseObject(body);
230
+ return {
231
+ userId: response.userId,
232
+ needsAgreement: response.shippingAddressesNeedsAgreement,
233
+ shippingAddresses: (response.shippingAddresses ?? []).map(address => ({
234
+ ...address,
235
+ updatedAt: isoToUnix(address.updatedAt)
236
+ }))
237
+ };
238
+ }),
239
+ selectShippingAddress: () => kRunWebAPI(async () => {
240
+ try {
241
+ const {
242
+ address_id
243
+ } = await Kakao.Auth.selectShippingAddress();
244
+ return address_id;
245
+ } catch (error) {
246
+ if (error != null && typeof error === 'object' && 'error_code' in error) {
247
+ throw {
248
+ code: String(error.error_code),
249
+ message: 'error_msg' in error ? String(error.error_msg) : undefined
250
+ };
251
+ }
252
+ throw error;
102
253
  }
103
- })),
104
- serviceTerms: () => kRunWebAPI(async () => camelCaseObject((await Kakao.API.request({
105
- url: '/v2/user/service_terms'
106
- })).service_terms.map(v => ({
107
- ...v,
108
- agreed_at: v.agreed_at ? isoToUnix(v.agreed_at) : null
109
- })))),
110
- shippingAddresses: () => kRunWebAPI(async () => camelCaseObject(await Kakao.API.request({
111
- url: '/v1/user/shipping_address'
112
- }))),
113
- me: () => kRunWebAPI(async () => {
254
+ }),
255
+ updateProfile: ({
256
+ properties
257
+ }) => kRunWebAPI(async () => {
258
+ await Kakao.API.request({
259
+ url: '/v1/user/update_profile',
260
+ data: {
261
+ properties
262
+ }
263
+ });
264
+ }),
265
+ me: ({
266
+ secureResource = true
267
+ } = {}) => kRunWebAPI(async () => {
114
268
  const ret = camelCaseObject(await Kakao.API.request({
115
- url: '/v2/user/me'
269
+ url: '/v2/user/me',
270
+ data: {
271
+ secure_resource: secureResource
272
+ }
116
273
  }));
117
274
  const kakaoAccount = ret.kakaoAccount ?? {};
118
275
  const properties = ret.properties ?? {};
276
+ const profile = kakaoAccount.profile ?? {};
277
+ const legalGender = kakaoAccount.legalGender;
119
278
  return {
120
- ...ret,
121
- ...properties,
122
- ...kakaoAccount,
279
+ id: ret.id,
280
+ hasSignedUp: ret.hasSignedUp ?? null,
281
+ uuid: ret.forPartner?.uuid ?? null,
282
+ groupUserToken: ret.groupUserToken ?? null,
283
+ isDefaultImage: profile.isDefaultImage ?? null,
284
+ isLeapMonth: kakaoAccount.isLeapMonth ?? null,
285
+ legalName: kakaoAccount.legalName ?? null,
286
+ legalNameNeedsAgreement: kakaoAccount.legalNameNeedsAgreement ?? null,
287
+ legalBirthDate: kakaoAccount.legalBirthDate ?? null,
288
+ legalBirthDateNeedsAgreement: kakaoAccount.legalBirthDateNeedsAgreement,
289
+ legalGender: legalGender === 'female' || legalGender === 'male' ? legalGender : null,
290
+ legalGenderNeedsAgreement: kakaoAccount.legalGenderNeedsAgreement ?? null,
123
291
  email: kakaoAccount.email,
124
- name: null,
125
- nickname: kakaoAccount.profile.nickname,
126
- profileImageUrl: properties.profileImage,
127
- thumbnailImageUrl: properties.thumbnailImage,
128
- phoneNumber: kakaoAccount.profile.phoneNumber,
129
- isEmailValid: ret.isEmailValid,
130
- isEmailVerified: ret.isEmailVerified,
292
+ name: kakaoAccount.name,
293
+ nickname: profile.nickname ?? properties.nickname,
294
+ profileImageUrl: profile.profileImageUrl ?? properties.profileImage,
295
+ thumbnailImageUrl: profile.thumbnailImageUrl ?? properties.thumbnailImage,
296
+ phoneNumber: kakaoAccount.phoneNumber,
297
+ isEmailValid: kakaoAccount.isEmailValid,
298
+ isEmailVerified: kakaoAccount.isEmailVerified,
299
+ ageRange: kakaoAccount.ageRange,
300
+ birthday: kakaoAccount.birthday,
301
+ birthdayType: kakaoAccount.birthdayType,
302
+ birthyear: kakaoAccount.birthyear,
303
+ gender: kakaoAccount.gender,
304
+ isKorean: kakaoAccount.isKorean,
305
+ ageRangeNeedsAgreement: kakaoAccount.ageRangeNeedsAgreement,
306
+ birthdayNeedsAgreement: kakaoAccount.birthdayNeedsAgreement,
307
+ birthyearNeedsAgreement: kakaoAccount.birthyearNeedsAgreement,
308
+ emailNeedsAgreement: kakaoAccount.emailNeedsAgreement,
309
+ genderNeedsAgreement: kakaoAccount.genderNeedsAgreement,
310
+ isKoreanNeedsAgreement: kakaoAccount.isKoreanNeedsAgreement,
311
+ phoneNumberNeedsAgreement: kakaoAccount.phoneNumberNeedsAgreement,
312
+ profileNeedsAgreement: kakaoAccount.profileNeedsAgreement,
313
+ nameNeedsAgreement: kakaoAccount.nameNeedsAgreement,
314
+ profileImageNeedsAgreement: kakaoAccount.profileImageNeedsAgreement,
315
+ profileNicknameNeedsAgreement: kakaoAccount.profileNicknameNeedsAgreement,
131
316
  connectedAt: isoToUnix(ret.connectedAt),
132
317
  synchedAt: isoToUnix(ret.synchedAt)
133
318
  };
134
319
  })
135
320
  };
136
321
  export const {
322
+ loginWithKakao,
323
+ refreshToken,
324
+ issueAccessTokenWithCode,
137
325
  isKakaoTalkLoginAvailable,
138
326
  isLogined,
327
+ hasToken,
139
328
  login,
329
+ signup,
140
330
  logout,
141
331
  me,
332
+ updateProfile,
142
333
  revokeScopes,
143
334
  scopes,
144
335
  serviceTerms,
336
+ revokeServiceTerms,
145
337
  shippingAddresses,
338
+ selectShippingAddress,
146
339
  unlink,
147
340
  setAccessTokenWeb,
148
341
  issueAccessTokenWithCodeWeb,
149
342
  getAccessToken
150
343
  } = KakaoUser;
344
+ export default KakaoUser;
151
345
  //# sourceMappingURL=index.web.js.map