@arcblock/ux 2.6.9 → 2.7.1

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 (164) hide show
  1. package/babel.config.es.js +12 -0
  2. package/es/ActionButton/index.js +99 -0
  3. package/es/ActivityIndicator/index.js +180 -0
  4. package/es/Address/compact-text.js +105 -0
  5. package/es/Address/did-address.js +211 -0
  6. package/es/Address/index.js +23 -0
  7. package/es/Address/responsive-did-address.js +88 -0
  8. package/es/Alert/index.js +134 -0
  9. package/es/AnimationWaiter/default-animation.json +1 -0
  10. package/es/AnimationWaiter/index.js +239 -0
  11. package/es/Async/index.js +38 -0
  12. package/es/Avatar/did-motif.js +64 -0
  13. package/es/Avatar/etherscan-blockies.js +83 -0
  14. package/es/Avatar/index.js +176 -0
  15. package/es/Badge/index.js +98 -0
  16. package/es/Blocklet/blocklet.js +298 -0
  17. package/es/Blocklet/index.js +4 -0
  18. package/es/Blocklet/utils.js +52 -0
  19. package/es/BlockletNFT/index.js +412 -0
  20. package/es/Button/index.js +8 -0
  21. package/es/Button/wrap.js +140 -0
  22. package/es/ButtonGroup/index.js +6 -0
  23. package/es/CardSelector/index.js +131 -0
  24. package/es/Center/index.js +41 -0
  25. package/es/ClickToCopy/copy-button.js +72 -0
  26. package/es/ClickToCopy/hook.js +39 -0
  27. package/es/ClickToCopy/index.js +93 -0
  28. package/es/CodeBlock/LightBox.js +85 -0
  29. package/es/CodeBlock/index.js +226 -0
  30. package/es/Colors/index.js +2 -0
  31. package/es/Colors/themes/default.js +78 -0
  32. package/es/ContactForm/index.js +230 -0
  33. package/es/CookieConsent/index.js +113 -0
  34. package/es/CountDown/index.js +178 -0
  35. package/es/DID/index.js +105 -0
  36. package/es/Datatable/CustomToolbar.js +396 -0
  37. package/es/Datatable/DatatableContext.js +34 -0
  38. package/es/Datatable/TableSearch.js +165 -0
  39. package/es/Datatable/index.js +627 -0
  40. package/es/Datatable/utils.js +132 -0
  41. package/es/Dialog/confirm.js +90 -0
  42. package/es/Dialog/dialog.js +192 -0
  43. package/es/Dialog/index.js +3 -0
  44. package/es/DidLogo/index.js +31 -0
  45. package/es/DriftBot/index.js +70 -0
  46. package/es/Earth/countries.json +8057 -0
  47. package/es/Earth/index.js +521 -0
  48. package/es/Earth/util.js +51 -0
  49. package/es/Empty/index.js +64 -0
  50. package/es/ErrorBoundary/fallback.js +73 -0
  51. package/es/ErrorBoundary/index.js +1 -0
  52. package/es/Footer/index.js +172 -0
  53. package/es/Header/auto-hidden.js +35 -0
  54. package/es/Header/header.js +211 -0
  55. package/es/Header/index.js +2 -0
  56. package/es/Header/responsive-header.js +111 -0
  57. package/es/Icon/image.js +65 -0
  58. package/es/Icon/index.js +84 -0
  59. package/es/Img/index.js +217 -0
  60. package/es/InfoRow/index.js +87 -0
  61. package/es/Layout/dashboard/external-link.js +58 -0
  62. package/es/Layout/dashboard/full-page.js +53 -0
  63. package/es/Layout/dashboard/index.js +275 -0
  64. package/es/Layout/dashboard/sidebar.js +209 -0
  65. package/es/Layout/dashboard-legacy/header.js +174 -0
  66. package/es/Layout/dashboard-legacy/index.js +149 -0
  67. package/es/Layout/dashboard-legacy/sidebar.js +129 -0
  68. package/es/Layout/index.js +335 -0
  69. package/es/Locale/browser-lang.js +52 -0
  70. package/es/Locale/context.js +114 -0
  71. package/es/Locale/languages.js +60 -0
  72. package/es/Locale/selector.js +180 -0
  73. package/es/Locale/util.js +13 -0
  74. package/es/Logo/images/logo-dark-text.svg +3 -0
  75. package/es/Logo/images/logo-dark-top.svg +6 -0
  76. package/es/Logo/images/logo-light-text.svg +3 -0
  77. package/es/Logo/images/logo-light-top.svg +6 -0
  78. package/es/Logo/index.js +136 -0
  79. package/es/Metric/index.js +132 -0
  80. package/es/NFTDisplay/README.md +59 -0
  81. package/es/NFTDisplay/aspect-ratio-container.js +39 -0
  82. package/es/NFTDisplay/broken.js +18 -0
  83. package/es/NFTDisplay/demo/data/asset-state-display-url.json +7 -0
  84. package/es/NFTDisplay/demo/data/asset-state-gzipped-svg-1-1.json +10 -0
  85. package/es/NFTDisplay/demo/data/asset-state-gzipped-svg-374-130.json +10 -0
  86. package/es/NFTDisplay/demo/data/asset-state-gzipped-svg-with-foreign-object.json +20 -0
  87. package/es/NFTDisplay/demo/data/asset-state-svg.json +29 -0
  88. package/es/NFTDisplay/demo/data/asset-state-url.json +10 -0
  89. package/es/NFTDisplay/index.js +323 -0
  90. package/es/NFTDisplay/loading.js +18 -0
  91. package/es/NFTDisplay/svg-embedder/img.js +45 -0
  92. package/es/NFTDisplay/svg-embedder/inline-svg.js +39 -0
  93. package/es/NavMenu/index.js +2 -0
  94. package/es/NavMenu/nav-menu.js +286 -0
  95. package/es/NavMenu/style.js +176 -0
  96. package/es/PageScroller/index.js +286 -0
  97. package/es/PageScroller/story/FifthComponent.js +9 -0
  98. package/es/PageScroller/story/FirstComponent.js +9 -0
  99. package/es/PageScroller/story/FourthComponent.js +12 -0
  100. package/es/PageScroller/story/FullPage.js +47 -0
  101. package/es/PageScroller/story/PageContain.js +59 -0
  102. package/es/PageScroller/story/SecondComponent.js +9 -0
  103. package/es/PageScroller/story/ThirdComponent.js +9 -0
  104. package/es/PageScroller/story/index.css +115 -0
  105. package/es/PageScroller/usePrevValue.js +9 -0
  106. package/es/PricingTable/PricingPlan.js +124 -0
  107. package/es/PricingTable/index.js +53 -0
  108. package/es/QRCode/index.js +72 -0
  109. package/es/RelativeTime/index.js +98 -0
  110. package/es/Result/common.js +140 -0
  111. package/es/Result/demo/fixtures/result-image-404.svg +1 -0
  112. package/es/Result/index.js +33 -0
  113. package/es/Result/result.js +59 -0
  114. package/es/Result/translations.js +54 -0
  115. package/es/Screenshot/BaseScreenshot/index.js +91 -0
  116. package/es/Screenshot/BaseScreenshot/shells/Macbook.js +51 -0
  117. package/es/Screenshot/BaseScreenshot/shells/Phone.js +36 -0
  118. package/es/Screenshot/demo/images/bg-00.jpg +0 -0
  119. package/es/Screenshot/demo/images/bg-01.jpg +0 -0
  120. package/es/Screenshot/demo/images/bg-02.jpg +0 -0
  121. package/es/Screenshot/demo/images/bg-03.jpg +0 -0
  122. package/es/Screenshot/demo/images/bg-04.jpg +0 -0
  123. package/es/Screenshot/demo/images/bg-05.jpg +0 -0
  124. package/es/Screenshot/demo/images/bg-06.jpg +0 -0
  125. package/es/Screenshot/demo/images/bg-07.jpg +0 -0
  126. package/es/Screenshot/demo/images/bg-08.jpg +0 -0
  127. package/es/Screenshot/demo/images/bg-09.jpg +0 -0
  128. package/es/Screenshot/devices.css +1366 -0
  129. package/es/Screenshot/index.js +299 -0
  130. package/es/SessionManager/federated-login-detecter.js +166 -0
  131. package/es/SessionManager/index.js +468 -0
  132. package/es/SessionManager/user-popper.js +132 -0
  133. package/es/Sparkline/index.js +193 -0
  134. package/es/Spinner/index.js +28 -0
  135. package/es/SplitButton/index.js +144 -0
  136. package/es/Switch/index.js +96 -0
  137. package/es/Tabs/index.js +48 -0
  138. package/es/Tag/index.js +108 -0
  139. package/es/TextCollapse/index.js +92 -0
  140. package/es/Theme/index.js +16 -0
  141. package/es/Theme/theme-provider.js +39 -0
  142. package/es/Theme/theme.js +133 -0
  143. package/es/Toast/index.js +95 -0
  144. package/es/Util/deprecate.js +28 -0
  145. package/es/Util/index.js +298 -0
  146. package/es/Util/wallet.js +32 -0
  147. package/es/Video/index.js +89 -0
  148. package/es/Wallet/Action.js +119 -0
  149. package/es/Wallet/Download.js +331 -0
  150. package/es/Wallet/Open.js +45 -0
  151. package/es/Wallet/images/abtwallet.png +0 -0
  152. package/es/Wallet/images/android_download.svg +23 -0
  153. package/es/Wallet/images/app-store.svg +20 -0
  154. package/es/Wallet/images/google-play.svg +70 -0
  155. package/es/WebWalletSWKeeper/index.js +115 -0
  156. package/es/WechatPrompt/images/android.png +0 -0
  157. package/es/WechatPrompt/images/ios.png +0 -0
  158. package/es/WechatPrompt/index.js +88 -0
  159. package/es/index.js +38 -0
  160. package/es/withTheme/index.js +69 -0
  161. package/es/withTracker/README.md +34 -0
  162. package/es/withTracker/error_boundary.js +34 -0
  163. package/es/withTracker/index.js +56 -0
  164. package/package.json +272 -5
@@ -0,0 +1,468 @@
1
+ /* eslint-disable react/no-array-index-key */
2
+ /* eslint-disable react/jsx-no-bind */
3
+ import { useMemo, useRef, useState } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import IconButton from '@mui/material/IconButton';
6
+ import MenuList from '@mui/material/MenuList';
7
+ import MenuItem from '@mui/material/MenuItem';
8
+ import SvgIcon from '@mui/material/SvgIcon';
9
+ import Button from '@mui/material/Button';
10
+ import Chip from '@mui/material/Chip';
11
+ import Link from '@mui/material/Link';
12
+ import CircularProgress from '@mui/material/CircularProgress';
13
+ import SwitchProfileIcon from '@mui/icons-material/PersonOutline';
14
+ import BindWalletIcon from '@mui/icons-material/Link';
15
+ import SwitchPassportIcon from '@mui/icons-material/VpnKeyOutlined';
16
+ import ConnectWithoutContactIcon from '@mui/icons-material/ConnectWithoutContact';
17
+ import ShieldCheck from 'mdi-material-ui/ShieldCheck';
18
+ import AccountIcon from '@arcblock/icons/lib/Account';
19
+ import OpenInIcon from '@arcblock/icons/lib/OpenIn';
20
+ import DisconnectIcon from '@arcblock/icons/lib/Disconnect';
21
+ import SwitchDidIcon from '@arcblock/icons/lib/Switch';
22
+ import useBrowser from '@arcblock/react-hooks/lib/useBrowser';
23
+ import isEmpty from 'lodash/isEmpty';
24
+ import noop from 'lodash/noop';
25
+ import DidAvatar from '../Avatar';
26
+ import DidAddress from '../Address';
27
+ import { getUserAvatar } from '../Util';
28
+ import FederatedLoginDetecter from './federated-login-detecter';
29
+ import UserPopper from './user-popper';
30
+ import { jsx as _jsx } from "react/jsx-runtime";
31
+ import { jsxs as _jsxs } from "react/jsx-runtime";
32
+ import { Fragment as _Fragment } from "react/jsx-runtime";
33
+ const translations = {
34
+ en: {
35
+ switchDid: 'Switch DID',
36
+ switchProfile: 'Switch Profile',
37
+ switchPassport: 'Switch Passport',
38
+ disconnect: 'Disconnect',
39
+ connect: 'Connect',
40
+ openInWallet: 'Open DID Wallet',
41
+ alreadyBindOAuth: 'Already bind Auth0',
42
+ bind: 'Bind ',
43
+ thirdParty: 'Third Party Login',
44
+ connectedWith: 'Connected with'
45
+ },
46
+ zh: {
47
+ switchDid: '切换账户',
48
+ switchProfile: '切换用户信息',
49
+ switchPassport: '切换通行证',
50
+ disconnect: '退出',
51
+ connect: '登录',
52
+ openInWallet: '打开 DID 钱包',
53
+ // NOTE: 目前只有 Auth0,展示出具体的第三方名字会更好
54
+ alreadyBindOAuth: '已绑定 Auth0 账号',
55
+ bind: '绑定',
56
+ thirdParty: '第三方登录',
57
+ connectedWith: '连接至'
58
+ }
59
+ };
60
+ const getConnectedAccounts = user => user?.connectedAccounts || user?.extraConfigs?.connectedAccounts || [];
61
+ const getSourceProvider = user => user?.sourceProvider || user?.extraConfigs?.sourceProvider || 'wallet';
62
+ function SessionManager({
63
+ session,
64
+ locale,
65
+ showText,
66
+ showRole,
67
+ switchDid,
68
+ switchProfile,
69
+ switchPassport,
70
+ disableLogout,
71
+ onLogin,
72
+ onLogout,
73
+ onSwitchDid,
74
+ onSwitchProfile,
75
+ onSwitchPassport,
76
+ onBindWallet,
77
+ menu,
78
+ menuRender,
79
+ dark,
80
+ size,
81
+ ...rest
82
+ }) {
83
+ const translation = translations[locale] || translations.en;
84
+ const userAnchorRef = useRef(null);
85
+ // eslint-disable-next-line react/prop-types
86
+ const {
87
+ logoutOAuth,
88
+ bindOAuth,
89
+ configs: oauthConfigs,
90
+ switchOAuthPassport
91
+ } = session.useOAuth();
92
+ const [userOpen, setUserOpen] = useState(false);
93
+
94
+ // base64 img maybe have some blank char, need encodeURIComponent to transform it
95
+ const avatar = getUserAvatar(session.user?.avatar?.replace(/\s/g, encodeURIComponent(' ')));
96
+ const currentRole = useMemo(() => session.user?.passports?.find(item => item.name === session.user.role), [session.user]);
97
+ const browser = useBrowser();
98
+ // eslint-disable-next-line react/prop-types
99
+ const {
100
+ walletDid
101
+ } = session.useDid({
102
+ session
103
+ });
104
+ const isRawWalletAccount = getSourceProvider(session.user) === 'wallet';
105
+ const connectedAccounts = getConnectedAccounts(session.user);
106
+ const federatedAccount = connectedAccounts.find(item => item.provider === 'federated');
107
+ let hasBindWallet = false;
108
+ let hasBindAccount = false;
109
+ if (isRawWalletAccount) {
110
+ if (connectedAccounts.some(item => item.provider !== 'wallet')) {
111
+ hasBindAccount = true;
112
+ }
113
+ hasBindWallet = true;
114
+ } else if (connectedAccounts.some(item => item.provider === 'wallet')) {
115
+ hasBindAccount = true;
116
+ hasBindWallet = true;
117
+ }
118
+ const oauthConfigList = Object.entries(oauthConfigs).map(([key, value]) => {
119
+ return {
120
+ ...value,
121
+ provider: key
122
+ };
123
+ }).filter(item => item.enabled);
124
+ const isFirstLoading = useMemo(() => {
125
+ // eslint-disable-next-line react/prop-types
126
+ return session?.initialized === false && session?.loading === true;
127
+ // eslint-disable-next-line react/prop-types
128
+ }, [session?.initialized, session?.loading]);
129
+ const masterSiteInfo = window.blocklet?.settings?.federated?.master;
130
+ if (!session.user) {
131
+ return /*#__PURE__*/_jsxs(_Fragment, {
132
+ children: [showText ? /*#__PURE__*/_jsxs(Button, {
133
+ ref: userAnchorRef,
134
+ sx: [{
135
+ borderRadius: '100vw'
136
+ }, dark && {
137
+ color: '#fff',
138
+ borderColor: '#fff'
139
+ }],
140
+ variant: "outlined",
141
+ onClick: _onLogin,
142
+ "aria-label": "login button",
143
+ ...rest,
144
+ "data-cy": "sessionManager-login",
145
+ children: [isFirstLoading ? /*#__PURE__*/_jsx(CircularProgress, {}) : /*#__PURE__*/_jsx(AccountIcon, {}), /*#__PURE__*/_jsx("span", {
146
+ style: {
147
+ lineHeight: '25px'
148
+ },
149
+ children: translation.connect
150
+ })]
151
+ }) : /*#__PURE__*/_jsx(IconButton, {
152
+ ref: userAnchorRef,
153
+ ...rest,
154
+ onClick: _onLogin,
155
+ "data-cy": "sessionManager-login",
156
+ size: "medium",
157
+ children: isFirstLoading ? /*#__PURE__*/_jsx(CircularProgress, {
158
+ style: {
159
+ width: size - 4,
160
+ height: size - 4,
161
+ color: dark ? '#fff' : ''
162
+ }
163
+ }) : /*#__PURE__*/_jsx(AccountIcon, {
164
+ style: {
165
+ width: size,
166
+ height: size,
167
+ color: dark ? '#fff' : ''
168
+ }
169
+ })
170
+ }), /*#__PURE__*/_jsx(FederatedLoginDetecter, {
171
+ locale: locale,
172
+ dark: dark,
173
+ session: session,
174
+ anchorEl: userAnchorRef.current
175
+ })]
176
+ });
177
+ }
178
+ function onToggleUser() {
179
+ setUserOpen(prevOpen => !prevOpen);
180
+ }
181
+ function onCloseUser(e) {
182
+ if (userAnchorRef.current && userAnchorRef.current.contains(e.target)) {
183
+ return;
184
+ }
185
+ setUserOpen(false);
186
+ }
187
+ function _onLogin() {
188
+ if (!isFirstLoading) {
189
+ session.login(onLogin);
190
+ }
191
+ }
192
+ function _onLogout() {
193
+ session.logout((...args) => {
194
+ logoutOAuth({
195
+ session
196
+ }, ...args).then(() => {
197
+ onLogout(...args);
198
+ }).catch(err => {
199
+ console.error(err);
200
+ }).finally(() => {
201
+ setUserOpen(false);
202
+ });
203
+ });
204
+ }
205
+ function _onSwitchDid() {
206
+ session.switchDid((...args) => {
207
+ setUserOpen(false);
208
+ onSwitchDid(...args);
209
+ });
210
+ }
211
+ function _onSwitchProfile() {
212
+ session.switchProfile((...args) => {
213
+ setUserOpen(false);
214
+ onSwitchProfile(...args);
215
+ });
216
+ }
217
+ function _onSwitchPassport() {
218
+ const {
219
+ user,
220
+ provider
221
+ } = session;
222
+ if (!isRawWalletAccount && provider !== 'federated') {
223
+ switchOAuthPassport(user);
224
+ } else {
225
+ setUserOpen(false);
226
+ session.switchPassport((...args) => {
227
+ setUserOpen(false);
228
+ onSwitchPassport(...args);
229
+ });
230
+ }
231
+ }
232
+ function _onBindWallet() {
233
+ setUserOpen(false);
234
+ // FIXME: @zhanghan 暂时切换回 isRawWalletAccount 的方式来判断,在 did-connect 改版时,简化这里的关系判断
235
+ if (!isRawWalletAccount) {
236
+ session.bindWallet((...args) => {
237
+ setUserOpen(false);
238
+ onBindWallet(...args);
239
+ });
240
+ } else {
241
+ bindOAuth();
242
+ }
243
+ }
244
+ return /*#__PURE__*/_jsxs(_Fragment, {
245
+ children: [/*#__PURE__*/_jsx(IconButton, {
246
+ ref: userAnchorRef,
247
+ onClick: onToggleUser,
248
+ ...rest,
249
+ "data-cy": "sessionManager-logout-popup",
250
+ size: "medium",
251
+ style: {
252
+ lineHeight: 1
253
+ },
254
+ children: /*#__PURE__*/_jsx(DidAvatar, {
255
+ variant: "circle",
256
+ did: session.user.did,
257
+ src: avatar,
258
+ size: size,
259
+ shape: "circle"
260
+ })
261
+ }), /*#__PURE__*/_jsx(UserPopper, {
262
+ open: userOpen,
263
+ onClose: onCloseUser,
264
+ anchorEl: userAnchorRef.current,
265
+ dark: dark,
266
+ children: /*#__PURE__*/_jsxs(MenuList, {
267
+ sx: {
268
+ p: 0
269
+ },
270
+ children: [/*#__PURE__*/_jsxs("div", {
271
+ className: "session-manager-user",
272
+ children: [/*#__PURE__*/_jsxs("div", {
273
+ className: "session-manager-user-name",
274
+ children: [/*#__PURE__*/_jsx("span", {
275
+ children: session.user.fullName
276
+ }), !!showRole && (currentRole?.title || session.user?.role.toUpperCase()) && /*#__PURE__*/_jsx(Chip, {
277
+ label: currentRole?.title || session.user?.role.toUpperCase(),
278
+ size: "small",
279
+ variant: "outlined",
280
+ sx: {
281
+ height: 'auto',
282
+ marginRight: 0
283
+ },
284
+ icon: /*#__PURE__*/_jsx(SvgIcon, {
285
+ component: ShieldCheck,
286
+ size: "small"
287
+ })
288
+ })]
289
+ }), /*#__PURE__*/_jsxs("div", {
290
+ className: "session-manager-id-list",
291
+ children: [walletDid && /*#__PURE__*/_jsx("div", {
292
+ className: "session-manager-id-item",
293
+ children: /*#__PURE__*/_jsx(DidAddress, {
294
+ responsive: false,
295
+ children: walletDid
296
+ })
297
+ }), federatedAccount && /*#__PURE__*/_jsx("div", {
298
+ className: "session-manager-id-item",
299
+ children: /*#__PURE__*/_jsx(DidAddress, {
300
+ responsive: false,
301
+ children: federatedAccount.did
302
+ })
303
+ }), session?.user?.email && /*#__PURE__*/_jsx("div", {
304
+ className: "session-manager-id-item",
305
+ children: /*#__PURE__*/_jsx(DidAddress, {
306
+ responsive: false,
307
+ children: session.user.email
308
+ })
309
+ })]
310
+ })]
311
+ }), federatedAccount && !isEmpty(masterSiteInfo) && /*#__PURE__*/_jsxs(MenuItem, {
312
+ className: "session-manager-menu-item",
313
+ "data-cy": "sessionManager-connectWithFederated",
314
+ children: [/*#__PURE__*/_jsx(SvgIcon, {
315
+ component: ConnectWithoutContactIcon,
316
+ className: "session-manager-menu-icon"
317
+ }), translation.connectedWith, /*#__PURE__*/_jsx(Link, {
318
+ ml: 1,
319
+ href: masterSiteInfo.appUrl,
320
+ underline: "hover",
321
+ target: "_blank",
322
+ children: masterSiteInfo.appName
323
+ })]
324
+ }), Array.isArray(menu) && menu.map((menuItem, index) => {
325
+ const {
326
+ svgIcon,
327
+ ...menuProps
328
+ } = menuItem;
329
+ return /*#__PURE__*/_jsxs(MenuItem, {
330
+ className: "session-manager-menu-item",
331
+ ...menuProps,
332
+ icon: undefined,
333
+ label: undefined,
334
+ children: [svgIcon ? svgIcon && /*#__PURE__*/_jsx(SvgIcon, {
335
+ component: svgIcon,
336
+ className: "session-manager-menu-icon"
337
+ }) : menuItem.icon, menuItem.label]
338
+ }, index);
339
+ }), menuRender({
340
+ classes: {
341
+ menuItem: 'session-manager-menu-item',
342
+ menuIcon: 'session-manager-menu-icon'
343
+ }
344
+ }), !browser.wallet && /*#__PURE__*/_jsxs(MenuItem, {
345
+ component: "a",
346
+ className: "session-manager-menu-item",
347
+ "data-cy": "sessionManager-openInWallet",
348
+ href: "https://www.abtwallet.io/",
349
+ target: "_blank",
350
+ children: [/*#__PURE__*/_jsx(SvgIcon, {
351
+ component: OpenInIcon,
352
+ className: "session-manager-menu-icon"
353
+ }), translation.openInWallet]
354
+ }), !!switchDid && /*#__PURE__*/_jsxs(MenuItem, {
355
+ className: "session-manager-menu-item",
356
+ onClick: _onSwitchDid,
357
+ "data-cy": "sessionManager-switch-trigger",
358
+ children: [/*#__PURE__*/_jsx(SvgIcon, {
359
+ component: SwitchDidIcon,
360
+ className: "session-manager-menu-icon"
361
+ }), translation.switchDid]
362
+ }), !!switchProfile && hasBindWallet && session.provider !== 'federated' && /*#__PURE__*/_jsxs(MenuItem, {
363
+ className: "session-manager-menu-item",
364
+ onClick: _onSwitchProfile,
365
+ "data-cy": "sessionManager-switch-profile-trigger",
366
+ children: [/*#__PURE__*/_jsx(SvgIcon, {
367
+ component: SwitchProfileIcon,
368
+ className: "session-manager-menu-icon"
369
+ }), translation.switchProfile]
370
+ }), !!switchPassport && /*#__PURE__*/_jsxs(MenuItem, {
371
+ className: "session-manager-menu-item",
372
+ onClick: _onSwitchPassport,
373
+ "data-cy": "sessionManager-switch-passport-trigger",
374
+ children: [/*#__PURE__*/_jsx(SvgIcon, {
375
+ component: SwitchPassportIcon,
376
+ className: "session-manager-menu-icon"
377
+ }), translation.switchPassport]
378
+ }), oauthConfigList.length > 0 && !hasBindAccount && session.provider !== 'federated' && /*#__PURE__*/_jsxs(MenuItem, {
379
+ className: "session-manager-menu-item",
380
+ onClick: _onBindWallet,
381
+ "data-cy": "sessionManager-bind-trigger",
382
+ children: [/*#__PURE__*/_jsx(SvgIcon, {
383
+ component: BindWalletIcon,
384
+ className: "session-manager-menu-icon"
385
+ }), !isRawWalletAccount ? `${translation.bind}DID Wallet` : `${translation.bind}${translation.thirdParty}`]
386
+ }), /*#__PURE__*/_jsxs(MenuItem, {
387
+ className: "session-manager-menu-item",
388
+ onClick: _onLogout,
389
+ disabled: disableLogout,
390
+ "data-cy": "sessionManager-logout-trigger",
391
+ children: [/*#__PURE__*/_jsx(SvgIcon, {
392
+ component: DisconnectIcon,
393
+ className: "session-manager-menu-icon"
394
+ }), translation.disconnect]
395
+ })]
396
+ })
397
+ })]
398
+ });
399
+ }
400
+ SessionManager.propTypes = {
401
+ session: PropTypes.shape({
402
+ federatedMaster: PropTypes.object,
403
+ provider: PropTypes.oneOf(['wallet', 'federated', 'auth0', '']),
404
+ user: PropTypes.shape({
405
+ did: PropTypes.string.isRequired,
406
+ role: PropTypes.string.isRequired,
407
+ fullName: PropTypes.string,
408
+ email: PropTypes.string,
409
+ avatar: PropTypes.string,
410
+ sourceProvider: PropTypes.string,
411
+ connectedAccounts: PropTypes.arrayOf(PropTypes.shape({
412
+ provider: PropTypes.string.isRequired,
413
+ did: PropTypes.string.isRequired,
414
+ id: PropTypes.string
415
+ })),
416
+ passports: PropTypes.arrayOf(PropTypes.shape({
417
+ name: PropTypes.string.isRequired,
418
+ title: PropTypes.string.isRequired
419
+ })),
420
+ // Deprecated
421
+ extraConfigs: PropTypes.object
422
+ }),
423
+ login: PropTypes.func.isRequired,
424
+ logout: PropTypes.func.isRequired,
425
+ switchDid: PropTypes.func.isRequired,
426
+ switchProfile: PropTypes.func.isRequired,
427
+ switchPassport: PropTypes.func.isRequired,
428
+ bindWallet: PropTypes.func.isRequired,
429
+ refresh: PropTypes.func.isRequired
430
+ }).isRequired,
431
+ locale: PropTypes.string,
432
+ showText: PropTypes.bool,
433
+ showRole: PropTypes.bool,
434
+ switchDid: PropTypes.bool,
435
+ switchProfile: PropTypes.bool,
436
+ switchPassport: PropTypes.bool,
437
+ disableLogout: PropTypes.bool,
438
+ onLogin: PropTypes.func,
439
+ onLogout: PropTypes.func,
440
+ onSwitchDid: PropTypes.func,
441
+ onSwitchProfile: PropTypes.func,
442
+ onSwitchPassport: PropTypes.func,
443
+ onBindWallet: PropTypes.func,
444
+ menu: PropTypes.array,
445
+ menuRender: PropTypes.func,
446
+ dark: PropTypes.bool,
447
+ size: PropTypes.number
448
+ };
449
+ SessionManager.defaultProps = {
450
+ locale: 'en',
451
+ showText: false,
452
+ showRole: false,
453
+ switchDid: true,
454
+ switchProfile: true,
455
+ switchPassport: true,
456
+ disableLogout: false,
457
+ menu: [],
458
+ menuRender: noop,
459
+ onLogin: noop,
460
+ onLogout: noop,
461
+ onSwitchDid: noop,
462
+ onSwitchProfile: noop,
463
+ onSwitchPassport: noop,
464
+ onBindWallet: noop,
465
+ dark: false,
466
+ size: 24
467
+ };
468
+ export default SessionManager;
@@ -0,0 +1,132 @@
1
+ import PropTypes from 'prop-types';
2
+ import ClickAwayListener from '@mui/material/ClickAwayListener';
3
+ import Paper from '@mui/material/Paper';
4
+ import Popper from '@mui/material/Popper';
5
+ import { styled } from '../Theme';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ export default function UserPopper({
8
+ anchorEl,
9
+ dark,
10
+ children,
11
+ open,
12
+ onClose
13
+ }) {
14
+ return anchorEl && /*#__PURE__*/_jsx(StyledPopper, {
15
+ open: open,
16
+ disablePortal: true,
17
+ anchorEl: anchorEl,
18
+ placement: "bottom-end",
19
+ $dark: dark,
20
+ children: /*#__PURE__*/_jsx(Paper, {
21
+ sx: [theme => ({
22
+ borderColor: '#F0F0F0',
23
+ boxShadow: '0px 8px 12px rgba(92, 92, 92, 0.04)',
24
+ borderRadius: theme.spacing(2),
25
+ overflow: 'hidden',
26
+ maxWidth: 'calc(100vw - 10px)',
27
+ '& .MuiChip-root .MuiChip-icon': {
28
+ color: theme.palette.success.main
29
+ }
30
+ }), dark && {
31
+ backgroundColor: '#27282c',
32
+ color: '#fff',
33
+ border: 0,
34
+ '& .MuiChip-root': {
35
+ borderColor: '#aaa'
36
+ },
37
+ '& .MuiListItem-root, & .MuiChip-label': {
38
+ color: '#aaa'
39
+ },
40
+ '& .MuiListItem-root:hover': {
41
+ backgroundColor: '#363434'
42
+ }
43
+ }],
44
+ variant: "outlined",
45
+ children: /*#__PURE__*/_jsx(ClickAwayListener, {
46
+ onClickAway: onClose,
47
+ children: children
48
+ })
49
+ })
50
+ });
51
+ }
52
+ UserPopper.propTypes = {
53
+ anchorEl: PropTypes.instanceOf(Element),
54
+ dark: PropTypes.bool,
55
+ open: PropTypes.bool,
56
+ children: PropTypes.any.isRequired,
57
+ onClose: PropTypes.func
58
+ };
59
+ UserPopper.defaultProps = {
60
+ anchorEl: null,
61
+ dark: false,
62
+ open: false,
63
+ onClose: () => {}
64
+ };
65
+ const StyledPopper = styled(Popper)`
66
+ z-index: ${({
67
+ theme
68
+ }) => theme.zIndex.tooltip};
69
+ .MuiList-root {
70
+ /* HACK: 需要288px 才能将 did 展示完整 */
71
+ width: 290px;
72
+ }
73
+ .session-manager-user {
74
+ font-size: 12px;
75
+ flex-direction: column;
76
+ align-items: flex-start;
77
+ padding: 24px 24px 10px;
78
+ }
79
+ .session-manager-user-name {
80
+ font-size: 20px;
81
+ color: ${({
82
+ $dark
83
+ }) => $dark ? '#aaa' : '#222'};
84
+ font-weight: bold;
85
+ margin-bottom: 10px;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: space-between;
89
+ }
90
+ .session-manager-id-item {
91
+ position: relative;
92
+ padding-left: 8px;
93
+ /* HACK: 当前元素既是第一个,也是最后一个,即只有一个同级元素 */
94
+ &:first-of-type:last-of-type {
95
+ padding-left: 0;
96
+ &:before,
97
+ &:after {
98
+ content: unset;
99
+ }
100
+ }
101
+ &:before {
102
+ position: absolute;
103
+ content: '';
104
+ left: 0px;
105
+ top: 50%;
106
+ width: 6px;
107
+ height: 1px;
108
+ background-color: #aeaeae;
109
+ }
110
+ &:not(:last-of-type):after {
111
+ position: absolute;
112
+ content: '';
113
+ left: 0px;
114
+ top: 50%;
115
+ height: 100%;
116
+ width: 1px;
117
+ background-color: #aeaeae;
118
+ }
119
+ }
120
+ .session-manager-menu-item {
121
+ padding: 18.5px 24px;
122
+ color: #777;
123
+ font-size: 16px;
124
+ &:hover {
125
+ background-color: #fbfbfb;
126
+ }
127
+ }
128
+ .session-manager-menu-icon {
129
+ color: #999;
130
+ margin-right: 16px;
131
+ }
132
+ `;