@arcblock/ux 2.8.25 → 2.9.0

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 (122) hide show
  1. package/es/Address/did-address.js +33 -21
  2. package/es/AnimationWaiter/index.js +2 -1
  3. package/es/Avatar/index.js +1 -1
  4. package/es/BlockletContext/index.js +1 -1
  5. package/es/CardSelector/index.js +2 -1
  6. package/es/Colors/index.js +2 -1
  7. package/es/Colors/themes/temp.js +17 -0
  8. package/es/Datatable/TableSearch.js +2 -1
  9. package/es/Header/header.js +0 -1
  10. package/es/Img/index.js +7 -6
  11. package/es/Locale/selector.js +15 -13
  12. package/es/NFTDisplay/index.js +2 -1
  13. package/es/QRCode/index.js +2 -1
  14. package/es/SessionBlocklet/index.js +169 -0
  15. package/es/SessionManager/index.js +2 -381
  16. package/es/SessionPermission/index.js +28 -0
  17. package/es/SessionUser/components/logged-in.js +224 -0
  18. package/es/SessionUser/components/session-user-item.js +148 -0
  19. package/es/SessionUser/components/session-user-switch.js +213 -0
  20. package/es/SessionUser/components/un-login.js +64 -0
  21. package/es/SessionUser/components/user-info.js +163 -0
  22. package/es/SessionUser/index.js +49 -0
  23. package/es/SessionUser/libs/translation.js +19 -0
  24. package/es/SessionUser/libs/utils.js +4 -0
  25. package/es/SplitButton/index.js +2 -1
  26. package/es/Toast/index.js +1 -1
  27. package/es/Util/constant.js +10 -0
  28. package/es/Util/index.js +11 -0
  29. package/lib/Address/did-address.js +36 -22
  30. package/lib/AnimationWaiter/index.js +2 -1
  31. package/lib/Avatar/index.js +1 -1
  32. package/lib/BlockletContext/index.js +1 -1
  33. package/lib/CardSelector/index.js +2 -1
  34. package/lib/Colors/index.js +7 -0
  35. package/lib/Colors/themes/temp.js +24 -0
  36. package/lib/Datatable/TableSearch.js +2 -1
  37. package/lib/Header/header.js +1 -1
  38. package/lib/Img/index.js +7 -6
  39. package/lib/Locale/selector.js +14 -13
  40. package/lib/NFTDisplay/index.js +2 -1
  41. package/lib/QRCode/index.js +2 -1
  42. package/lib/SessionBlocklet/index.js +187 -0
  43. package/lib/SessionManager/index.js +2 -390
  44. package/lib/SessionPermission/index.js +38 -0
  45. package/lib/SessionUser/components/logged-in.js +243 -0
  46. package/lib/SessionUser/components/session-user-item.js +163 -0
  47. package/lib/SessionUser/components/session-user-switch.js +232 -0
  48. package/lib/SessionUser/components/un-login.js +72 -0
  49. package/lib/SessionUser/components/user-info.js +175 -0
  50. package/lib/SessionUser/index.js +57 -0
  51. package/lib/SessionUser/libs/translation.js +26 -0
  52. package/lib/{SessionManager → SessionUser}/libs/utils.js +8 -1
  53. package/lib/SplitButton/index.js +2 -1
  54. package/lib/Toast/index.js +5 -5
  55. package/lib/Util/constant.js +26 -0
  56. package/lib/Util/index.js +16 -3
  57. package/package.json +19 -7
  58. package/src/Address/did-address.jsx +34 -20
  59. package/src/AnimationWaiter/index.js +2 -1
  60. package/src/Avatar/index.jsx +1 -1
  61. package/src/BlockletContext/index.jsx +1 -1
  62. package/src/CardSelector/index.jsx +2 -1
  63. package/src/Colors/index.js +1 -0
  64. package/src/Colors/themes/temp.js +18 -0
  65. package/src/Datatable/TableSearch.js +3 -1
  66. package/src/Header/header.jsx +0 -1
  67. package/src/Img/{index.js → index.jsx} +8 -6
  68. package/src/Locale/selector.jsx +11 -8
  69. package/src/NFTDisplay/index.js +2 -1
  70. package/src/QRCode/index.js +2 -1
  71. package/src/SessionBlocklet/index.jsx +181 -0
  72. package/src/SessionManager/index.jsx +2 -369
  73. package/src/SessionPermission/index.jsx +28 -0
  74. package/src/SessionUser/components/logged-in.jsx +194 -0
  75. package/src/SessionUser/components/session-user-item.jsx +96 -0
  76. package/src/SessionUser/components/session-user-switch.jsx +222 -0
  77. package/src/SessionUser/components/un-login.jsx +55 -0
  78. package/src/SessionUser/components/user-info.jsx +165 -0
  79. package/src/SessionUser/index.jsx +38 -0
  80. package/src/SessionUser/libs/translation.js +19 -0
  81. package/src/{SessionManager → SessionUser}/libs/utils.js +4 -0
  82. package/src/SplitButton/index.js +2 -1
  83. package/src/Toast/index.js +1 -1
  84. package/src/Util/constant.js +12 -0
  85. package/src/Util/index.js +13 -0
  86. package/es/SessionManager/components/account-item.js +0 -212
  87. package/es/SessionManager/components/add-account-item.js +0 -57
  88. package/es/SessionManager/components/federated-login-detecter.js +0 -183
  89. package/es/SessionManager/components/manage-accounts.js +0 -219
  90. package/es/SessionManager/components/manage-blocklet.js +0 -70
  91. package/es/SessionManager/components/menu-accordion.js +0 -103
  92. package/es/SessionManager/components/responsive-popper.js +0 -24
  93. package/es/SessionManager/components/user-drawer.js +0 -68
  94. package/es/SessionManager/components/user-info.js +0 -143
  95. package/es/SessionManager/components/user-popper.js +0 -110
  96. package/es/SessionManager/hooks/use-config.js +0 -34
  97. package/es/SessionManager/libs/translation.js +0 -52
  98. package/es/SessionManager/libs/utils.js +0 -2
  99. package/lib/SessionManager/components/account-item.js +0 -219
  100. package/lib/SessionManager/components/add-account-item.js +0 -66
  101. package/lib/SessionManager/components/federated-login-detecter.js +0 -193
  102. package/lib/SessionManager/components/manage-accounts.js +0 -232
  103. package/lib/SessionManager/components/manage-blocklet.js +0 -86
  104. package/lib/SessionManager/components/menu-accordion.js +0 -111
  105. package/lib/SessionManager/components/responsive-popper.js +0 -34
  106. package/lib/SessionManager/components/user-drawer.js +0 -75
  107. package/lib/SessionManager/components/user-info.js +0 -160
  108. package/lib/SessionManager/components/user-popper.js +0 -104
  109. package/lib/SessionManager/hooks/use-config.js +0 -41
  110. package/lib/SessionManager/libs/translation.js +0 -59
  111. package/src/SessionManager/components/account-item.jsx +0 -156
  112. package/src/SessionManager/components/add-account-item.jsx +0 -49
  113. package/src/SessionManager/components/federated-login-detecter.jsx +0 -167
  114. package/src/SessionManager/components/manage-accounts.jsx +0 -228
  115. package/src/SessionManager/components/manage-blocklet.jsx +0 -70
  116. package/src/SessionManager/components/menu-accordion.jsx +0 -93
  117. package/src/SessionManager/components/responsive-popper.jsx +0 -26
  118. package/src/SessionManager/components/user-drawer.jsx +0 -57
  119. package/src/SessionManager/components/user-info.jsx +0 -117
  120. package/src/SessionManager/components/user-popper.jsx +0 -95
  121. package/src/SessionManager/hooks/use-config.js +0 -33
  122. package/src/SessionManager/libs/translation.js +0 -52
@@ -1,381 +1,2 @@
1
- /* eslint-disable react/prop-types */
2
- /* eslint-disable react/jsx-no-bind */
3
- import { useEffect, useMemo, useRef, useState } from 'react';
4
- import PropTypes from 'prop-types';
5
- import { Box, IconButton, MenuList, Button, CircularProgress, Divider } from '@mui/material';
6
- import AccountIcon from '@arcblock/icons/lib/Account';
7
- import noop from 'lodash/noop';
8
- import cloneDeep from 'lodash/cloneDeep';
9
- import { useLatest, useMemoizedFn } from 'ahooks';
10
- import DidAvatar from '../Avatar';
11
- import { getUserAvatar, sleep } from '../Util';
12
- import FederatedLoginDetecter from './components/federated-login-detecter';
13
- import UserInfo from './components/user-info';
14
- import ResponsivePopper from './components/responsive-popper';
15
- import { translate } from '../Locale/util';
16
- import ManageAccounts from './components/manage-accounts';
17
- import ManageBlocklet from './components/manage-blocklet';
18
- import { translations } from './libs/translation';
19
- import { getConnectedAccounts, getSourceProvider } from './libs/utils';
20
- import useConfig from './hooks/use-config';
21
- import { getCurrentApp, getFederatedApp } from '../Util/federated';
22
- import { jsx as _jsx } from "react/jsx-runtime";
23
- import { jsxs as _jsxs } from "react/jsx-runtime";
24
- import { Fragment as _Fragment } from "react/jsx-runtime";
25
- function SessionManager({
26
- session,
27
- locale,
28
- showText,
29
- showRole,
30
- switchDid,
31
- switchProfile,
32
- switchPassport,
33
- disableLogout,
34
- onLogin,
35
- onLogout,
36
- onSwitchDid,
37
- onSwitchProfile,
38
- onSwitchPassport,
39
- onBindWallet,
40
- menu,
41
- menuRender,
42
- dark,
43
- size,
44
- showManageBlocklet,
45
- ...rest
46
- }) {
47
- const latestSession = useLatest(session);
48
- const {
49
- connectAccount,
50
- config,
51
- setConfig,
52
- deleteAccount
53
- } = useConfig();
54
- const t = useMemoizedFn((key, data = {}) => {
55
- return translate(translations, key, locale, 'en', data);
56
- });
57
- const userAnchorRef = useRef(null);
58
- const {
59
- logoutOAuth,
60
- switchOAuthPassport
61
- } = session.useOAuth();
62
- const [userOpen, setUserOpen] = useState(false);
63
-
64
- // base64 img maybe have some blank char, need encodeURIComponent to transform it
65
- const avatar = getUserAvatar(session.user?.avatar?.replace(/\s/g, encodeURIComponent(' ')));
66
- const isRawWalletAccount = getSourceProvider(session.user) === 'wallet';
67
- const connectedAccounts = getConnectedAccounts(session.user);
68
- const isFirstLoading = useMemo(() => {
69
- return session?.initialized === false && session?.loading === true;
70
- }, [session?.initialized, session?.loading]);
71
- let hasBindWallet = false;
72
- let hasBindAccount = false;
73
- if (isRawWalletAccount) {
74
- if (connectedAccounts.some(item => item.provider !== 'wallet')) {
75
- hasBindAccount = true;
76
- }
77
- hasBindWallet = true;
78
- } else if (connectedAccounts.some(item => item.provider === 'wallet')) {
79
- hasBindAccount = true;
80
- hasBindWallet = true;
81
- }
82
- const _connectAccount = useMemoizedFn(async () => {
83
- // HACK: 强制等待组件渲染一轮,以拿到最新的 session 值
84
- await sleep();
85
- if (!latestSession.current?.user) {
86
- return;
87
- }
88
- if (typeof window === 'undefined') {
89
- return;
90
- }
91
- const blocklet = window?.blocklet;
92
- const currentApp = getCurrentApp(blocklet);
93
- const masterApp = getFederatedApp(blocklet);
94
- const targetApp = latestSession.current.user.sourceAppPid ? masterApp : currentApp;
95
- if (targetApp) {
96
- const loginAccount = {
97
- ...targetApp,
98
- did: latestSession.current.user.did,
99
- avatar: latestSession.current.user.avatar,
100
- provider: latestSession.current.provider || targetApp.provider,
101
- walletOS: latestSession.current.walletOS
102
- };
103
- connectAccount(loginAccount);
104
- }
105
- });
106
-
107
- // HACK: 用于处理 统一登录 的自动登录情况,添加一个已连接的账号
108
- // 同时可用于以前的站点,会自动生成一个已连接的账号
109
- useEffect(() => {
110
- if (session.user) {
111
- _connectAccount();
112
- }
113
- // eslint-disable-next-line react-hooks/exhaustive-deps
114
- }, [session.user]);
115
- if (!session.user) {
116
- return /*#__PURE__*/_jsxs(_Fragment, {
117
- children: [showText ? /*#__PURE__*/_jsxs(Button, {
118
- ref: userAnchorRef,
119
- sx: [{
120
- borderRadius: '100vw'
121
- }, dark && {
122
- color: '#fff',
123
- borderColor: '#fff'
124
- }],
125
- variant: "outlined",
126
- onClick: _onLogin,
127
- role: "button",
128
- "aria-label": "Login button",
129
- ...rest,
130
- "data-cy": "sessionManager-login",
131
- children: [isFirstLoading ? /*#__PURE__*/_jsx(CircularProgress, {}) : /*#__PURE__*/_jsx(AccountIcon, {}), /*#__PURE__*/_jsx("span", {
132
- style: {
133
- lineHeight: '25px'
134
- },
135
- children: t('connect')
136
- })]
137
- }) : /*#__PURE__*/_jsx(IconButton, {
138
- ref: userAnchorRef,
139
- ...rest,
140
- onClick: _onLogin,
141
- "data-cy": "sessionManager-login",
142
- size: "medium",
143
- role: "button",
144
- "aria-label": "Login button",
145
- children: isFirstLoading ? /*#__PURE__*/_jsx(Box, {
146
- width: size,
147
- height: size,
148
- display: "flex",
149
- justifyContent: "center",
150
- alignItems: "center",
151
- children: /*#__PURE__*/_jsx(CircularProgress, {
152
- style: {
153
- width: size - 4,
154
- height: size - 4,
155
- color: dark ? '#fff' : ''
156
- }
157
- })
158
- }) : /*#__PURE__*/_jsx(AccountIcon, {
159
- style: {
160
- width: size,
161
- height: size,
162
- color: dark ? '#fff' : ''
163
- }
164
- })
165
- }), /*#__PURE__*/_jsx(FederatedLoginDetecter, {
166
- locale: locale,
167
- dark: dark,
168
- session: session,
169
- anchorEl: userAnchorRef.current
170
- })]
171
- });
172
- }
173
- function onToggleUser() {
174
- setUserOpen(prevOpen => !prevOpen);
175
- }
176
- function close() {
177
- setUserOpen(false);
178
- }
179
- function onCloseUser(e) {
180
- if (userAnchorRef.current && userAnchorRef.current.contains(e.target)) {
181
- return;
182
- }
183
- close();
184
- }
185
- function _onLogin() {
186
- if (!isFirstLoading) {
187
- session.login((...args) => {
188
- _connectAccount();
189
- onLogin(...args);
190
- });
191
- }
192
- }
193
- function _onLogout() {
194
- return new Promise((resolve, reject) => {
195
- logoutOAuth({
196
- session,
197
- hack: true
198
- }).catch(err => {
199
- console.error(err);
200
- reject(err);
201
- }).finally(() => {
202
- session.logout((...args) => {
203
- onLogout(...args);
204
- resolve();
205
- close();
206
- });
207
- });
208
- });
209
- }
210
- /**
211
- * @name 切换账户
212
- * @description 该功能仅在登录后才能使用,目前仅用于切换普通登录和统一登录的账户,所以会增加一些与统一登录相关的逻辑
213
- */
214
-
215
- function _onSwitchProfile() {
216
- session.switchProfile((...args) => {
217
- close();
218
- onSwitchProfile(...args);
219
- });
220
- }
221
- function _onSwitchPassport() {
222
- const {
223
- user,
224
- provider
225
- } = session;
226
- if (['auth0'].includes(provider)) {
227
- switchOAuthPassport(user);
228
- } else {
229
- close();
230
- session.switchPassport((...args) => {
231
- close();
232
- onSwitchPassport(...args);
233
- });
234
- }
235
- }
236
- return /*#__PURE__*/_jsxs(_Fragment, {
237
- children: [/*#__PURE__*/_jsx(IconButton, {
238
- ref: userAnchorRef,
239
- onClick: onToggleUser,
240
- ...rest,
241
- "data-cy": "sessionManager-logout-popup",
242
- size: "medium",
243
- role: "button",
244
- "aria-label": "User info button",
245
- style: {
246
- lineHeight: 1
247
- },
248
- children: /*#__PURE__*/_jsx(DidAvatar, {
249
- variant: "circle",
250
- did: session.user.did,
251
- src: avatar,
252
- size: size,
253
- shape: "circle"
254
- })
255
- }), /*#__PURE__*/_jsx(ResponsivePopper, {
256
- open: userOpen,
257
- onClose: onCloseUser,
258
- anchorEl: userAnchorRef.current,
259
- dark: dark,
260
- children: /*#__PURE__*/_jsxs(MenuList, {
261
- sx: {
262
- p: 0
263
- },
264
- children: [/*#__PURE__*/_jsx(UserInfo, {
265
- session: session,
266
- size: size,
267
- locale: locale,
268
- onSwitchProfile: () => {
269
- close();
270
- _onSwitchProfile();
271
- },
272
- onSwitchPassport: () => {
273
- close();
274
- _onSwitchPassport();
275
- },
276
- close: close,
277
- switchProfile: switchProfile,
278
- hasBindWallet: hasBindWallet
279
- }), /*#__PURE__*/_jsx(Divider, {}), /*#__PURE__*/_jsx(ManageAccounts, {
280
- session: session,
281
- locale: locale,
282
- onBindWallet: onBindWallet,
283
- onSwitchDid: onSwitchDid,
284
- connectAccount: _connectAccount,
285
- close: close,
286
- hasBindAccount: hasBindAccount,
287
- onLogout: _onLogout,
288
- expanded: config.expandAccount,
289
- onExpand: value => {
290
- const cloneConfig = cloneDeep(config);
291
- cloneConfig.expandAccount = value;
292
- setConfig(cloneConfig);
293
- },
294
- deleteAccount: deleteAccount,
295
- accounts: config.accounts
296
- }), showManageBlocklet ? [/*#__PURE__*/_jsx(Divider, {}, "divider"), /*#__PURE__*/_jsx(ManageBlocklet, {
297
- menu: menu,
298
- menuRender: menuRender,
299
- locale: locale,
300
- expanded: config.expandBlocklet,
301
- onExpand: value => {
302
- const cloneConfig = cloneDeep(config);
303
- cloneConfig.expandBlocklet = value;
304
- setConfig(cloneConfig);
305
- }
306
- }, "manageBlocklet")] : null]
307
- })
308
- })]
309
- });
310
- }
311
- SessionManager.propTypes = {
312
- session: PropTypes.shape({
313
- federatedMaster: PropTypes.object,
314
- provider: PropTypes.oneOf(['wallet', 'auth0', '']),
315
- user: PropTypes.shape({
316
- did: PropTypes.string.isRequired,
317
- role: PropTypes.string.isRequired,
318
- fullName: PropTypes.string,
319
- email: PropTypes.string,
320
- avatar: PropTypes.string,
321
- sourceProvider: PropTypes.string,
322
- connectedAccounts: PropTypes.arrayOf(PropTypes.shape({
323
- provider: PropTypes.string.isRequired,
324
- did: PropTypes.string.isRequired,
325
- id: PropTypes.string
326
- })),
327
- passports: PropTypes.arrayOf(PropTypes.shape({
328
- name: PropTypes.string.isRequired,
329
- title: PropTypes.string.isRequired
330
- })),
331
- // Deprecated
332
- extraConfigs: PropTypes.object
333
- }),
334
- login: PropTypes.func.isRequired,
335
- logout: PropTypes.func.isRequired,
336
- switchDid: PropTypes.func.isRequired,
337
- switchProfile: PropTypes.func.isRequired,
338
- switchPassport: PropTypes.func.isRequired,
339
- bindWallet: PropTypes.func.isRequired,
340
- refresh: PropTypes.func.isRequired
341
- }).isRequired,
342
- locale: PropTypes.string,
343
- showText: PropTypes.bool,
344
- showRole: PropTypes.bool,
345
- switchDid: PropTypes.bool,
346
- switchProfile: PropTypes.bool,
347
- switchPassport: PropTypes.bool,
348
- disableLogout: PropTypes.bool,
349
- onLogin: PropTypes.func,
350
- onLogout: PropTypes.func,
351
- onSwitchDid: PropTypes.func,
352
- onSwitchProfile: PropTypes.func,
353
- onSwitchPassport: PropTypes.func,
354
- onBindWallet: PropTypes.func,
355
- menu: PropTypes.array,
356
- menuRender: PropTypes.func,
357
- dark: PropTypes.bool,
358
- size: PropTypes.number,
359
- showManageBlocklet: PropTypes.bool
360
- };
361
- SessionManager.defaultProps = {
362
- locale: 'en',
363
- showText: false,
364
- showRole: false,
365
- switchDid: true,
366
- switchProfile: true,
367
- switchPassport: true,
368
- disableLogout: false,
369
- menu: [],
370
- menuRender: noop,
371
- onLogin: noop,
372
- onLogout: noop,
373
- onSwitchDid: noop,
374
- onSwitchProfile: noop,
375
- onSwitchPassport: noop,
376
- onBindWallet: noop,
377
- dark: false,
378
- size: 24,
379
- showManageBlocklet: true
380
- };
381
- export default SessionManager;
1
+ import SessionUser from '../SessionUser';
2
+ export default SessionUser;
@@ -0,0 +1,28 @@
1
+ import PropTypes from 'prop-types';
2
+ import { useCreation } from 'ahooks';
3
+ const roleList = ['owner', 'admin', 'member', 'guest'];
4
+ export default function SessionPermission({
5
+ session,
6
+ roles,
7
+ children
8
+ }) {
9
+ const hasPermission = useCreation(() => {
10
+ return roles.includes(session?.user?.role || 'guest');
11
+ }, [session?.user?.role, roles]);
12
+ if (typeof children === 'function') {
13
+ return children({
14
+ hasPermission
15
+ });
16
+ }
17
+ if (hasPermission) {
18
+ return children;
19
+ }
20
+ }
21
+ SessionPermission.propTypes = {
22
+ children: PropTypes.any.isRequired,
23
+ session: PropTypes.object.isRequired,
24
+ roles: PropTypes.arrayOf(PropTypes.oneOf(roleList))
25
+ };
26
+ SessionPermission.defaultProps = {
27
+ roles: ['owner', 'admin']
28
+ };
@@ -0,0 +1,224 @@
1
+ import PropTypes from 'prop-types';
2
+ import { useRef } from 'react';
3
+ import { useMemoizedFn, useReactive } from 'ahooks';
4
+ import { Box, ClickAwayListener, Divider, Fade, IconButton, MenuItem, MenuList, Paper, Popper } from '@mui/material';
5
+ import { Icon } from '@iconify/react';
6
+ import PersonOutlineRoundedIcon from '@iconify-icons/material-symbols/person-outline-rounded';
7
+ import FilterVintageOutlineRoundedIcon from '@iconify-icons/material-symbols/filter-vintage-outline-rounded';
8
+ import AccountCircleOffOutlineRoundedIcon from '@iconify-icons/material-symbols/account-circle-off-outline-rounded';
9
+ import noop from 'lodash/noop';
10
+ import DidAvatar from '../../Avatar';
11
+ import { getUserAvatar } from '../../Util';
12
+ import UserInfo from './user-info';
13
+ import { temp as colors } from '../../Colors';
14
+ import { DASHBOARD_URL, PROFILE_URL } from '../../Util/constant';
15
+ import SessionPermission from '../../SessionPermission';
16
+ import { translations } from '../libs/translation';
17
+ import { translate } from '../../Locale/util';
18
+ import { jsx as _jsx } from "react/jsx-runtime";
19
+ import { Fragment as _Fragment } from "react/jsx-runtime";
20
+ import { jsxs as _jsxs } from "react/jsx-runtime";
21
+ export default function LoggedIn({
22
+ session,
23
+ dark,
24
+ onBindWallet,
25
+ isBlocklet,
26
+ locale,
27
+ size
28
+ }) {
29
+ const t = useMemoizedFn((key, data = {}) => {
30
+ return translate(translations, key, locale, 'en', data);
31
+ });
32
+ const popperAnchorRef = useRef(null);
33
+ const currentState = useReactive({
34
+ open: false
35
+ });
36
+ const onTogglePopper = useMemoizedFn((value = !currentState.open) => {
37
+ currentState.open = value;
38
+ });
39
+ // base64 img maybe have some blank char, need encodeURIComponent to transform it
40
+ const avatar = getUserAvatar(session.user?.avatar?.replace(/\s/g, encodeURIComponent(' ')));
41
+ const handleSwitchPassport = useMemoizedFn(() => {
42
+ onTogglePopper(false);
43
+ session.switchPassport();
44
+ });
45
+ const handleSwitchAccount = useMemoizedFn(({
46
+ userSession
47
+ } = {}) => {
48
+ return new Promise(resolve => {
49
+ const options = {};
50
+ if (!userSession) {
51
+ onTogglePopper(false);
52
+ options.showQuickConnect = false;
53
+ } else {
54
+ options.userSession = userSession;
55
+ }
56
+ session.switchDid(() => {
57
+ onTogglePopper(false);
58
+ resolve();
59
+ }, {}, options);
60
+ });
61
+ });
62
+ const handleSwitchProfile = useMemoizedFn(() => {
63
+ onTogglePopper(false);
64
+ session.switchProfile();
65
+ });
66
+ const onLogout = useMemoizedFn(() => {
67
+ onTogglePopper(false);
68
+ session.logout();
69
+ });
70
+ const handleBindWallet = useMemoizedFn(() => {
71
+ onTogglePopper(false);
72
+ session.bindWallet(onBindWallet);
73
+ });
74
+ return /*#__PURE__*/_jsxs(_Fragment, {
75
+ children: [/*#__PURE__*/_jsx(IconButton, {
76
+ ref: popperAnchorRef,
77
+ onClick: () => onTogglePopper(),
78
+ size: "medium",
79
+ "data-cy": "sessionManager-logout-popup",
80
+ "aria-label": "User info button",
81
+ children: /*#__PURE__*/_jsx(DidAvatar, {
82
+ variant: "circle",
83
+ did: session.user.did,
84
+ src: avatar,
85
+ size: size,
86
+ shape: "circle"
87
+ })
88
+ }), /*#__PURE__*/_jsx(Popper, {
89
+ open: currentState.open,
90
+ onClose: () => onTogglePopper(false),
91
+ anchorEl: popperAnchorRef.current,
92
+ dark: dark,
93
+ transition: true,
94
+ placement: "bottom-end",
95
+ sx: {
96
+ zIndex: 1600
97
+ },
98
+ children: ({
99
+ TransitionProps
100
+ }) => /*#__PURE__*/_jsx(ClickAwayListener, {
101
+ onClickAway: e => {
102
+ e.preventDefault();
103
+ e.stopPropagation();
104
+ onTogglePopper(false);
105
+ },
106
+ children: /*#__PURE__*/_jsx(Fade, {
107
+ ...TransitionProps,
108
+ timeout: 350,
109
+ children: /*#__PURE__*/_jsxs(Paper, {
110
+ variant: "outlined",
111
+ sx: {
112
+ borderRadius: 3,
113
+ width: 350,
114
+ maxWidth: '90vw',
115
+ borderColor: colors.lineStep,
116
+ border: '0 !important',
117
+ boxShadow: `0px 8px 16px 0px ${colors.gray6}, 0px 0px 0px 1px ${colors.gray6}`
118
+ },
119
+ children: [/*#__PURE__*/_jsx(UserInfo, {
120
+ locale: locale,
121
+ isBlocklet: isBlocklet,
122
+ session: session,
123
+ onSwitchPassport: handleSwitchPassport,
124
+ onSwitchAccount: handleSwitchAccount,
125
+ onSwitchProfile: handleSwitchProfile,
126
+ onBindWallet: handleBindWallet
127
+ }), /*#__PURE__*/_jsxs(MenuList, {
128
+ sx: {
129
+ p: 0
130
+ },
131
+ children: [isBlocklet ? /*#__PURE__*/_jsxs(_Fragment, {
132
+ children: [/*#__PURE__*/_jsx(SessionPermission, {
133
+ session: session,
134
+ children: /*#__PURE__*/_jsx(SessionMenuItem, {
135
+ icon: FilterVintageOutlineRoundedIcon,
136
+ title: t('dashboard'),
137
+ component: "a",
138
+ href: DASHBOARD_URL,
139
+ sx: {
140
+ display: 'block',
141
+ textDecoration: 'none',
142
+ color: 'inherit'
143
+ }
144
+ })
145
+ }), /*#__PURE__*/_jsx(SessionMenuItem, {
146
+ icon: PersonOutlineRoundedIcon,
147
+ title: t('profile'),
148
+ component: "a",
149
+ href: PROFILE_URL,
150
+ sx: {
151
+ display: 'block',
152
+ textDecoration: 'none',
153
+ color: 'inherit'
154
+ }
155
+ }), /*#__PURE__*/_jsx(Divider, {
156
+ sx: {
157
+ m: '0!important',
158
+ borderColor: colors.lineStep
159
+ }
160
+ })]
161
+ }) : null, /*#__PURE__*/_jsx(SessionMenuItem, {
162
+ icon: AccountCircleOffOutlineRoundedIcon,
163
+ title: t('logout'),
164
+ sx: {
165
+ color: 'error.main'
166
+ },
167
+ onClick: onLogout,
168
+ "data-cy": "sessionManager-logout-trigger"
169
+ })]
170
+ })]
171
+ })
172
+ })
173
+ })
174
+ })]
175
+ });
176
+ }
177
+ LoggedIn.propTypes = {
178
+ session: PropTypes.object.isRequired,
179
+ onBindWallet: PropTypes.func,
180
+ dark: PropTypes.bool,
181
+ isBlocklet: PropTypes.bool,
182
+ locale: PropTypes.string,
183
+ size: PropTypes.number
184
+ };
185
+ LoggedIn.defaultProps = {
186
+ dark: false,
187
+ isBlocklet: true,
188
+ onBindWallet: noop,
189
+ locale: 'en',
190
+ size: 24
191
+ };
192
+ function SessionMenuItem({
193
+ icon,
194
+ title,
195
+ ...rest
196
+ }) {
197
+ return /*#__PURE__*/_jsx(Box, {
198
+ ...rest,
199
+ sx: {
200
+ p: 0.5,
201
+ ...rest?.sx
202
+ },
203
+ children: /*#__PURE__*/_jsxs(MenuItem, {
204
+ sx: {
205
+ display: 'flex',
206
+ gap: 1,
207
+ alignItems: 'center',
208
+ borderRadius: 2,
209
+ '&:hover': {
210
+ backgroundColor: `${colors.surfacePrimarySubtitle} !important`
211
+ },
212
+ py: 1
213
+ },
214
+ children: [/*#__PURE__*/_jsx(Icon, {
215
+ icon: icon,
216
+ fontSize: 24
217
+ }), title]
218
+ })
219
+ });
220
+ }
221
+ SessionMenuItem.propTypes = {
222
+ icon: PropTypes.string.isRequired,
223
+ title: PropTypes.string.isRequired
224
+ };