@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.
- package/lib/SessionManager/index.js +63 -31
- package/lib/Util/index.js +34 -3
- package/package.json +4 -4
- package/src/SessionManager/index.jsx +33 -5
- package/src/Util/index.js +32 -2
@@ -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
|
10
|
-
var
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
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)(
|
381
|
-
component:
|
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)(
|
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)(
|
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
|
307
|
-
return
|
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
|
+
"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": "
|
50
|
+
"gitHead": "3456978c946fbf78d5476dc2447ab14877effc13",
|
51
51
|
"dependencies": {
|
52
52
|
"@arcblock/did-motif": "^1.1.13",
|
53
|
-
"@arcblock/icons": "^2.6.
|
54
|
-
"@arcblock/react-hooks": "^2.6.
|
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
|
6
|
-
import
|
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
|
292
|
-
return
|
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;
|