@arcblock/did-connect-react 3.2.19 → 3.3.0

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.
Files changed (52) hide show
  1. package/docs/assets/diagram/core-components-session-provider-01.ja.jpg +0 -0
  2. package/docs/assets/diagram/core-components-session-provider-01.jpg +0 -0
  3. package/docs/assets/diagram/core-components-session-provider-01.zh-TW.jpg +0 -0
  4. package/docs/assets/diagram/core-components-session-provider-01.zh.jpg +0 -0
  5. package/docs/assets/diagram/did-connect-diagram-0.ja.jpg +0 -0
  6. package/docs/assets/diagram/did-connect-diagram-0.jpg +0 -0
  7. package/docs/assets/diagram/did-connect-diagram-0.zh-TW.jpg +0 -0
  8. package/docs/assets/diagram/did-connect-diagram-0.zh.jpg +0 -0
  9. package/docs/assets/diagram/overview-01.ja.jpg +0 -0
  10. package/docs/assets/diagram/overview-01.jpg +0 -0
  11. package/docs/assets/diagram/overview-01.zh-TW.jpg +0 -0
  12. package/docs/assets/diagram/overview-01.zh.jpg +0 -0
  13. package/docs/assets/diagram/use-connect-diagram-0.ja.jpg +0 -0
  14. package/docs/assets/diagram/use-connect-diagram-0.jpg +0 -0
  15. package/docs/assets/diagram/use-connect-diagram-0.zh-TW.jpg +0 -0
  16. package/docs/assets/diagram/use-connect-diagram-0.zh.jpg +0 -0
  17. package/docs/core-components-did-connect.ja.md +3 -50
  18. package/docs/core-components-did-connect.md +5 -52
  19. package/docs/core-components-did-connect.zh-TW.md +3 -50
  20. package/docs/core-components-did-connect.zh.md +3 -50
  21. package/docs/core-components-session-provider.ja.md +3 -45
  22. package/docs/core-components-session-provider.md +3 -45
  23. package/docs/core-components-session-provider.zh-TW.md +3 -45
  24. package/docs/core-components-session-provider.zh.md +3 -45
  25. package/docs/hooks-use-connect.ja.md +3 -39
  26. package/docs/hooks-use-connect.md +4 -40
  27. package/docs/hooks-use-connect.zh-TW.md +3 -39
  28. package/docs/hooks-use-connect.zh.md +3 -39
  29. package/docs/overview.ja.md +3 -45
  30. package/docs/overview.md +3 -45
  31. package/docs/overview.zh-TW.md +3 -45
  32. package/docs/overview.zh.md +3 -45
  33. package/lib/Connect/assets/locale.js +4 -2
  34. package/lib/Connect/components/login-item/connect-choose-list.js +2 -2
  35. package/lib/Connect/components/login-item/connect-provider-list.js +299 -0
  36. package/lib/Connect/components/login-item/login-method-item.js +42 -41
  37. package/lib/Connect/hooks/provider-list.js +50 -0
  38. package/lib/Connect/index.js +180 -196
  39. package/lib/OAuth/context.js +33 -32
  40. package/lib/Session/hooks/use-verify.js +1 -1
  41. package/lib/Session/libs/locales.js +3 -3
  42. package/lib/package.json.js +1 -1
  43. package/package.json +9 -9
  44. package/src/Connect/assets/locale.js +2 -0
  45. package/src/Connect/components/login-item/connect-choose-list.jsx +5 -5
  46. package/src/Connect/components/login-item/connect-provider-list.jsx +392 -0
  47. package/src/Connect/components/login-item/login-method-item.jsx +31 -28
  48. package/src/Connect/hooks/provider-list.js +127 -0
  49. package/src/Connect/index.jsx +8 -27
  50. package/src/OAuth/context.jsx +10 -2
  51. package/src/Session/hooks/use-verify.jsx +1 -1
  52. package/src/Session/libs/locales.js +3 -3
@@ -9,13 +9,13 @@ import B from "lodash/omit";
9
9
  import { joinURL as re } from "ufo";
10
10
  import { translate as ne } from "@arcblock/ux/lib/Locale/util";
11
11
  import ie from "@arcblock/ux/lib/Dialog/use-confirm";
12
- import { getBlockletData as S, getFederatedEnabled as C, getMaster as R } from "@arcblock/ux/lib/Util/federated";
12
+ import { getBlockletData as S, getFederatedEnabled as C, getMaster as k } from "@arcblock/ux/lib/Util/federated";
13
13
  import { BLOCKLET_SERVICE_PATH_PREFIX as F, LOGIN_PROVIDER_NAME as f } from "@arcblock/ux/lib/Util/constant";
14
14
  import { createAxios as se, openPopup as ae, runPopup as de, sleep as ce, getApiErrorMessage as m } from "../utils.js";
15
15
  import { parseResponse as ue, PassportSwitcher as le } from "../components/PassportSwitcher.js";
16
16
  import pe from "../Session/hooks/use-mobile.js";
17
17
  import he from "./bind-conflict-alert.js";
18
- const D = Z({}), { Provider: fe, Consumer: Te } = D, k = `${F}/api/oauth`, be = {
18
+ const D = Z({}), { Provider: fe, Consumer: Te } = D, R = `${F}/api/oauth`, be = {
19
19
  zh: {
20
20
  bindOAuth: "绑定第三方登录",
21
21
  bind: "绑定",
@@ -57,7 +57,7 @@ function Ae({
57
57
  onSwitchPassport: I = O,
58
58
  session: Y = null
59
59
  }) {
60
- const x = pe(), { confirmApi: M, confirmHolder: N } = ie({
60
+ const x = pe(), { confirmApi: M, confirmHolder: j } = ie({
61
61
  maxWidth: !1,
62
62
  PaperProps: {
63
63
  style: {
@@ -88,10 +88,10 @@ function Ae({
88
88
  reset({ status: t = "" } = {}) {
89
89
  b.loading = !!t, b.checking = !1, b.error = "", b.status = t;
90
90
  }
91
- }), i = u((t, e = {}) => ne(be, t, p, "en", e)), j = te(() => se({
91
+ }), d = u((t, e = {}) => ne(be, t, p, "en", e)), N = te(() => se({
92
92
  // NOTICE: 请求必须向当前站点发起
93
- baseURL: k
94
- }), [r.baseUrl, k]), A = oe(j), P = u(async () => {
93
+ baseURL: R
94
+ }), [r.baseUrl, R]), A = oe(N), P = u(async () => {
95
95
  if (r.baseUrl === "/")
96
96
  return window.blocklet;
97
97
  try {
@@ -101,11 +101,12 @@ function Ae({
101
101
  }
102
102
  return await S(r.baseUrl);
103
103
  }), U = u(async ({ sourceAppPid: t } = {}) => {
104
- const e = await P(), o = C(e), n = R(e);
105
- return o && n?.appPid && t === n?.appPid ? (await S(n.appUrl))?.settings?.oauth || {} : e?.settings?.oauth || {};
104
+ const e = await P(), o = C(e), n = k(e);
105
+ let i = {};
106
+ return o && n?.appPid && t === n?.appPid ? i = (await S(n.appUrl))?.settings?.authentication || {} : i = e?.settings?.authentication || {}, Object.keys(i).reduce((a, s) => (i[s]?.type === "oauth" && (a[s] = i[s]), a), {});
106
107
  }), X = u(async ({ sourceAppPid: t } = {}) => {
107
108
  const e = await U({ sourceAppPid: t });
108
- return Object.entries(e).map(([n, a]) => ({ ...a, provider: n })).filter((n) => n.enabled).sort((n, a) => n?.order !== void 0 && a?.order !== void 0 ? n.order - a.order : n?.order !== void 0 ? -1 : 1);
109
+ return Object.entries(e).map(([n, i]) => ({ ...i, provider: n })).filter((n) => n.enabled).sort((n, i) => n?.order !== void 0 && i?.order !== void 0 ? n.order - i.order : n?.order !== void 0 ? -1 : 1);
109
110
  }), L = u(async ({ provider: t } = {}) => {
110
111
  const e = ae(re(r.baseUrl, F, "/oauth/login", t), {
111
112
  name: "oauth-login:popup",
@@ -120,7 +121,7 @@ function Ae({
120
121
  });
121
122
  return o?.response ? o.response?.code : null;
122
123
  } catch (o) {
123
- throw o?.message === "Popup closed" ? new Error(i("cancelAuth")) : o;
124
+ throw o?.message === "Popup closed" ? new Error(d("cancelAuth")) : o;
124
125
  }
125
126
  }), q = async ({ session: t, oauthItem: e } = {}) => {
126
127
  r.bindFnSession = t, r.bindAuthLoading = !0;
@@ -131,24 +132,24 @@ function Ae({
131
132
  provider: e.provider,
132
133
  code: o,
133
134
  sourceAppPid: n
134
- }), l.success(i("bindOAuthSucceed", { provider: f[e.provider] })), T(e);
135
+ }), l.success(d("bindOAuthSucceed", { provider: f[e.provider] })), T(e);
135
136
  } catch (o) {
136
137
  if (o.response?.status === 409) {
137
- const { data: a = {} } = o.response || {}, { code: d } = a || {};
138
- ["ALREADY_EXIST", "ALREADY_BIND"].includes(d) ? M.open({
139
- title: i(d, { provider: e.provider }),
138
+ const { data: i = {} } = o.response || {}, { code: a } = i || {};
139
+ ["ALREADY_EXIST", "ALREADY_BIND"].includes(a) ? M.open({
140
+ title: d(a, { provider: e.provider }),
140
141
  showCancelButton: !1,
141
- confirmButtonText: i("confirm"),
142
- content: /* @__PURE__ */ E(he, { data: a }),
142
+ confirmButtonText: d("confirm"),
143
+ content: /* @__PURE__ */ E(he, { data: i }),
143
144
  onConfirm(s) {
144
145
  s();
145
146
  }
146
147
  }) : l.error(
147
- m(o, i("bindOAuthFailed", { provider: f[e.provider] }))
148
+ m(o, d("bindOAuthFailed", { provider: f[e.provider] }))
148
149
  );
149
150
  } else
150
151
  l.error(
151
- m(o, i("bindOAuthFailed", { provider: f[e.provider] }))
152
+ m(o, d("bindOAuthFailed", { provider: f[e.provider] }))
152
153
  );
153
154
  } finally {
154
155
  r.bindAuthLoading = !1;
@@ -162,7 +163,7 @@ function Ae({
162
163
  connectedAccount: B(e, ["showProvider"]),
163
164
  sourceAppPid: o
164
165
  }), l.success(
165
- i("unbindOAuthSucceed", {
166
+ d("unbindOAuthSucceed", {
166
167
  provider: f[e.showProvider || e.provider]
167
168
  })
168
169
  ), _(e);
@@ -170,7 +171,7 @@ function Ae({
170
171
  l.error(
171
172
  m(
172
173
  o,
173
- i("unbindOAuthFailed", {
174
+ d("unbindOAuthFailed", {
174
175
  provider: f[e.showProvider || e.provider]
175
176
  })
176
177
  )
@@ -181,9 +182,9 @@ function Ae({
181
182
  }, z = async (t = {}) => {
182
183
  try {
183
184
  const { data: e } = await A.current.get("/passports");
184
- e.length > 0 ? (c.open = !0, c.currentUser = t, c.passports = e || []) : l.error(i("noPassports"));
185
+ e.length > 0 ? (c.open = !0, c.currentUser = t, c.passports = e || []) : l.error(d("noPassports"));
185
186
  } catch (e) {
186
- l.error(e.message || i("getPassportFailed"));
187
+ l.error(e.message || d("getPassportFailed"));
187
188
  }
188
189
  }, H = u((...t) => {
189
190
  c.reset(), I(...t);
@@ -194,28 +195,28 @@ function Ae({
194
195
  if (o?.sourceAppPid === window.blocklet?.appPid)
195
196
  r.baseUrl = window.blocklet?.appUrl || "/";
196
197
  else if (o?.sourceAppPid) {
197
- const d = await P(), s = C(d), g = R(d);
198
+ const a = await P(), s = C(a), g = k(a);
198
199
  s && g?.appPid && o?.sourceAppPid === g?.appPid && (r.baseUrl = g.appUrl);
199
200
  }
200
- const a = window?.blocklet?.componentId;
201
+ const i = window?.blocklet?.componentId;
201
202
  try {
202
- const d = await L({ provider: t });
203
- if (r.baseUrl = n, await ce(100), d) {
203
+ const a = await L({ provider: t });
204
+ if (r.baseUrl = n, await ce(100), a) {
204
205
  const s = {
205
206
  ...o,
206
207
  action: e,
207
208
  locale: p,
208
- code: d,
209
+ code: a,
209
210
  provider: t,
210
- componentId: a
211
+ componentId: i
211
212
  };
212
213
  Q(s.inviter) && window.localStorage.getItem("inviter") && (s.inviter = window.localStorage.getItem("inviter"));
213
214
  const g = ["connect-to-did-space", "connect-to-did-domain"].includes(s.action) ? "login" : s.action, { data: $ } = await A.current.post("/login", { ...s, action: g }), y = ue($);
214
215
  return y.provider = t, y;
215
216
  }
216
217
  return r.baseUrl = n, null;
217
- } catch (d) {
218
- const s = m(d, i("loginOAuthFailed", { provider: f[t] }));
218
+ } catch (a) {
219
+ const s = m(a, d("loginOAuthFailed", { provider: f[t] }));
219
220
  throw r.baseUrl = n, new Error(s);
220
221
  }
221
222
  }), K = u(() => {
@@ -237,11 +238,11 @@ function Ae({
237
238
  oauthState: b,
238
239
  unbindAuthLoading: r.unbindAuthLoading,
239
240
  bindAuthLoading: r.bindAuthLoading,
240
- t: i
241
+ t: d
241
242
  },
242
243
  children: [
243
244
  w,
244
- N,
245
+ j,
245
246
  /* @__PURE__ */ E(
246
247
  le,
247
248
  {
@@ -1,5 +1,5 @@
1
1
  import { translate as I } from "@arcblock/ux/lib/Locale/util";
2
- import { LOGIN_PROVIDER as n } from "@blocklet/constant";
2
+ import { LOGIN_PROVIDER as n } from "@arcblock/ux/lib/Util/constant";
3
3
  import { toBase64 as A } from "@ocap/util";
4
4
  import { translations as C } from "../libs/locales.js";
5
5
  function k({ state: p, locale: a, connectApi: c }) {
@@ -1,10 +1,10 @@
1
1
  const e = {
2
2
  login: {
3
3
  en: {
4
- title: "Connect",
5
- scan: "Please use the following methods to complete the connection",
4
+ title: "Login",
5
+ scan: "Login with one of the following methods",
6
6
  confirm: "Confirm connection in your DID Wallet",
7
- success: "Successfully connected"
7
+ success: "Successfully logged in"
8
8
  },
9
9
  zh: {
10
10
  title: "登录",
@@ -1,4 +1,4 @@
1
- const o = "3.2.19", s = {
1
+ const o = "3.3.0", s = {
2
2
  version: o
3
3
  };
4
4
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcblock/did-connect-react",
3
- "version": "3.2.19",
3
+ "version": "3.3.0",
4
4
  "description": "Client side library to work with DID Connect by ArcBlock.",
5
5
  "keywords": [
6
6
  "react",
@@ -32,17 +32,17 @@
32
32
  "url": "https://github.com/ArcBlock/ux/issues"
33
33
  },
34
34
  "dependencies": {
35
- "@arcblock/bridge": "3.2.19",
36
- "@arcblock/did": "^1.27.15",
37
- "@arcblock/icons": "3.2.19",
38
- "@arcblock/react-hooks": "3.2.19",
39
- "@arcblock/ws": "^1.27.15",
40
- "@blocklet/constant": "^1.17.5",
35
+ "@arcblock/bridge": "3.3.0",
36
+ "@arcblock/did": "^1.27.16",
37
+ "@arcblock/icons": "3.3.0",
38
+ "@arcblock/react-hooks": "3.3.0",
39
+ "@arcblock/ws": "^1.27.16",
40
+ "@blocklet/constant": "^1.17.6",
41
41
  "@fontsource/lexend": "^5.2.9",
42
42
  "@iconify-icons/logos": "^1.2.36",
43
43
  "@iconify-icons/material-symbols": "^1.2.58",
44
44
  "@iconify/react": "^5.2.1",
45
- "@ocap/util": "^1.27.15",
45
+ "@ocap/util": "^1.27.16",
46
46
  "@simplewebauthn/browser": "^13.1.0",
47
47
  "ahooks": "^3.8.5",
48
48
  "axios": "^1.10.0",
@@ -81,5 +81,5 @@
81
81
  "eslint-plugin-react-hooks": "^4.6.2",
82
82
  "jest": "^29.7.0"
83
83
  },
84
- "gitHead": "8439c6a0c022c3fab219191ff035d737c422f3ff"
84
+ "gitHead": "d23472b198c0bf05d452976ebefedab5cb6d047f"
85
85
  }
@@ -70,6 +70,7 @@ export default {
70
70
  'Sign in with Passkey - More secure and convenient authentication. No passwords to remember, easily access apps and websites.',
71
71
  didConnectTitle: 'DID Connect',
72
72
  didConnectDescription: 'Decentralized identities and apps, W3C DID-based, future-ready.',
73
+ noAuthenticationProvider: 'No authentication provider configured',
73
74
  },
74
75
  zh: {
75
76
  generateError: '二维码生成失败',
@@ -141,5 +142,6 @@ export default {
141
142
  '使用 Passkey 账户登录 - 更安全、更便捷的身份验证方式。无需记忆密码,轻松登录各类应用和网站',
142
143
  didConnectTitle: 'DID Connect',
143
144
  didConnectDescription: '面向未来的基于 W3C DID 去中心化身份和应用',
145
+ noAuthenticationProvider: '未配置任何身份验证提供者',
144
146
  },
145
147
  };
@@ -29,7 +29,7 @@ export default function ConnectChooseList({
29
29
  webWalletUrl = getWebWalletUrl(),
30
30
  tokenKey,
31
31
  passkeyBehavior = 'none',
32
- onRest = noop,
32
+ onReset = noop,
33
33
  showMobileLogin = true,
34
34
  showOAuthLogin = true,
35
35
  showPasskeyLogin = true,
@@ -100,7 +100,7 @@ export default function ConnectChooseList({
100
100
 
101
101
  const defaultRetryConnect = useMemoizedFn(async () => {
102
102
  tokenState.reset();
103
- await onRest();
103
+ await onReset();
104
104
  tokenState.status = 'created';
105
105
  connectState.chooseMethod = 'wallet';
106
106
  });
@@ -169,7 +169,7 @@ export default function ConnectChooseList({
169
169
  onClick={async () => {
170
170
  localStorage.setItem(GA_LAST_LOGIN_METHOD, 'wallet');
171
171
  tokenState.reset();
172
- await onRest();
172
+ await onReset();
173
173
  tokenState.status = 'created';
174
174
  connectState.chooseMethod = 'wallet';
175
175
  const connectFn = walletLoginRef.current?.connect;
@@ -193,7 +193,7 @@ export default function ConnectChooseList({
193
193
  connectState.chooseMethod = 'wallet-web';
194
194
  const connectFn = webLoginRef.current.connect;
195
195
  connectState.retryConnect = async () => {
196
- await onRest();
196
+ await onReset();
197
197
  tokenState.error = '';
198
198
  tokenState.status = 'scanned';
199
199
  connectFn();
@@ -294,7 +294,7 @@ ConnectChooseList.propTypes = {
294
294
  webWalletUrl: PropTypes.string,
295
295
  tokenKey: PropTypes.string.isRequired,
296
296
  passkeyBehavior: PropTypes.oneOf(['none', 'both', 'only-existing', 'only-new']),
297
- onRest: PropTypes.func,
297
+ onReset: PropTypes.func,
298
298
  showMobileLogin: PropTypes.bool,
299
299
  showOAuthLogin: PropTypes.bool,
300
300
  showPasskeyLogin: PropTypes.bool,