@arcblock/ux 2.5.59 → 2.5.60
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/Blocklet/blocklet.js +1 -1
- package/lib/BlockletNFT/index.js +1 -1
- package/lib/SessionManager/federated-login-detecter.js +171 -0
- package/lib/SessionManager/index.js +161 -191
- package/lib/SessionManager/user-popper.js +83 -0
- package/package.json +4 -4
- package/src/Blocklet/blocklet.js +1 -1
- package/src/BlockletNFT/index.js +1 -1
- package/src/SessionManager/federated-login-detecter.jsx +138 -0
- package/src/SessionManager/index.jsx +140 -233
- package/src/SessionManager/user-popper.jsx +121 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.default = UserPopper;
|
7
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
8
|
+
var _material = require("@mui/material");
|
9
|
+
var _Theme = require("../Theme");
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
11
|
+
var _templateObject;
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
14
|
+
function UserPopper(_ref) {
|
15
|
+
let {
|
16
|
+
anchorEl,
|
17
|
+
dark,
|
18
|
+
children,
|
19
|
+
open,
|
20
|
+
onClose
|
21
|
+
} = _ref;
|
22
|
+
return anchorEl && /*#__PURE__*/(0, _jsxRuntime.jsx)(StyledPopper, {
|
23
|
+
open: open,
|
24
|
+
disablePortal: true,
|
25
|
+
anchorEl: anchorEl,
|
26
|
+
placement: "bottom-end",
|
27
|
+
$dark: dark,
|
28
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Paper, {
|
29
|
+
sx: [theme => ({
|
30
|
+
borderColor: '#F0F0F0',
|
31
|
+
boxShadow: '0px 8px 12px rgba(92, 92, 92, 0.04)',
|
32
|
+
borderRadius: theme.spacing(2),
|
33
|
+
overflow: 'hidden',
|
34
|
+
maxWidth: 'calc(100vw - 10px)',
|
35
|
+
'& .MuiChip-root .MuiChip-icon': {
|
36
|
+
color: theme.palette.success.main
|
37
|
+
}
|
38
|
+
}), dark && {
|
39
|
+
backgroundColor: '#27282c',
|
40
|
+
color: '#fff',
|
41
|
+
border: 0,
|
42
|
+
'& .MuiChip-root': {
|
43
|
+
borderColor: '#aaa'
|
44
|
+
},
|
45
|
+
'& .MuiListItem-root, & .MuiChip-label': {
|
46
|
+
color: '#aaa'
|
47
|
+
},
|
48
|
+
'& .MuiListItem-root:hover': {
|
49
|
+
backgroundColor: '#363434'
|
50
|
+
}
|
51
|
+
}],
|
52
|
+
variant: "outlined",
|
53
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ClickAwayListener, {
|
54
|
+
onClickAway: onClose,
|
55
|
+
children: children
|
56
|
+
})
|
57
|
+
})
|
58
|
+
});
|
59
|
+
}
|
60
|
+
UserPopper.propTypes = {
|
61
|
+
anchorEl: _propTypes.default.instanceOf(Element),
|
62
|
+
dark: _propTypes.default.bool,
|
63
|
+
open: _propTypes.default.bool,
|
64
|
+
children: _propTypes.default.any.isRequired,
|
65
|
+
onClose: _propTypes.default.func
|
66
|
+
};
|
67
|
+
UserPopper.defaultProps = {
|
68
|
+
anchorEl: null,
|
69
|
+
dark: false,
|
70
|
+
open: false,
|
71
|
+
onClose: () => {}
|
72
|
+
};
|
73
|
+
const StyledPopper = (0, _Theme.styled)(_material.Popper)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n z-index: ", ";\n .MuiList-root {\n /* HACK: \u9700\u8981288px \u624D\u80FD\u5C06 did \u5C55\u793A\u5B8C\u6574 */\n width: 290px;\n }\n .session-manager-user {\n font-size: 12px;\n flex-direction: column;\n align-items: flex-start;\n padding: 24px 24px 10px;\n }\n .session-manager-user-name {\n font-size: 20px;\n color: ", ";\n font-weight: bold;\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .session-manager-id-item {\n position: relative;\n padding-left: 8px;\n /* HACK: \u5F53\u524D\u5143\u7D20\u65E2\u662F\u7B2C\u4E00\u4E2A\uFF0C\u4E5F\u662F\u6700\u540E\u4E00\u4E2A\uFF0C\u5373\u53EA\u6709\u4E00\u4E2A\u540C\u7EA7\u5143\u7D20 */\n &:first-of-type:last-of-type {\n padding-left: 0;\n &:before,\n &:after {\n content: unset;\n }\n }\n &:before {\n position: absolute;\n content: '';\n left: 0px;\n top: 50%;\n width: 6px;\n height: 1px;\n background-color: #aeaeae;\n }\n &:not(:last-of-type):after {\n position: absolute;\n content: '';\n left: 0px;\n top: 50%;\n height: 100%;\n width: 1px;\n background-color: #aeaeae;\n }\n }\n .session-manager-menu-item {\n padding: 18.5px 24px;\n color: #777;\n font-size: 16px;\n &:hover {\n background-color: #fbfbfb;\n }\n }\n .session-manager-menu-icon {\n color: #999;\n margin-right: 16px;\n }\n"])), _ref2 => {
|
74
|
+
let {
|
75
|
+
theme
|
76
|
+
} = _ref2;
|
77
|
+
return theme.zIndex.tooltip;
|
78
|
+
}, _ref3 => {
|
79
|
+
let {
|
80
|
+
$dark
|
81
|
+
} = _ref3;
|
82
|
+
return $dark ? '#aaa' : '#222';
|
83
|
+
});
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@arcblock/ux",
|
3
|
-
"version": "2.5.
|
3
|
+
"version": "2.5.60",
|
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": "50a0f90ecfb1d239e04cdfebc16e30d3947db4a2",
|
51
51
|
"dependencies": {
|
52
52
|
"@arcblock/did-motif": "^1.1.13",
|
53
|
-
"@arcblock/icons": "^2.5.
|
54
|
-
"@arcblock/react-hooks": "^2.5.
|
53
|
+
"@arcblock/icons": "^2.5.60",
|
54
|
+
"@arcblock/react-hooks": "^2.5.60",
|
55
55
|
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
56
56
|
"@emotion/react": "^11.10.4",
|
57
57
|
"@emotion/styled": "^11.10.4",
|
package/src/Blocklet/blocklet.js
CHANGED
@@ -3,9 +3,9 @@ import { isValidElement } from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
4
4
|
import Typography from '@mui/material/Typography';
|
5
5
|
import CircularProgress from '@mui/material/CircularProgress';
|
6
|
-
import Avatar from '@arcblock/did-connect/lib/Avatar';
|
7
6
|
import useMediaQuery from '@mui/material/useMediaQuery';
|
8
7
|
|
8
|
+
import Avatar from '../Avatar';
|
9
9
|
import Button from '../Button';
|
10
10
|
import Img from '../Img';
|
11
11
|
import { useTheme, styled } from '../Theme';
|
package/src/BlockletNFT/index.js
CHANGED
@@ -4,8 +4,8 @@ import Portal from '@mui/material/Portal';
|
|
4
4
|
import Typography from '@mui/material/Typography';
|
5
5
|
import CircularProgress from '@mui/material/CircularProgress';
|
6
6
|
import useMediaQuery from '@mui/material/useMediaQuery';
|
7
|
-
import Avatar from '@arcblock/did-connect/lib/Avatar';
|
8
7
|
|
8
|
+
import Avatar from '../Avatar';
|
9
9
|
import Icon from '../Icon';
|
10
10
|
import Button from '../Button';
|
11
11
|
import Img from '../Img';
|
@@ -0,0 +1,138 @@
|
|
1
|
+
import PropTypes from 'prop-types';
|
2
|
+
import { useCallback, useState } from 'react';
|
3
|
+
import { Box, Chip, Divider, SvgIcon } from '@mui/material';
|
4
|
+
import ShieldCheck from 'mdi-material-ui/ShieldCheck';
|
5
|
+
|
6
|
+
import UserPopper from './user-popper';
|
7
|
+
import DidAvatar from '../Avatar';
|
8
|
+
import DidAddress from '../Address';
|
9
|
+
import Button from '../Button';
|
10
|
+
import Toast from '../Toast';
|
11
|
+
|
12
|
+
const translations = {
|
13
|
+
en: {
|
14
|
+
useToConnect({ master, member }) {
|
15
|
+
return (
|
16
|
+
<>
|
17
|
+
Use {master} account to connect {member}
|
18
|
+
</>
|
19
|
+
);
|
20
|
+
},
|
21
|
+
connect: 'Connect Account',
|
22
|
+
loginFederatedFailed: 'Login federated account failed',
|
23
|
+
},
|
24
|
+
zh: {
|
25
|
+
useToConnect({ master, member }) {
|
26
|
+
return (
|
27
|
+
<>
|
28
|
+
使用 {master} 账号连接 {member}
|
29
|
+
</>
|
30
|
+
);
|
31
|
+
},
|
32
|
+
connect: '连接账号',
|
33
|
+
loginFederatedFailed: '登录统一登录账号失败',
|
34
|
+
},
|
35
|
+
};
|
36
|
+
|
37
|
+
export default function FederatedLoginDetecter({ session, anchorEl, dark, locale: _locale }) {
|
38
|
+
const [federatedLoginOpen, setFederatedLoginOpen] = useState(true);
|
39
|
+
|
40
|
+
const siteInfo = session.federatedMaster?.site;
|
41
|
+
const userInfo = session.federatedMaster?.user;
|
42
|
+
|
43
|
+
const localeList = Object.keys(translations);
|
44
|
+
const locale = localeList.includes(_locale) ? _locale : localeList[0];
|
45
|
+
|
46
|
+
const onLoginFederated = useCallback(() => {
|
47
|
+
session?.loginFederated(
|
48
|
+
(err) => {
|
49
|
+
if (err) {
|
50
|
+
Toast.error(err || translations[_locale].loginFederatedFailed);
|
51
|
+
} else {
|
52
|
+
setFederatedLoginOpen(false);
|
53
|
+
}
|
54
|
+
},
|
55
|
+
{ mode: userInfo ? 'auto' : 'manual' }
|
56
|
+
);
|
57
|
+
}, [session, userInfo, _locale]);
|
58
|
+
|
59
|
+
return (
|
60
|
+
siteInfo && (
|
61
|
+
<UserPopper
|
62
|
+
open={federatedLoginOpen}
|
63
|
+
anchorEl={anchorEl}
|
64
|
+
dark={dark}
|
65
|
+
onClose={() => setFederatedLoginOpen(false)}>
|
66
|
+
<Box p={2}>
|
67
|
+
{siteInfo && (
|
68
|
+
<Box display="flex" alignItems="center">
|
69
|
+
<Box
|
70
|
+
component="img"
|
71
|
+
mr={2}
|
72
|
+
src={`${siteInfo.appUrl}${siteInfo.appLogo}`}
|
73
|
+
alt={siteInfo.appName}
|
74
|
+
width="30px"
|
75
|
+
height="30px"
|
76
|
+
/>
|
77
|
+
<Box>
|
78
|
+
{translations[locale].useToConnect({
|
79
|
+
master: (
|
80
|
+
<Box
|
81
|
+
component="a"
|
82
|
+
href={siteInfo.appUrl}
|
83
|
+
target="_blank"
|
84
|
+
sx={{ textDecoration: 'none', fontWeight: 'bold', color: 'primary.main', fontSize: '1.2em' }}>
|
85
|
+
{siteInfo.appName}
|
86
|
+
</Box>
|
87
|
+
),
|
88
|
+
member: window.blocklet.appName,
|
89
|
+
})}
|
90
|
+
</Box>
|
91
|
+
</Box>
|
92
|
+
)}
|
93
|
+
{siteInfo && userInfo && <Divider style={{ margin: '15px 0 10px 0' }} />}
|
94
|
+
{userInfo && (
|
95
|
+
<Box display="flex" alignItems="center">
|
96
|
+
<DidAvatar variant="circle" did={userInfo.did} src={userInfo.avatar} size={28} shape="circle" />
|
97
|
+
<Box ml={2}>
|
98
|
+
<Box display="flex" justifyContent="space-between" alignItems="center">
|
99
|
+
<Box fontSize={18}>{userInfo.fullName}</Box>
|
100
|
+
{userInfo.role?.toUpperCase() && (
|
101
|
+
<Chip
|
102
|
+
label={userInfo.role?.toUpperCase()}
|
103
|
+
size="small"
|
104
|
+
variant="outlined"
|
105
|
+
sx={{ height: 'auto', marginRight: 0, fontSize: 12 }}
|
106
|
+
icon={<SvgIcon component={ShieldCheck} style={{ fontSize: '14px' }} />}
|
107
|
+
/>
|
108
|
+
)}
|
109
|
+
</Box>
|
110
|
+
<DidAddress responsive={false}>{userInfo.did}</DidAddress>
|
111
|
+
</Box>
|
112
|
+
</Box>
|
113
|
+
)}
|
114
|
+
{siteInfo && (
|
115
|
+
<Box display="flex" justifyContent="center" mt={2}>
|
116
|
+
<Button variant="contained" size="small" onClick={onLoginFederated}>
|
117
|
+
{translations[locale].connect}
|
118
|
+
</Button>
|
119
|
+
</Box>
|
120
|
+
)}
|
121
|
+
</Box>
|
122
|
+
</UserPopper>
|
123
|
+
)
|
124
|
+
);
|
125
|
+
}
|
126
|
+
|
127
|
+
FederatedLoginDetecter.propTypes = {
|
128
|
+
session: PropTypes.object.isRequired,
|
129
|
+
anchorEl: PropTypes.instanceOf(Element),
|
130
|
+
dark: PropTypes.bool,
|
131
|
+
locale: PropTypes.string,
|
132
|
+
};
|
133
|
+
|
134
|
+
FederatedLoginDetecter.defaultProps = {
|
135
|
+
dark: false,
|
136
|
+
anchorEl: null,
|
137
|
+
locale: 'en',
|
138
|
+
};
|