@arcblock/ux 2.6.3 → 2.6.5

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.
@@ -6,16 +6,25 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _react = require("react");
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
- var _material = require("@mui/material");
10
- var _Account = _interopRequireDefault(require("@arcblock/icons/lib/Account"));
9
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
10
+ var _MenuList = _interopRequireDefault(require("@mui/material/MenuList"));
11
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
12
+ var _SvgIcon = _interopRequireDefault(require("@mui/material/SvgIcon"));
13
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
14
+ var _Chip = _interopRequireDefault(require("@mui/material/Chip"));
15
+ var _Link = _interopRequireDefault(require("@mui/material/Link"));
16
+ var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
17
+ var _PersonOutline = _interopRequireDefault(require("@mui/icons-material/PersonOutline"));
18
+ var _Link2 = _interopRequireDefault(require("@mui/icons-material/Link"));
19
+ var _VpnKeyOutlined = _interopRequireDefault(require("@mui/icons-material/VpnKeyOutlined"));
20
+ var _ConnectWithoutContact = _interopRequireDefault(require("@mui/icons-material/ConnectWithoutContact"));
11
21
  var _ShieldCheck = _interopRequireDefault(require("mdi-material-ui/ShieldCheck"));
22
+ var _Account = _interopRequireDefault(require("@arcblock/icons/lib/Account"));
12
23
  var _OpenIn = _interopRequireDefault(require("@arcblock/icons/lib/OpenIn"));
13
24
  var _Disconnect = _interopRequireDefault(require("@arcblock/icons/lib/Disconnect"));
14
25
  var _Switch = _interopRequireDefault(require("@arcblock/icons/lib/Switch"));
15
- var _PersonOutline = _interopRequireDefault(require("@mui/icons-material/PersonOutline"));
16
- var _Link = _interopRequireDefault(require("@mui/icons-material/Link"));
17
- var _VpnKeyOutlined = _interopRequireDefault(require("@mui/icons-material/VpnKeyOutlined"));
18
26
  var _useBrowser = _interopRequireDefault(require("@arcblock/react-hooks/lib/useBrowser"));
27
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
19
28
  var _Avatar = _interopRequireDefault(require("../Avatar"));
20
29
  var _Address = _interopRequireDefault(require("../Address"));
21
30
  var _Util = require("../Util");
@@ -44,7 +53,8 @@ const translations = {
44
53
  openInWallet: 'Open DID Wallet',
45
54
  alreadyBindOAuth: 'Already bind Auth0',
46
55
  bind: 'Bind ',
47
- thirdParty: 'Third Party Login'
56
+ thirdParty: 'Third Party Login',
57
+ connectedWith: 'Connected with'
48
58
  },
49
59
  zh: {
50
60
  switchDid: '切换账户',
@@ -56,7 +66,8 @@ const translations = {
56
66
  // NOTE: 目前只有 Auth0,展示出具体的第三方名字会更好
57
67
  alreadyBindOAuth: '已绑定 Auth0 账号',
58
68
  bind: '绑定',
59
- thirdParty: '第三方登录'
69
+ thirdParty: '第三方登录',
70
+ connectedWith: '连接至'
60
71
  }
61
72
  };
62
73
  const getConnectedAccounts = user => {
@@ -68,7 +79,7 @@ const getSourceProvider = user => {
68
79
  return (user === null || user === void 0 ? void 0 : user.sourceProvider) || (user === null || user === void 0 ? void 0 : (_user$extraConfigs2 = user.extraConfigs) === null || _user$extraConfigs2 === void 0 ? void 0 : _user$extraConfigs2.sourceProvider) || 'wallet';
69
80
  };
70
81
  function SessionManager(_ref) {
71
- var _session$user, _session$user$avatar, _session$user3, _session$user4, _session$user5;
82
+ var _session$user, _session$user$avatar, _window$blocklet, _window$blocklet$sett, _window$blocklet$sett2, _session$user3, _session$user4, _session$user5;
72
83
  let {
73
84
  session,
74
85
  locale,
@@ -116,6 +127,7 @@ function SessionManager(_ref) {
116
127
  });
117
128
  const isRawWalletAccount = getSourceProvider(session.user) === 'wallet';
118
129
  const connectedAccounts = getConnectedAccounts(session.user);
130
+ const federatedAccount = connectedAccounts.find(item => item.provider === 'federated');
119
131
  let hasBindWallet = false;
120
132
  let hasBindAccount = false;
121
133
  if (isRawWalletAccount) {
@@ -138,9 +150,10 @@ function SessionManager(_ref) {
138
150
  return (session === null || session === void 0 ? void 0 : session.initialized) === false && (session === null || session === void 0 ? void 0 : session.loading) === true;
139
151
  // eslint-disable-next-line react/prop-types
140
152
  }, [session === null || session === void 0 ? void 0 : session.initialized, session === null || session === void 0 ? void 0 : session.loading]);
153
+ const masterSiteInfo = (_window$blocklet = window.blocklet) === null || _window$blocklet === void 0 ? void 0 : (_window$blocklet$sett = _window$blocklet.settings) === null || _window$blocklet$sett === void 0 ? void 0 : (_window$blocklet$sett2 = _window$blocklet$sett.federated) === null || _window$blocklet$sett2 === void 0 ? void 0 : _window$blocklet$sett2.master;
141
154
  if (!session.user) {
142
155
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
143
- children: [showText ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Button, _objectSpread(_objectSpread({
156
+ children: [showText ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, _objectSpread(_objectSpread({
144
157
  ref: userAnchorRef,
145
158
  sx: [{
146
159
  borderRadius: '100vw'
@@ -153,19 +166,19 @@ function SessionManager(_ref) {
153
166
  "aria-label": "login button"
154
167
  }, rest), {}, {
155
168
  "data-cy": "sessionManager-login",
156
- children: [isFirstLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.CircularProgress, {}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Account.default, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
169
+ children: [isFirstLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Account.default, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
157
170
  style: {
158
171
  lineHeight: '25px'
159
172
  },
160
173
  children: translation.connect
161
174
  })]
162
- })) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.IconButton, _objectSpread(_objectSpread({
175
+ })) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, _objectSpread(_objectSpread({
163
176
  ref: userAnchorRef
164
177
  }, rest), {}, {
165
178
  onClick: _onLogin,
166
179
  "data-cy": "sessionManager-login",
167
180
  size: "medium",
168
- children: isFirstLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.CircularProgress, {
181
+ children: isFirstLoading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {
169
182
  style: {
170
183
  width: size - 4,
171
184
  height: size - 4,
@@ -258,7 +271,7 @@ function SessionManager(_ref) {
258
271
  }
259
272
  }
260
273
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
261
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.IconButton, _objectSpread(_objectSpread({
274
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, _objectSpread(_objectSpread({
262
275
  ref: userAnchorRef,
263
276
  onClick: onToggleUser
264
277
  }, rest), {}, {
@@ -279,7 +292,7 @@ function SessionManager(_ref) {
279
292
  onClose: onCloseUser,
280
293
  anchorEl: userAnchorRef.current,
281
294
  dark: dark,
282
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuList, {
295
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuList.default, {
283
296
  sx: {
284
297
  p: 0
285
298
  },
@@ -289,7 +302,7 @@ function SessionManager(_ref) {
289
302
  className: "session-manager-user-name",
290
303
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
291
304
  children: session.user.fullName
292
- }), !!showRole && ((currentRole === null || currentRole === void 0 ? void 0 : currentRole.title) || ((_session$user3 = session.user) === null || _session$user3 === void 0 ? void 0 : _session$user3.role.toUpperCase())) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Chip, {
305
+ }), !!showRole && ((currentRole === null || currentRole === void 0 ? void 0 : currentRole.title) || ((_session$user3 = session.user) === null || _session$user3 === void 0 ? void 0 : _session$user3.role.toUpperCase())) && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip.default, {
293
306
  label: (currentRole === null || currentRole === void 0 ? void 0 : currentRole.title) || ((_session$user4 = session.user) === null || _session$user4 === void 0 ? void 0 : _session$user4.role.toUpperCase()),
294
307
  size: "small",
295
308
  variant: "outlined",
@@ -297,7 +310,7 @@ function SessionManager(_ref) {
297
310
  height: 'auto',
298
311
  marginRight: 0
299
312
  },
300
- icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
313
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
301
314
  component: _ShieldCheck.default,
302
315
  size: "small"
303
316
  })
@@ -310,6 +323,12 @@ function SessionManager(_ref) {
310
323
  responsive: false,
311
324
  children: walletDid
312
325
  })
326
+ }), federatedAccount && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
327
+ className: "session-manager-id-item",
328
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Address.default, {
329
+ responsive: false,
330
+ children: federatedAccount.did
331
+ })
313
332
  }), (session === null || session === void 0 ? void 0 : (_session$user5 = session.user) === null || _session$user5 === void 0 ? void 0 : _session$user5.email) && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
314
333
  className: "session-manager-id-item",
315
334
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Address.default, {
@@ -318,18 +337,31 @@ function SessionManager(_ref) {
318
337
  })
319
338
  })]
320
339
  })]
340
+ }), federatedAccount && !(0, _isEmpty.default)(masterSiteInfo) && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
341
+ className: "session-manager-menu-item",
342
+ "data-cy": "sessionManager-connectWithFederated",
343
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
344
+ component: _ConnectWithoutContact.default,
345
+ className: "session-manager-menu-icon"
346
+ }), translation.connectedWith, /*#__PURE__*/(0, _jsxRuntime.jsx)(_Link.default, {
347
+ ml: 1,
348
+ href: masterSiteInfo.appUrl,
349
+ underline: "hover",
350
+ target: "_blank",
351
+ children: masterSiteInfo.appName
352
+ })]
321
353
  }), Array.isArray(menu) && menu.map((menuItem, index) => {
322
354
  const {
323
355
  svgIcon
324
356
  } = menuItem,
325
357
  menuProps = _objectWithoutProperties(menuItem, _excluded2);
326
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, _objectSpread(_objectSpread({
358
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, _objectSpread(_objectSpread({
327
359
  className: "session-manager-menu-item"
328
360
  }, _objectSpread(_objectSpread({}, menuProps), {}, {
329
361
  icon: undefined,
330
362
  label: undefined
331
363
  })), {}, {
332
- children: [svgIcon ? svgIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
364
+ children: [svgIcon ? svgIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
333
365
  component: svgIcon,
334
366
  className: "session-manager-menu-icon"
335
367
  }) : menuItem.icon, menuItem.label]
@@ -339,54 +371,54 @@ function SessionManager(_ref) {
339
371
  menuItem: 'session-manager-menu-item',
340
372
  menuIcon: 'session-manager-menu-icon'
341
373
  }
342
- }), !browser.wallet && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
374
+ }), !browser.wallet && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
343
375
  component: "a",
344
376
  className: "session-manager-menu-item",
345
377
  "data-cy": "sessionManager-openInWallet",
346
378
  href: "https://www.abtwallet.io/",
347
379
  target: "_blank",
348
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
380
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
349
381
  component: _OpenIn.default,
350
382
  className: "session-manager-menu-icon"
351
383
  }), translation.openInWallet]
352
- }), !!switchDid && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
384
+ }), !!switchDid && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
353
385
  className: "session-manager-menu-item",
354
386
  onClick: _onSwitchDid,
355
387
  "data-cy": "sessionManager-switch-trigger",
356
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
388
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
357
389
  component: _Switch.default,
358
390
  className: "session-manager-menu-icon"
359
391
  }), translation.switchDid]
360
- }), !!switchProfile && hasBindWallet && session.provider !== 'federated' && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
392
+ }), !!switchProfile && hasBindWallet && session.provider !== 'federated' && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
361
393
  className: "session-manager-menu-item",
362
394
  onClick: _onSwitchProfile,
363
395
  "data-cy": "sessionManager-switch-profile-trigger",
364
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
396
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
365
397
  component: _PersonOutline.default,
366
398
  className: "session-manager-menu-icon"
367
399
  }), translation.switchProfile]
368
- }), !!switchPassport && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
400
+ }), !!switchPassport && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
369
401
  className: "session-manager-menu-item",
370
402
  onClick: _onSwitchPassport,
371
403
  "data-cy": "sessionManager-switch-passport-trigger",
372
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
404
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
373
405
  component: _VpnKeyOutlined.default,
374
406
  className: "session-manager-menu-icon"
375
407
  }), translation.switchPassport]
376
- }), oauthConfigList.length > 0 && !hasBindAccount && session.provider !== 'federated' && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
408
+ }), oauthConfigList.length > 0 && !hasBindAccount && session.provider !== 'federated' && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
377
409
  className: "session-manager-menu-item",
378
410
  onClick: _onBindWallet,
379
411
  "data-cy": "sessionManager-bind-trigger",
380
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
381
- component: _Link.default,
412
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
413
+ component: _Link2.default,
382
414
  className: "session-manager-menu-icon"
383
415
  }), session.provider === 'auth0' ? "".concat(translation.bind, "DID Wallet") : "".concat(translation.bind).concat(translation.thirdParty)]
384
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
416
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
385
417
  className: "session-manager-menu-item",
386
418
  onClick: _onLogout,
387
419
  disabled: disableLogout,
388
420
  "data-cy": "sessionManager-logout-trigger",
389
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.SvgIcon, {
421
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SvgIcon.default, {
390
422
  component: _Disconnect.default,
391
423
  className: "session-manager-menu-icon"
392
424
  }), translation.disconnect]
package/lib/Util/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.appendParams = void 0;
6
7
  exports.detectWalletExtension = detectWalletExtension;
7
8
  exports.formatToDate = formatToDate;
8
9
  exports.formatToDatetime = formatToDatetime;
@@ -296,15 +297,45 @@ const isEthereumDid = did => {
296
297
  }
297
298
  return true;
298
299
  };
300
+
301
+ /**
302
+ *
303
+ * @param {string} url 需要处理的 url
304
+ * @param {{imageFilter: 'crop'|'resize'; w?: number; h?: number; r?: 0|90|180|270}} params
305
+ * @returns
306
+ */
299
307
  exports.isEthereumDid = isEthereumDid;
308
+ const appendParams = (url, params) => {
309
+ if (!params) {
310
+ return url;
311
+ }
312
+ try {
313
+ // HACK: 如果 url 中带有域名,则 urlInstance.origin 为 url 中的域名;否则,借用当前页面的 location.origin 作为域名来拼接一个 url
314
+ const urlInstance = new URL(url, window.location.origin);
315
+ Object.keys(params).forEach(key => {
316
+ urlInstance.searchParams.set(key, params[key]);
317
+ });
318
+ // HACK: 如果前后域名一致,代表前面已经借用了 location.origin,这个时候只需要返回 urlInstance.pathname + urlInstance.search 即可
319
+ if (urlInstance.origin === window.location.origin) {
320
+ return urlInstance.pathname + urlInstance.search;
321
+ }
322
+ return urlInstance.href;
323
+ } catch (_unused) {
324
+ return url;
325
+ }
326
+ };
327
+ exports.appendParams = appendParams;
300
328
  const getUserAvatar = function getUserAvatar(avatar) {
301
- var _window$blocklet, _window$blocklet$capa;
302
329
  let size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 48;
303
330
  if (!avatar) {
304
331
  return avatar;
305
332
  }
306
- if (avatar.indexOf('/.well-known/service') >= 0 && (_window$blocklet = window.blocklet) !== null && _window$blocklet !== void 0 && (_window$blocklet$capa = _window$blocklet.capabilities) !== null && _window$blocklet$capa !== void 0 && _window$blocklet$capa.httpImageFilter) {
307
- return "".concat(avatar, "/resize?w=").concat(size, "&h=").concat(size);
333
+ if (avatar.indexOf('/.well-known/service') >= 0) {
334
+ return appendParams(avatar, {
335
+ imageFilter: 'resize',
336
+ w: size,
337
+ h: size
338
+ });
308
339
  }
309
340
  return avatar;
310
341
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcblock/ux",
3
- "version": "2.6.3",
3
+ "version": "2.6.5",
4
4
  "description": "Common used react components for arcblock products",
5
5
  "keywords": [
6
6
  "react",
@@ -47,11 +47,11 @@
47
47
  "peerDependencies": {
48
48
  "react": ">=18.1.0"
49
49
  },
50
- "gitHead": "1b4d3ea0e13aa11bc06cad0be0e3dd630ffd7008",
50
+ "gitHead": "3456978c946fbf78d5476dc2447ab14877effc13",
51
51
  "dependencies": {
52
52
  "@arcblock/did-motif": "^1.1.13",
53
- "@arcblock/icons": "^2.6.3",
54
- "@arcblock/react-hooks": "^2.6.3",
53
+ "@arcblock/icons": "^2.6.5",
54
+ "@arcblock/react-hooks": "^2.6.5",
55
55
  "@babel/plugin-syntax-dynamic-import": "^7.8.3",
56
56
  "@emotion/react": "^11.10.4",
57
57
  "@emotion/styled": "^11.10.4",
@@ -2,16 +2,25 @@
2
2
  /* eslint-disable react/jsx-no-bind */
3
3
  import { useMemo, useRef, useState } from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import { IconButton, MenuList, MenuItem, SvgIcon, Button, Chip, CircularProgress } from '@mui/material';
6
- import AccountIcon from '@arcblock/icons/lib/Account';
5
+ import IconButton from '@mui/material/IconButton';
6
+ import MenuList from '@mui/material/MenuList';
7
+ import MenuItem from '@mui/material/MenuItem';
8
+ import SvgIcon from '@mui/material/SvgIcon';
9
+ import Button from '@mui/material/Button';
10
+ import Chip from '@mui/material/Chip';
11
+ import Link from '@mui/material/Link';
12
+ import CircularProgress from '@mui/material/CircularProgress';
13
+ import SwitchProfileIcon from '@mui/icons-material/PersonOutline';
14
+ import BindWalletIcon from '@mui/icons-material/Link';
15
+ import SwitchPassportIcon from '@mui/icons-material/VpnKeyOutlined';
16
+ import ConnectWithoutContactIcon from '@mui/icons-material/ConnectWithoutContact';
7
17
  import ShieldCheck from 'mdi-material-ui/ShieldCheck';
18
+ import AccountIcon from '@arcblock/icons/lib/Account';
8
19
  import OpenInIcon from '@arcblock/icons/lib/OpenIn';
9
20
  import DisconnectIcon from '@arcblock/icons/lib/Disconnect';
10
21
  import SwitchDidIcon from '@arcblock/icons/lib/Switch';
11
- import SwitchProfileIcon from '@mui/icons-material/PersonOutline';
12
- import BindWalletIcon from '@mui/icons-material/Link';
13
- import SwitchPassportIcon from '@mui/icons-material/VpnKeyOutlined';
14
22
  import useBrowser from '@arcblock/react-hooks/lib/useBrowser';
23
+ import isEmpty from 'lodash/isEmpty';
15
24
 
16
25
  import DidAvatar from '../Avatar';
17
26
  import DidAddress from '../Address';
@@ -30,6 +39,7 @@ const translations = {
30
39
  alreadyBindOAuth: 'Already bind Auth0',
31
40
  bind: 'Bind ',
32
41
  thirdParty: 'Third Party Login',
42
+ connectedWith: 'Connected with',
33
43
  },
34
44
  zh: {
35
45
  switchDid: '切换账户',
@@ -42,6 +52,7 @@ const translations = {
42
52
  alreadyBindOAuth: '已绑定 Auth0 账号',
43
53
  bind: '绑定',
44
54
  thirdParty: '第三方登录',
55
+ connectedWith: '连接至',
45
56
  },
46
57
  };
47
58
 
@@ -87,6 +98,7 @@ function SessionManager({
87
98
 
88
99
  const isRawWalletAccount = getSourceProvider(session.user) === 'wallet';
89
100
  const connectedAccounts = getConnectedAccounts(session.user);
101
+ const federatedAccount = connectedAccounts.find((item) => item.provider === 'federated');
90
102
  let hasBindWallet = false;
91
103
  let hasBindAccount = false;
92
104
  if (isRawWalletAccount) {
@@ -111,6 +123,8 @@ function SessionManager({
111
123
  // eslint-disable-next-line react/prop-types
112
124
  }, [session?.initialized, session?.loading]);
113
125
 
126
+ const masterSiteInfo = window.blocklet?.settings?.federated?.master;
127
+
114
128
  if (!session.user) {
115
129
  return (
116
130
  <>
@@ -242,6 +256,11 @@ function SessionManager({
242
256
  <DidAddress responsive={false}>{walletDid}</DidAddress>
243
257
  </div>
244
258
  )}
259
+ {federatedAccount && (
260
+ <div className="session-manager-id-item">
261
+ <DidAddress responsive={false}>{federatedAccount.did}</DidAddress>
262
+ </div>
263
+ )}
245
264
  {session?.user?.email && (
246
265
  <div className="session-manager-id-item">
247
266
  <DidAddress responsive={false}>{session.user.email}</DidAddress>
@@ -249,6 +268,15 @@ function SessionManager({
249
268
  )}
250
269
  </div>
251
270
  </div>
271
+ {federatedAccount && !isEmpty(masterSiteInfo) && (
272
+ <MenuItem className="session-manager-menu-item" data-cy="sessionManager-connectWithFederated">
273
+ <SvgIcon component={ConnectWithoutContactIcon} className="session-manager-menu-icon" />
274
+ {translation.connectedWith}
275
+ <Link ml={1} href={masterSiteInfo.appUrl} underline="hover" target="_blank">
276
+ {masterSiteInfo.appName}
277
+ </Link>
278
+ </MenuItem>
279
+ )}
252
280
  {Array.isArray(menu) &&
253
281
  menu.map((menuItem, index) => {
254
282
  const { svgIcon, ...menuProps } = menuItem;
package/src/Util/index.js CHANGED
@@ -283,13 +283,43 @@ export const isEthereumDid = (did) => {
283
283
  return true;
284
284
  };
285
285
 
286
+ /**
287
+ *
288
+ * @param {string} url 需要处理的 url
289
+ * @param {{imageFilter: 'crop'|'resize'; w?: number; h?: number; r?: 0|90|180|270}} params
290
+ * @returns
291
+ */
292
+ export const appendParams = (url, params) => {
293
+ if (!params) {
294
+ return url;
295
+ }
296
+ try {
297
+ // HACK: 如果 url 中带有域名,则 urlInstance.origin 为 url 中的域名;否则,借用当前页面的 location.origin 作为域名来拼接一个 url
298
+ const urlInstance = new URL(url, window.location.origin);
299
+ Object.keys(params).forEach((key) => {
300
+ urlInstance.searchParams.set(key, params[key]);
301
+ });
302
+ // HACK: 如果前后域名一致,代表前面已经借用了 location.origin,这个时候只需要返回 urlInstance.pathname + urlInstance.search 即可
303
+ if (urlInstance.origin === window.location.origin) {
304
+ return urlInstance.pathname + urlInstance.search;
305
+ }
306
+ return urlInstance.href;
307
+ } catch {
308
+ return url;
309
+ }
310
+ };
311
+
286
312
  export const getUserAvatar = (avatar, size = 48) => {
287
313
  if (!avatar) {
288
314
  return avatar;
289
315
  }
290
316
 
291
- if (avatar.indexOf('/.well-known/service') >= 0 && window.blocklet?.capabilities?.httpImageFilter) {
292
- return `${avatar}/resize?w=${size}&h=${size}`;
317
+ if (avatar.indexOf('/.well-known/service') >= 0) {
318
+ return appendParams(avatar, {
319
+ imageFilter: 'resize',
320
+ w: size,
321
+ h: size,
322
+ });
293
323
  }
294
324
 
295
325
  return avatar;