@blocklet/ui-react 2.9.52 → 2.9.54
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/es/@types/index.d.ts +3 -5
- package/es/Dashboard/index.d.ts +5 -6
- package/es/Dashboard/index.js +5 -5
- package/es/Footer/index.js +2 -2
- package/es/Header/index.js +5 -5
- package/es/UserCenter/components/notification.js +1 -1
- package/es/UserCenter/components/passport.js +1 -2
- package/es/UserCenter/components/privacy.js +1 -1
- package/es/UserCenter/components/settings.js +9 -1
- package/es/UserCenter/components/storage/connect-to.d.ts +1 -1
- package/es/UserCenter/components/storage/connect-to.js +9 -3
- package/es/UserCenter/components/storage/delete.d.ts +1 -1
- package/es/UserCenter/components/storage/delete.js +4 -1
- package/es/UserCenter/components/storage/item.js +1 -1
- package/es/UserCenter/components/user-center.d.ts +2 -2
- package/es/UserCenter/components/user-center.js +15 -6
- package/es/UserCenter/libs/locales.d.ts +2 -0
- package/es/UserCenter/libs/locales.js +2 -0
- package/es/UserSessions/components/user-session-info.d.ts +6 -0
- package/es/UserSessions/components/user-session-info.js +58 -0
- package/es/UserSessions/components/user-sessions.d.ts +9 -0
- package/es/UserSessions/components/user-sessions.js +255 -0
- package/es/UserSessions/index.d.ts +1 -0
- package/es/UserSessions/index.js +1 -0
- package/es/UserSessions/libs/locales.d.ts +52 -0
- package/es/UserSessions/libs/locales.js +52 -0
- package/es/UserSessions/libs/utils.d.ts +2 -0
- package/es/UserSessions/libs/utils.js +73 -0
- package/es/blocklets.js +6 -6
- package/es/common/header-addons.d.ts +3 -4
- package/es/common/header-addons.js +4 -4
- package/es/contexts/config-user-space.js +2 -2
- package/es/index.d.ts +1 -0
- package/es/index.js +1 -0
- package/es/types.d.ts +2 -2
- package/es/types.js +2 -2
- package/lib/@types/index.d.ts +3 -5
- package/lib/Dashboard/index.d.ts +5 -6
- package/lib/Dashboard/index.js +4 -4
- package/lib/Footer/index.js +1 -1
- package/lib/Header/index.js +4 -4
- package/lib/UserCenter/components/notification.js +1 -1
- package/lib/UserCenter/components/passport.js +1 -2
- package/lib/UserCenter/components/privacy.js +1 -1
- package/lib/UserCenter/components/settings.js +10 -1
- package/lib/UserCenter/components/storage/connect-to.d.ts +1 -1
- package/lib/UserCenter/components/storage/connect-to.js +3 -3
- package/lib/UserCenter/components/storage/delete.d.ts +1 -1
- package/lib/UserCenter/components/storage/item.js +1 -1
- package/lib/UserCenter/components/user-center.d.ts +2 -2
- package/lib/UserCenter/components/user-center.js +20 -10
- package/lib/UserCenter/libs/locales.d.ts +2 -0
- package/lib/UserCenter/libs/locales.js +2 -0
- package/lib/UserSessions/components/user-session-info.d.ts +6 -0
- package/lib/UserSessions/components/user-session-info.js +68 -0
- package/lib/UserSessions/components/user-sessions.d.ts +9 -0
- package/lib/UserSessions/components/user-sessions.js +282 -0
- package/lib/UserSessions/index.d.ts +1 -0
- package/lib/UserSessions/index.js +13 -0
- package/lib/UserSessions/libs/locales.d.ts +52 -0
- package/lib/UserSessions/libs/locales.js +58 -0
- package/lib/UserSessions/libs/utils.d.ts +2 -0
- package/lib/UserSessions/libs/utils.js +80 -0
- package/lib/blocklets.js +6 -6
- package/lib/common/header-addons.d.ts +3 -4
- package/lib/common/header-addons.js +3 -3
- package/lib/contexts/config-user-space.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +12 -0
- package/lib/types.d.ts +2 -2
- package/lib/types.js +3 -3
- package/package.json +14 -6
- package/src/@types/index.ts +3 -5
- package/src/Dashboard/index.jsx +7 -3
- package/src/Footer/index.jsx +2 -2
- package/src/Header/index.jsx +5 -3
- package/src/Icon/index.jsx +1 -0
- package/src/UserCenter/components/notification.tsx +2 -2
- package/src/UserCenter/components/passport.tsx +1 -2
- package/src/UserCenter/components/privacy.tsx +1 -1
- package/src/UserCenter/components/settings.tsx +15 -2
- package/src/UserCenter/components/storage/connect-to.tsx +17 -11
- package/src/UserCenter/components/storage/delete.tsx +8 -2
- package/src/UserCenter/components/storage/item.tsx +2 -3
- package/src/UserCenter/components/storage/preview-nft.tsx +1 -1
- package/src/UserCenter/components/user-center.tsx +21 -14
- package/src/UserCenter/components/webhook-item.tsx +1 -1
- package/src/UserCenter/libs/locales.ts +2 -0
- package/src/UserSessions/components/user-session-info.tsx +52 -0
- package/src/UserSessions/components/user-sessions.tsx +276 -0
- package/src/UserSessions/index.tsx +1 -0
- package/src/UserSessions/libs/locales.ts +52 -0
- package/src/UserSessions/libs/utils.ts +82 -0
- package/src/blocklets.js +6 -6
- package/src/common/header-addons.jsx +2 -2
- package/src/contexts/config-user-space.tsx +12 -11
- package/src/index.ts +1 -0
- package/src/{UserCenter/libs → libs}/client.ts +1 -0
- package/src/libs/spaces.tsx +2 -2
- package/src/types.js +2 -2
- /package/es/{UserCenter/libs → libs}/client.d.ts +0 -0
- /package/es/{UserCenter/libs → libs}/client.js +0 -0
- /package/lib/{UserCenter/libs → libs}/client.d.ts +0 -0
- /package/lib/{UserCenter/libs → libs}/client.js +0 -0
package/lib/Footer/index.js
CHANGED
package/lib/Header/index.js
CHANGED
|
@@ -72,7 +72,7 @@ const parseNavigation = navigation => {
|
|
|
72
72
|
function Header({
|
|
73
73
|
meta,
|
|
74
74
|
addons,
|
|
75
|
-
sessionManagerProps
|
|
75
|
+
sessionManagerProps,
|
|
76
76
|
homeLink,
|
|
77
77
|
theme: themeOverrides,
|
|
78
78
|
hideNavMenu,
|
|
@@ -111,7 +111,7 @@ function Header({
|
|
|
111
111
|
const headerAddons = /* @__PURE__ */(0, _jsxRuntime.jsx)(_headerAddons.default, {
|
|
112
112
|
formattedBlocklet,
|
|
113
113
|
addons: _addons,
|
|
114
|
-
sessionManagerProps
|
|
114
|
+
sessionManagerProps
|
|
115
115
|
});
|
|
116
116
|
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_overridableThemeProvider.default, {
|
|
117
117
|
theme: themeOverrides,
|
|
@@ -139,12 +139,12 @@ function Header({
|
|
|
139
139
|
});
|
|
140
140
|
}
|
|
141
141
|
Header.propTypes = {
|
|
142
|
-
meta: _types.
|
|
142
|
+
meta: _types.BlockletMetaProps,
|
|
143
143
|
// 需要考虑 定制的 addons 与内置的 连接钱包/选择语言 addons 共存的情况
|
|
144
144
|
// - PropTypes.func: 可以把自定义 addons 插在 session-manager 或 locale-selector (如果存在的话) 前/中/后
|
|
145
145
|
// - PropTypes.node: 将 addons 原样传给 UX Header 组件
|
|
146
146
|
addons: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.node]),
|
|
147
|
-
sessionManagerProps: _types.
|
|
147
|
+
sessionManagerProps: _types.SessionManagerProps,
|
|
148
148
|
homeLink: _propTypes.default.string,
|
|
149
149
|
// 允许覆盖 header 内置的 theme
|
|
150
150
|
theme: _propTypes.default.object,
|
|
@@ -19,7 +19,7 @@ var _context = require("@arcblock/ux/lib/Locale/context");
|
|
|
19
19
|
var _locales = require("../libs/locales");
|
|
20
20
|
var _webhookItem = _interopRequireDefault(require("./webhook-item"));
|
|
21
21
|
var _utils2 = require("../libs/utils");
|
|
22
|
-
var _client = require("
|
|
22
|
+
var _client = require("../../libs/client");
|
|
23
23
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
24
24
|
function Notification({
|
|
25
25
|
user
|
|
@@ -13,7 +13,7 @@ var _util = require("@arcblock/ux/lib/Locale/util");
|
|
|
13
13
|
var _context = require("@arcblock/ux/lib/Locale/context");
|
|
14
14
|
var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
|
|
15
15
|
var _locales = require("../libs/locales");
|
|
16
|
-
var _client = require("
|
|
16
|
+
var _client = require("../../libs/client");
|
|
17
17
|
var _utils = require("../libs/utils");
|
|
18
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
19
|
function Privacy({
|
|
@@ -15,6 +15,7 @@ var _locales = require("../libs/locales");
|
|
|
15
15
|
var _notification = _interopRequireDefault(require("./notification"));
|
|
16
16
|
var _privacy = _interopRequireDefault(require("./privacy"));
|
|
17
17
|
var _storage = _interopRequireDefault(require("./storage"));
|
|
18
|
+
var _UserSessions = require("../../UserSessions");
|
|
18
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
20
|
function Settings({
|
|
20
21
|
user,
|
|
@@ -58,6 +59,12 @@ function Settings({
|
|
|
58
59
|
content: /* @__PURE__ */(0, _jsxRuntime.jsx)(_configUserSpace.ConfigUserSpaceProvider, {
|
|
59
60
|
children: /* @__PURE__ */(0, _jsxRuntime.jsx)(_storage.default, {})
|
|
60
61
|
})
|
|
62
|
+
}, {
|
|
63
|
+
label: t("sessionManagement"),
|
|
64
|
+
value: "session",
|
|
65
|
+
content: /* @__PURE__ */(0, _jsxRuntime.jsx)(_UserSessions.UserSessions, {
|
|
66
|
+
user
|
|
67
|
+
})
|
|
61
68
|
}].filter(Boolean);
|
|
62
69
|
}, [user, privacyConfigList]);
|
|
63
70
|
const currentState = (0, _ahooks.useReactive)({
|
|
@@ -73,7 +80,9 @@ function Settings({
|
|
|
73
80
|
...rest,
|
|
74
81
|
sx: {
|
|
75
82
|
...rest?.sx,
|
|
76
|
-
|
|
83
|
+
minWidth: {
|
|
84
|
+
md: 500
|
|
85
|
+
},
|
|
77
86
|
maxWidth: "100%"
|
|
78
87
|
},
|
|
79
88
|
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_Tabs.default, {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { SpaceGateway } from '../../../contexts/config-user-space';
|
|
3
|
-
declare function ConnectTo({ onConnect, storageEndpoint,
|
|
3
|
+
declare function ConnectTo({ onConnect, storageEndpoint, }: {
|
|
4
4
|
onConnect: (spaceGateway: SpaceGateway) => Promise<void>;
|
|
5
5
|
storageEndpoint: string;
|
|
6
6
|
}): import("react").JSX.Element;
|
|
@@ -17,8 +17,7 @@ var _api = require("../../libs/api");
|
|
|
17
17
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
18
|
function ConnectTo({
|
|
19
19
|
onConnect,
|
|
20
|
-
storageEndpoint
|
|
21
|
-
...rest
|
|
20
|
+
storageEndpoint
|
|
22
21
|
}) {
|
|
23
22
|
const {
|
|
24
23
|
t,
|
|
@@ -29,8 +28,9 @@ function ConnectTo({
|
|
|
29
28
|
action: "connect-to-did-spaces-for-user",
|
|
30
29
|
checkTimeout: 1e3 * 300,
|
|
31
30
|
prefix: "/api/did",
|
|
32
|
-
// @ts-expect-error
|
|
33
31
|
checkFn: _api.axios.create({
|
|
32
|
+
// FIXME: @jianchao 检查 env 的使用是否正确
|
|
33
|
+
// @ts-ignore
|
|
34
34
|
baseURL: (0, _ufo.joinURL)(window.location.origin, window.env && window.env.apiPrefix ? window.env.apiPrefix : "/")
|
|
35
35
|
}).get,
|
|
36
36
|
extraParams: {},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { SpaceGateway } from '../../../contexts/config-user-space';
|
|
3
|
-
declare function SpaceDelete({ spaceGateway, onDeleteSpace }: {
|
|
3
|
+
declare function SpaceDelete({ spaceGateway, onDeleteSpace, }: {
|
|
4
4
|
spaceGateway: SpaceGateway;
|
|
5
5
|
onDeleteSpace: (spaceGateway: SpaceGateway) => Promise<void>;
|
|
6
6
|
}): JSX.Element;
|
|
@@ -9,8 +9,8 @@ var _material = require("@mui/material");
|
|
|
9
9
|
var _context = require("@arcblock/ux/lib/Locale/context");
|
|
10
10
|
var _Check = _interopRequireDefault(require("@mui/icons-material/Check"));
|
|
11
11
|
var _styled = _interopRequireDefault(require("@emotion/styled"));
|
|
12
|
-
var _spaceConnected = _interopRequireDefault(require("./icons/space-connected.svg?react"));
|
|
13
12
|
var _DID = _interopRequireDefault(require("@arcblock/ux/lib/DID"));
|
|
13
|
+
var _spaceConnected = _interopRequireDefault(require("./icons/space-connected.svg?react"));
|
|
14
14
|
var _previewNft = _interopRequireDefault(require("./preview-nft"));
|
|
15
15
|
var _useMobile = _interopRequireDefault(require("../../../hooks/use-mobile"));
|
|
16
16
|
var _spaces = require("../../../libs/spaces");
|
|
@@ -7,8 +7,8 @@ export default function UserCenter({ children, currentTab, contentProps, disable
|
|
|
7
7
|
readonly disableAutoRedirect?: boolean;
|
|
8
8
|
readonly autoPopupSetting?: boolean;
|
|
9
9
|
readonly hideFooter?: boolean;
|
|
10
|
-
readonly headerProps?:
|
|
11
|
-
readonly footerProps?:
|
|
10
|
+
readonly headerProps?: any;
|
|
11
|
+
readonly footerProps?: any;
|
|
12
12
|
readonly userDid?: string;
|
|
13
13
|
readonly stickySidebar?: boolean;
|
|
14
14
|
}): import("react").JSX.Element | null;
|
|
@@ -20,14 +20,15 @@ var _context = require("@arcblock/ux/lib/Locale/context");
|
|
|
20
20
|
var _ErrorBoundary = require("@arcblock/ux/lib/ErrorBoundary");
|
|
21
21
|
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
22
22
|
var _ufo = require("ufo");
|
|
23
|
-
var
|
|
23
|
+
var _Footer = _interopRequireDefault(require("../../Footer"));
|
|
24
|
+
var _Header = _interopRequireDefault(require("../../Header"));
|
|
24
25
|
var _locales = require("../libs/locales");
|
|
25
26
|
var _userInfo = _interopRequireDefault(require("./user-info"));
|
|
26
27
|
var _userBasicInfo = _interopRequireDefault(require("./user-basic-info"));
|
|
27
28
|
var _blocklets = require("../../blocklets");
|
|
28
29
|
var _passport = _interopRequireDefault(require("./passport"));
|
|
29
30
|
var _settings = _interopRequireDefault(require("./settings"));
|
|
30
|
-
var _client = require("
|
|
31
|
+
var _client = require("../../libs/client");
|
|
31
32
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
33
|
function UserCenter({
|
|
33
34
|
children,
|
|
@@ -38,7 +39,7 @@ function UserCenter({
|
|
|
38
39
|
hideFooter = false,
|
|
39
40
|
headerProps = {},
|
|
40
41
|
footerProps = {},
|
|
41
|
-
userDid,
|
|
42
|
+
userDid = void 0,
|
|
42
43
|
stickySidebar = false
|
|
43
44
|
}) {
|
|
44
45
|
const {
|
|
@@ -69,13 +70,15 @@ function UserCenter({
|
|
|
69
70
|
}
|
|
70
71
|
return false;
|
|
71
72
|
}, [currentDid, session?.user?.did]);
|
|
72
|
-
const userState = (0, _ahooks.useRequest)(
|
|
73
|
+
const userState = (0, _ahooks.useRequest)(
|
|
74
|
+
// eslint-disable-next-line consistent-return
|
|
75
|
+
async () => {
|
|
73
76
|
await (0, _pWaitFor.default)(() => session?.initialized);
|
|
74
77
|
if (isMyself) {
|
|
75
78
|
return session.user;
|
|
76
79
|
}
|
|
77
80
|
if (currentDid) {
|
|
78
|
-
return
|
|
81
|
+
return _client.client.user.getUserPublicInfo({
|
|
79
82
|
did: currentDid
|
|
80
83
|
});
|
|
81
84
|
}
|
|
@@ -100,7 +103,8 @@ function UserCenter({
|
|
|
100
103
|
} = (0, _Dialog.useConfirm)({
|
|
101
104
|
sx: {
|
|
102
105
|
".MuiDialog-paper": {
|
|
103
|
-
borderRadius: 2
|
|
106
|
+
borderRadius: 2,
|
|
107
|
+
maxWidth: 1200
|
|
104
108
|
},
|
|
105
109
|
".ux-dialog_title": {
|
|
106
110
|
fontWeight: 600
|
|
@@ -273,12 +277,18 @@ function UserCenter({
|
|
|
273
277
|
color: _Colors.temp.primary100
|
|
274
278
|
}
|
|
275
279
|
})
|
|
276
|
-
}) :
|
|
280
|
+
}) :
|
|
281
|
+
// eslint-disable-next-line react/jsx-no-useless-fragment
|
|
282
|
+
/* @__PURE__ */
|
|
283
|
+
(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
277
284
|
children: currentActiveTab?.protected && !isMyself ? /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
|
|
278
285
|
children: /* @__PURE__ */(0, _jsxRuntime.jsx)(_Empty.default, {
|
|
279
286
|
children: t("underProtected")
|
|
280
287
|
})
|
|
281
|
-
}) :
|
|
288
|
+
}) :
|
|
289
|
+
// eslint-disable-next-line react/jsx-no-useless-fragment
|
|
290
|
+
/* @__PURE__ */
|
|
291
|
+
(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
282
292
|
children: children && /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
|
|
283
293
|
...contentProps,
|
|
284
294
|
children
|
|
@@ -377,7 +387,7 @@ function UserCenter({
|
|
|
377
387
|
display: "flex",
|
|
378
388
|
flexDirection: "column"
|
|
379
389
|
},
|
|
380
|
-
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(
|
|
390
|
+
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_Header.default, {
|
|
381
391
|
bordered: true,
|
|
382
392
|
...headerProps
|
|
383
393
|
}), /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
|
|
@@ -396,7 +406,7 @@ function UserCenter({
|
|
|
396
406
|
gap: 2.5
|
|
397
407
|
},
|
|
398
408
|
children: [content, confirmHolder]
|
|
399
|
-
}), hideFooter ? null : /* @__PURE__ */(0, _jsxRuntime.jsx)(
|
|
409
|
+
}), hideFooter ? null : /* @__PURE__ */(0, _jsxRuntime.jsx)(_Footer.default, {
|
|
400
410
|
bordered: true,
|
|
401
411
|
...footerProps
|
|
402
412
|
})]
|
|
@@ -41,6 +41,7 @@ export declare const translations: {
|
|
|
41
41
|
myInfo: string;
|
|
42
42
|
loginNow: string;
|
|
43
43
|
viewAfterLogin: string;
|
|
44
|
+
sessionManagement: string;
|
|
44
45
|
storage: {
|
|
45
46
|
spaces: {
|
|
46
47
|
tips: string;
|
|
@@ -110,6 +111,7 @@ export declare const translations: {
|
|
|
110
111
|
myInfo: string;
|
|
111
112
|
loginNow: string;
|
|
112
113
|
viewAfterLogin: string;
|
|
114
|
+
sessionManagement: string;
|
|
113
115
|
storage: {
|
|
114
116
|
spaces: {
|
|
115
117
|
tips: string;
|
|
@@ -47,6 +47,7 @@ const translations = exports.translations = {
|
|
|
47
47
|
myInfo: "\u6211\u7684\u4FE1\u606F",
|
|
48
48
|
loginNow: "\u7ACB\u5373\u767B\u5F55",
|
|
49
49
|
viewAfterLogin: "\u767B\u5F55\u540E\u624D\u53EF\u4EE5\u67E5\u770B",
|
|
50
|
+
sessionManagement: "\u4F1A\u8BDD\u7BA1\u7406",
|
|
50
51
|
storage: {
|
|
51
52
|
spaces: {
|
|
52
53
|
tips: "\u63D0\u793A",
|
|
@@ -116,6 +117,7 @@ const translations = exports.translations = {
|
|
|
116
117
|
myInfo: "My Info",
|
|
117
118
|
loginNow: "Login",
|
|
118
119
|
viewAfterLogin: "View after login",
|
|
120
|
+
sessionManagement: "Session Management",
|
|
119
121
|
storage: {
|
|
120
122
|
spaces: {
|
|
121
123
|
tips: "Tips",
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
module.exports = UserSessionInfo;
|
|
7
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
8
|
+
var _material = require("@mui/material");
|
|
9
|
+
var _Avatar = _interopRequireDefault(require("@arcblock/ux/lib/Avatar"));
|
|
10
|
+
var _ahooks = require("ahooks");
|
|
11
|
+
var _Colors = require("@arcblock/ux/lib/Colors");
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
function UserSessionInfo({
|
|
14
|
+
user,
|
|
15
|
+
sessionUser
|
|
16
|
+
}) {
|
|
17
|
+
const currentRole = (0, _ahooks.useCreation)(() => {
|
|
18
|
+
return (user?.passports || [])?.find(item => item.name === sessionUser.role);
|
|
19
|
+
}, [user?.passports, sessionUser?.role]);
|
|
20
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
|
|
21
|
+
sx: {
|
|
22
|
+
display: "flex",
|
|
23
|
+
alignItems: "center",
|
|
24
|
+
gap: 1
|
|
25
|
+
},
|
|
26
|
+
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_Avatar.default, {
|
|
27
|
+
size: 40,
|
|
28
|
+
variant: "circle",
|
|
29
|
+
shape: "circle",
|
|
30
|
+
src: sessionUser.avatar,
|
|
31
|
+
did: sessionUser.did
|
|
32
|
+
}), /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
|
|
33
|
+
children: [/* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
|
|
34
|
+
sx: {
|
|
35
|
+
display: "flex",
|
|
36
|
+
alignItems: "center",
|
|
37
|
+
gap: 1
|
|
38
|
+
},
|
|
39
|
+
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
|
|
40
|
+
sx: {
|
|
41
|
+
whiteSpace: "normal",
|
|
42
|
+
wordBreak: "break-all"
|
|
43
|
+
},
|
|
44
|
+
children: sessionUser.fullName
|
|
45
|
+
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Chip, {
|
|
46
|
+
label: currentRole?.title || currentRole?.name || "Guest",
|
|
47
|
+
size: "small",
|
|
48
|
+
variant: "outlined",
|
|
49
|
+
sx: {
|
|
50
|
+
flexShrink: 0,
|
|
51
|
+
fontWeight: "bold",
|
|
52
|
+
fontSize: "12px",
|
|
53
|
+
color: _Colors.temp.textBase,
|
|
54
|
+
borderColor: _Colors.temp.strokeBorderStrong,
|
|
55
|
+
backgroundColor: "transparent",
|
|
56
|
+
textTransform: "capitalize",
|
|
57
|
+
pr: 1,
|
|
58
|
+
pl: 0.5
|
|
59
|
+
}
|
|
60
|
+
})]
|
|
61
|
+
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
|
|
62
|
+
variant: "body2",
|
|
63
|
+
color: "grey",
|
|
64
|
+
children: sessionUser.email
|
|
65
|
+
})]
|
|
66
|
+
})]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { User } from '../../@types';
|
|
3
|
+
export default function UserSessions({ user, showAction, showUser, }: {
|
|
4
|
+
readonly user: User & {
|
|
5
|
+
userSessions?: any[];
|
|
6
|
+
};
|
|
7
|
+
readonly showAction?: boolean;
|
|
8
|
+
readonly showUser?: boolean;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
module.exports = UserSessions;
|
|
7
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
8
|
+
var _Datatable = _interopRequireDefault(require("@arcblock/ux/lib/Datatable"));
|
|
9
|
+
var _ahooks = require("ahooks");
|
|
10
|
+
var _util = require("@arcblock/ux/lib/Locale/util");
|
|
11
|
+
var _context = require("@arcblock/ux/lib/Locale/context");
|
|
12
|
+
var _RelativeTime = _interopRequireDefault(require("@arcblock/ux/lib/RelativeTime"));
|
|
13
|
+
var _sortBy = _interopRequireDefault(require("lodash/sortBy"));
|
|
14
|
+
var _uaParserJs = _interopRequireDefault(require("ua-parser-js"));
|
|
15
|
+
var _Util = require("@arcblock/ux/lib/Util");
|
|
16
|
+
var _Dialog = require("@arcblock/ux/lib/Dialog");
|
|
17
|
+
var _pAll = _interopRequireDefault(require("p-all"));
|
|
18
|
+
var _material = require("@mui/material");
|
|
19
|
+
var _userSessionInfo = _interopRequireDefault(require("./user-session-info"));
|
|
20
|
+
var _client = require("../../libs/client");
|
|
21
|
+
var _locales = require("../libs/locales");
|
|
22
|
+
var _utils = require("../libs/utils");
|
|
23
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
24
|
+
const parseUa = ua => {
|
|
25
|
+
const parser = new _uaParserJs.default(ua, {
|
|
26
|
+
// eslint-disable-next-line no-useless-escape
|
|
27
|
+
browser: [[/(ArcWallet)\/([\w\.]+)/i], [_uaParserJs.default.BROWSER.NAME, _uaParserJs.default.BROWSER.VERSION]]
|
|
28
|
+
});
|
|
29
|
+
const result = parser.getResult();
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
function UserSessions({
|
|
33
|
+
user,
|
|
34
|
+
showAction = true,
|
|
35
|
+
showUser = true
|
|
36
|
+
}) {
|
|
37
|
+
const currentVisitorId = (0, _Util.getVisitorId)();
|
|
38
|
+
const {
|
|
39
|
+
locale
|
|
40
|
+
} = (0, _context.useLocaleContext)();
|
|
41
|
+
const {
|
|
42
|
+
confirmApi,
|
|
43
|
+
confirmHolder
|
|
44
|
+
} = (0, _Dialog.useConfirm)();
|
|
45
|
+
const t = (0, _ahooks.useMemoizedFn)((key, data = {}) => {
|
|
46
|
+
return (0, _util.translate)(_locales.translations, key, locale, "en", data);
|
|
47
|
+
});
|
|
48
|
+
const getData = (0, _ahooks.useMemoizedFn)(async () => {
|
|
49
|
+
let data = user?.userSessions;
|
|
50
|
+
if (!data) {
|
|
51
|
+
data = await _client.client.userSession.getUserSessions({
|
|
52
|
+
did: user.did
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const ipIndexList = data?.map((x, index) => [index, x.lastLoginIp]).filter(x => !!x[1]);
|
|
57
|
+
const ipList = ipIndexList?.map(x => x[1]);
|
|
58
|
+
const result = await (0, _utils.batchIp2Region)(ipList);
|
|
59
|
+
for (let index = 0; index < result.length; index++) {
|
|
60
|
+
const x = result[index];
|
|
61
|
+
const ipIndexItem = ipIndexList[index];
|
|
62
|
+
const dataItem = data[ipIndexItem[0]];
|
|
63
|
+
dataItem.ipRegion = x;
|
|
64
|
+
}
|
|
65
|
+
} catch (e) {
|
|
66
|
+
console.warn("Failed to convert ip to region");
|
|
67
|
+
console.error(e);
|
|
68
|
+
}
|
|
69
|
+
const now = /* @__PURE__ */new Date().getTime();
|
|
70
|
+
return (0, _sortBy.default)(data, x => {
|
|
71
|
+
if (x.visitorId === currentVisitorId) {
|
|
72
|
+
return -1;
|
|
73
|
+
}
|
|
74
|
+
return now - new Date(x.updatedAt).getTime();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
const pageState = (0, _ahooks.useRequest)(getData);
|
|
78
|
+
const safeData = (0, _ahooks.useCreation)(() => {
|
|
79
|
+
return pageState.data || [];
|
|
80
|
+
}, [pageState.data]);
|
|
81
|
+
const ipRegionMap = (0, _ahooks.useCreation)(() => {
|
|
82
|
+
return safeData.reduce((acc, x) => {
|
|
83
|
+
acc[x.lastLoginIp] = x.ipRegion;
|
|
84
|
+
return acc;
|
|
85
|
+
}, {});
|
|
86
|
+
}, [safeData]);
|
|
87
|
+
const logout = (0, _ahooks.useMemoizedFn)(({
|
|
88
|
+
visitorId
|
|
89
|
+
}) => {
|
|
90
|
+
confirmApi.open({
|
|
91
|
+
title: t("logoutThisSession"),
|
|
92
|
+
content: t("logoutThisSessionConfirm"),
|
|
93
|
+
confirmButtonText: t("confirm"),
|
|
94
|
+
cancelButtonText: t("cancel"),
|
|
95
|
+
onConfirm: async () => {
|
|
96
|
+
await _client.client.user.logout({
|
|
97
|
+
visitorId
|
|
98
|
+
});
|
|
99
|
+
pageState.refresh();
|
|
100
|
+
confirmApi.close();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
const otherUserSessions = (0, _ahooks.useCreation)(() => {
|
|
105
|
+
const list = safeData.filter(x => x.visitorId !== currentVisitorId);
|
|
106
|
+
return list;
|
|
107
|
+
}, [safeData]);
|
|
108
|
+
const logoutAll = (0, _ahooks.useMemoizedFn)(() => {
|
|
109
|
+
confirmApi.open({
|
|
110
|
+
title: t("logoutAllSession"),
|
|
111
|
+
content: t("logoutAllSessionConfirm"),
|
|
112
|
+
confirmButtonText: t("confirm"),
|
|
113
|
+
cancelButtonText: t("cancel"),
|
|
114
|
+
onConfirm: async () => {
|
|
115
|
+
const list = otherUserSessions.map(x => {
|
|
116
|
+
return () => _client.client.user.logout({
|
|
117
|
+
visitorId: x.visitorId
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
await (0, _pAll.default)(list, {
|
|
121
|
+
concurrency: 3,
|
|
122
|
+
stopOnError: false
|
|
123
|
+
});
|
|
124
|
+
pageState.refresh();
|
|
125
|
+
confirmApi.close();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
const customButtons = [];
|
|
130
|
+
if (showAction) {
|
|
131
|
+
customButtons.push( /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Tooltip, {
|
|
132
|
+
title: t("logoutAllTips"),
|
|
133
|
+
children: /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Button, {
|
|
134
|
+
sx: {
|
|
135
|
+
ml: 0.5
|
|
136
|
+
},
|
|
137
|
+
size: "small",
|
|
138
|
+
variant: "contained",
|
|
139
|
+
color: "error",
|
|
140
|
+
onClick: logoutAll,
|
|
141
|
+
disabled: otherUserSessions.length === 0,
|
|
142
|
+
children: t("logoutAll")
|
|
143
|
+
})
|
|
144
|
+
}, "logoutAll"));
|
|
145
|
+
}
|
|
146
|
+
const tableOptions = (0, _ahooks.useCreation)(() => {
|
|
147
|
+
return {
|
|
148
|
+
// viewColumns: false,
|
|
149
|
+
search: false,
|
|
150
|
+
sort: false,
|
|
151
|
+
download: false,
|
|
152
|
+
filter: false,
|
|
153
|
+
print: false,
|
|
154
|
+
expandableRowsOnClick: false,
|
|
155
|
+
searchDebounceTime: 600
|
|
156
|
+
};
|
|
157
|
+
}, []);
|
|
158
|
+
const columns = [{
|
|
159
|
+
label: t("platform"),
|
|
160
|
+
name: "platform",
|
|
161
|
+
options: {
|
|
162
|
+
customBodyRenderLite: rawIndex => {
|
|
163
|
+
const x = safeData[rawIndex];
|
|
164
|
+
const result = parseUa(x.ua);
|
|
165
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
|
|
166
|
+
children: [result.os?.name, result.os?.version].filter(Boolean).join("/") || t("unknown")
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}, {
|
|
171
|
+
label: t("deviceType"),
|
|
172
|
+
name: "deviceType",
|
|
173
|
+
options: {
|
|
174
|
+
customBodyRenderLite: rawIndex => {
|
|
175
|
+
const x = safeData[rawIndex];
|
|
176
|
+
const result = parseUa(x.ua);
|
|
177
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
|
|
178
|
+
children: [result.browser?.name, result.browser?.version].filter(Boolean).join("/") || t("unknown")
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}, {
|
|
183
|
+
label: t("walletOS"),
|
|
184
|
+
name: "walletOS",
|
|
185
|
+
options: {
|
|
186
|
+
customBodyRenderLite: rawIndex => {
|
|
187
|
+
const x = safeData[rawIndex];
|
|
188
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
|
|
189
|
+
children: x.extra?.walletOS || t("unknown")
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}, showUser && {
|
|
194
|
+
label: t("user"),
|
|
195
|
+
name: "user",
|
|
196
|
+
options: {
|
|
197
|
+
customBodyRenderLite: rawIndex => {
|
|
198
|
+
const x = safeData[rawIndex];
|
|
199
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_userSessionInfo.default, {
|
|
200
|
+
sessionUser: x.user,
|
|
201
|
+
user
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}, {
|
|
206
|
+
label: t("updatedAt"),
|
|
207
|
+
name: "updatedAt",
|
|
208
|
+
options: {
|
|
209
|
+
customBodyRenderLite: rawIndex => {
|
|
210
|
+
const x = safeData[rawIndex];
|
|
211
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_RelativeTime.default, {
|
|
212
|
+
value: x.updatedAt,
|
|
213
|
+
relativeRange: 3 * 86400 * 1e3,
|
|
214
|
+
locale
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}, {
|
|
219
|
+
label: t("lastLoginIp"),
|
|
220
|
+
name: "lastLoginIp",
|
|
221
|
+
options: {
|
|
222
|
+
customBodyRenderLite: rawIndex => {
|
|
223
|
+
const x = safeData[rawIndex];
|
|
224
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
|
|
225
|
+
children: ipRegionMap[x.lastLoginIp] ? /* @__PURE__ */(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
226
|
+
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
|
|
227
|
+
variant: "body2",
|
|
228
|
+
children: ipRegionMap[x.lastLoginIp]
|
|
229
|
+
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
|
|
230
|
+
variant: "body2",
|
|
231
|
+
color: "grey",
|
|
232
|
+
children: x.lastLoginIp || t("unknown")
|
|
233
|
+
})]
|
|
234
|
+
}) : /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
|
|
235
|
+
children: x.lastLoginIp || t("unknown")
|
|
236
|
+
})
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}, showAction && {
|
|
241
|
+
label: t("actions"),
|
|
242
|
+
name: "actions",
|
|
243
|
+
options: {
|
|
244
|
+
customBodyRenderLite: rawIndex => {
|
|
245
|
+
const x = safeData[rawIndex];
|
|
246
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
|
|
247
|
+
children: /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Button, {
|
|
248
|
+
sx: {
|
|
249
|
+
whiteSpace: "nowrap",
|
|
250
|
+
fontSize: "12px",
|
|
251
|
+
px: 1
|
|
252
|
+
},
|
|
253
|
+
disabled: currentVisitorId === x.visitorId,
|
|
254
|
+
variant: "outlined",
|
|
255
|
+
size: "small",
|
|
256
|
+
color: "error",
|
|
257
|
+
onClick: () => logout({
|
|
258
|
+
visitorId: x.visitorId
|
|
259
|
+
}),
|
|
260
|
+
children: currentVisitorId === x.visitorId ? t("currentSession") : t("logout")
|
|
261
|
+
})
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}].filter(Boolean);
|
|
266
|
+
return /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
|
|
267
|
+
sx: {
|
|
268
|
+
".MuiTableCell-head": {
|
|
269
|
+
whiteSpace: "nowrap",
|
|
270
|
+
fontWeight: "bold"
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
children: [confirmHolder, /* @__PURE__ */(0, _jsxRuntime.jsx)(_Datatable.default, {
|
|
274
|
+
locale,
|
|
275
|
+
data: safeData,
|
|
276
|
+
columns,
|
|
277
|
+
customButtons,
|
|
278
|
+
options: tableOptions,
|
|
279
|
+
loading: pageState.loading
|
|
280
|
+
})]
|
|
281
|
+
});
|
|
282
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as UserSessions } from './components/user-sessions';
|