@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.
Files changed (104) hide show
  1. package/es/@types/index.d.ts +3 -5
  2. package/es/Dashboard/index.d.ts +5 -6
  3. package/es/Dashboard/index.js +5 -5
  4. package/es/Footer/index.js +2 -2
  5. package/es/Header/index.js +5 -5
  6. package/es/UserCenter/components/notification.js +1 -1
  7. package/es/UserCenter/components/passport.js +1 -2
  8. package/es/UserCenter/components/privacy.js +1 -1
  9. package/es/UserCenter/components/settings.js +9 -1
  10. package/es/UserCenter/components/storage/connect-to.d.ts +1 -1
  11. package/es/UserCenter/components/storage/connect-to.js +9 -3
  12. package/es/UserCenter/components/storage/delete.d.ts +1 -1
  13. package/es/UserCenter/components/storage/delete.js +4 -1
  14. package/es/UserCenter/components/storage/item.js +1 -1
  15. package/es/UserCenter/components/user-center.d.ts +2 -2
  16. package/es/UserCenter/components/user-center.js +15 -6
  17. package/es/UserCenter/libs/locales.d.ts +2 -0
  18. package/es/UserCenter/libs/locales.js +2 -0
  19. package/es/UserSessions/components/user-session-info.d.ts +6 -0
  20. package/es/UserSessions/components/user-session-info.js +58 -0
  21. package/es/UserSessions/components/user-sessions.d.ts +9 -0
  22. package/es/UserSessions/components/user-sessions.js +255 -0
  23. package/es/UserSessions/index.d.ts +1 -0
  24. package/es/UserSessions/index.js +1 -0
  25. package/es/UserSessions/libs/locales.d.ts +52 -0
  26. package/es/UserSessions/libs/locales.js +52 -0
  27. package/es/UserSessions/libs/utils.d.ts +2 -0
  28. package/es/UserSessions/libs/utils.js +73 -0
  29. package/es/blocklets.js +6 -6
  30. package/es/common/header-addons.d.ts +3 -4
  31. package/es/common/header-addons.js +4 -4
  32. package/es/contexts/config-user-space.js +2 -2
  33. package/es/index.d.ts +1 -0
  34. package/es/index.js +1 -0
  35. package/es/types.d.ts +2 -2
  36. package/es/types.js +2 -2
  37. package/lib/@types/index.d.ts +3 -5
  38. package/lib/Dashboard/index.d.ts +5 -6
  39. package/lib/Dashboard/index.js +4 -4
  40. package/lib/Footer/index.js +1 -1
  41. package/lib/Header/index.js +4 -4
  42. package/lib/UserCenter/components/notification.js +1 -1
  43. package/lib/UserCenter/components/passport.js +1 -2
  44. package/lib/UserCenter/components/privacy.js +1 -1
  45. package/lib/UserCenter/components/settings.js +10 -1
  46. package/lib/UserCenter/components/storage/connect-to.d.ts +1 -1
  47. package/lib/UserCenter/components/storage/connect-to.js +3 -3
  48. package/lib/UserCenter/components/storage/delete.d.ts +1 -1
  49. package/lib/UserCenter/components/storage/item.js +1 -1
  50. package/lib/UserCenter/components/user-center.d.ts +2 -2
  51. package/lib/UserCenter/components/user-center.js +20 -10
  52. package/lib/UserCenter/libs/locales.d.ts +2 -0
  53. package/lib/UserCenter/libs/locales.js +2 -0
  54. package/lib/UserSessions/components/user-session-info.d.ts +6 -0
  55. package/lib/UserSessions/components/user-session-info.js +68 -0
  56. package/lib/UserSessions/components/user-sessions.d.ts +9 -0
  57. package/lib/UserSessions/components/user-sessions.js +282 -0
  58. package/lib/UserSessions/index.d.ts +1 -0
  59. package/lib/UserSessions/index.js +13 -0
  60. package/lib/UserSessions/libs/locales.d.ts +52 -0
  61. package/lib/UserSessions/libs/locales.js +58 -0
  62. package/lib/UserSessions/libs/utils.d.ts +2 -0
  63. package/lib/UserSessions/libs/utils.js +80 -0
  64. package/lib/blocklets.js +6 -6
  65. package/lib/common/header-addons.d.ts +3 -4
  66. package/lib/common/header-addons.js +3 -3
  67. package/lib/contexts/config-user-space.js +1 -1
  68. package/lib/index.d.ts +1 -0
  69. package/lib/index.js +12 -0
  70. package/lib/types.d.ts +2 -2
  71. package/lib/types.js +3 -3
  72. package/package.json +14 -6
  73. package/src/@types/index.ts +3 -5
  74. package/src/Dashboard/index.jsx +7 -3
  75. package/src/Footer/index.jsx +2 -2
  76. package/src/Header/index.jsx +5 -3
  77. package/src/Icon/index.jsx +1 -0
  78. package/src/UserCenter/components/notification.tsx +2 -2
  79. package/src/UserCenter/components/passport.tsx +1 -2
  80. package/src/UserCenter/components/privacy.tsx +1 -1
  81. package/src/UserCenter/components/settings.tsx +15 -2
  82. package/src/UserCenter/components/storage/connect-to.tsx +17 -11
  83. package/src/UserCenter/components/storage/delete.tsx +8 -2
  84. package/src/UserCenter/components/storage/item.tsx +2 -3
  85. package/src/UserCenter/components/storage/preview-nft.tsx +1 -1
  86. package/src/UserCenter/components/user-center.tsx +21 -14
  87. package/src/UserCenter/components/webhook-item.tsx +1 -1
  88. package/src/UserCenter/libs/locales.ts +2 -0
  89. package/src/UserSessions/components/user-session-info.tsx +52 -0
  90. package/src/UserSessions/components/user-sessions.tsx +276 -0
  91. package/src/UserSessions/index.tsx +1 -0
  92. package/src/UserSessions/libs/locales.ts +52 -0
  93. package/src/UserSessions/libs/utils.ts +82 -0
  94. package/src/blocklets.js +6 -6
  95. package/src/common/header-addons.jsx +2 -2
  96. package/src/contexts/config-user-space.tsx +12 -11
  97. package/src/index.ts +1 -0
  98. package/src/{UserCenter/libs → libs}/client.ts +1 -0
  99. package/src/libs/spaces.tsx +2 -2
  100. package/src/types.js +2 -2
  101. /package/es/{UserCenter/libs → libs}/client.d.ts +0 -0
  102. /package/es/{UserCenter/libs → libs}/client.js +0 -0
  103. /package/lib/{UserCenter/libs → libs}/client.d.ts +0 -0
  104. /package/lib/{UserCenter/libs → libs}/client.js +0 -0
@@ -82,7 +82,7 @@ function Footer({
82
82
  });
83
83
  }
84
84
  Footer.propTypes = {
85
- meta: _types.blockletMetaProps,
85
+ meta: _types.BlockletMetaProps,
86
86
  // 允许覆盖 footer 内置的 theme
87
87
  theme: _propTypes.default.object
88
88
  };
@@ -72,7 +72,7 @@ const parseNavigation = navigation => {
72
72
  function Header({
73
73
  meta,
74
74
  addons,
75
- sessionManagerProps: sessionManagerProps2,
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: sessionManagerProps2
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.blockletMetaProps,
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.sessionManagerProps,
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("../libs/client");
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
@@ -40,9 +40,8 @@ function Passport({
40
40
  }
41
41
  if (a.revoked) {
42
42
  return 1;
43
- } else {
44
- return -1;
45
43
  }
44
+ return -1;
46
45
  });
47
46
  return (0, _uniqBy.default)(passportList, "role");
48
47
  }, [user?.passports]);
@@ -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("../libs/client");
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
- width: 520,
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, ...rest }: {
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?: object;
11
- readonly footerProps?: object;
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 _ = require("../../");
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("../libs/client");
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)(async () => {
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 await _client.client.user.getUserPublicInfo({
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
- }) : /* @__PURE__ */(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
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
- }) : /* @__PURE__ */(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
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)(_.Header, {
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)(_.Footer, {
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,6 @@
1
+ /// <reference types="react" />
2
+ import { User } from '../../@types';
3
+ export default function UserSessionInfo({ user, sessionUser }: {
4
+ readonly user: User;
5
+ readonly sessionUser: any;
6
+ }): import("react").JSX.Element;
@@ -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';