@blocklet/ui-react 3.4.14 → 3.5.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 (256) hide show
  1. package/lib/common/org-switch/use-org.d.ts +4 -4
  2. package/lib/common/ws.d.ts +22 -1
  3. package/package.json +10 -7
  4. package/.aigne/doc-smith/.local/afs-storage.sqlite3 +0 -0
  5. package/.aigne/doc-smith/config.yaml +0 -78
  6. package/.aigne/doc-smith/history.yaml +0 -14
  7. package/.aigne/doc-smith/media-description.yaml +0 -11
  8. package/.aigne/doc-smith/output/structure-plan.json +0 -255
  9. package/.aigne/doc-smith/translation-cache.yaml +0 -11
  10. package/.aigne/doc-smith/upload-cache.yaml +0 -528
  11. package/build.config.ts +0 -24
  12. package/docs/_sidebar.md +0 -19
  13. package/docs/assets/diagram/component-installer-diagram-0.ja.jpg +0 -0
  14. package/docs/assets/diagram/component-installer-diagram-0.jpg +0 -0
  15. package/docs/assets/diagram/component-installer-diagram-0.zh-TW.jpg +0 -0
  16. package/docs/assets/diagram/component-installer-diagram-0.zh.jpg +0 -0
  17. package/docs/assets/diagram/component-management-diagram-0.ja.jpg +0 -0
  18. package/docs/assets/diagram/component-management-diagram-0.jpg +0 -0
  19. package/docs/assets/diagram/component-management-diagram-0.zh-TW.jpg +0 -0
  20. package/docs/assets/diagram/component-management-diagram-0.zh.jpg +0 -0
  21. package/docs/assets/diagram/core-concepts-diagram-0.ja.jpg +0 -0
  22. package/docs/assets/diagram/core-concepts-diagram-0.jpg +0 -0
  23. package/docs/assets/diagram/core-concepts-diagram-0.zh-TW.jpg +0 -0
  24. package/docs/assets/diagram/core-concepts-diagram-0.zh.jpg +0 -0
  25. package/docs/assets/diagram/dashboard-diagram-0.ja.jpg +0 -0
  26. package/docs/assets/diagram/dashboard-diagram-0.jpg +0 -0
  27. package/docs/assets/diagram/dashboard-diagram-0.zh-TW.jpg +0 -0
  28. package/docs/assets/diagram/dashboard-diagram-0.zh.jpg +0 -0
  29. package/docs/assets/diagram/header-diagram-0.ja.jpg +0 -0
  30. package/docs/assets/diagram/header-diagram-0.jpg +0 -0
  31. package/docs/assets/diagram/header-diagram-0.zh-TW.jpg +0 -0
  32. package/docs/assets/diagram/header-diagram-0.zh.jpg +0 -0
  33. package/docs/assets/diagram/layout-diagram-0.ja.jpg +0 -0
  34. package/docs/assets/diagram/layout-diagram-0.jpg +0 -0
  35. package/docs/assets/diagram/layout-diagram-0.zh-TW.jpg +0 -0
  36. package/docs/assets/diagram/layout-diagram-0.zh.jpg +0 -0
  37. package/docs/assets/diagram/notifications-diagram-0.ja.jpg +0 -0
  38. package/docs/assets/diagram/notifications-diagram-0.jpg +0 -0
  39. package/docs/assets/diagram/notifications-diagram-0.zh-TW.jpg +0 -0
  40. package/docs/assets/diagram/notifications-diagram-0.zh.jpg +0 -0
  41. package/docs/assets/diagram/overview-diagram-0.ja.jpg +0 -0
  42. package/docs/assets/diagram/overview-diagram-0.jpg +0 -0
  43. package/docs/assets/diagram/overview-diagram-0.zh-TW.jpg +0 -0
  44. package/docs/assets/diagram/overview-diagram-0.zh.jpg +0 -0
  45. package/docs/assets/diagram/user-center-diagram-0.ja.jpg +0 -0
  46. package/docs/assets/diagram/user-center-diagram-0.jpg +0 -0
  47. package/docs/assets/diagram/user-center-diagram-0.zh-TW.jpg +0 -0
  48. package/docs/assets/diagram/user-center-diagram-0.zh.jpg +0 -0
  49. package/docs/assets/diagram/user-management-diagram-0.ja.jpg +0 -0
  50. package/docs/assets/diagram/user-management-diagram-0.jpg +0 -0
  51. package/docs/assets/diagram/user-management-diagram-0.zh-TW.jpg +0 -0
  52. package/docs/assets/diagram/user-management-diagram-0.zh.jpg +0 -0
  53. package/docs/assets/diagram/user-sessions-diagram-0.ja.jpg +0 -0
  54. package/docs/assets/diagram/user-sessions-diagram-0.jpg +0 -0
  55. package/docs/assets/diagram/user-sessions-diagram-0.zh-TW.jpg +0 -0
  56. package/docs/assets/diagram/user-sessions-diagram-0.zh.jpg +0 -0
  57. package/docs/components-component-management-blocklet-studio.ja.md +0 -194
  58. package/docs/components-component-management-blocklet-studio.md +0 -194
  59. package/docs/components-component-management-blocklet-studio.zh-TW.md +0 -194
  60. package/docs/components-component-management-blocklet-studio.zh.md +0 -194
  61. package/docs/components-component-management-component-installer.ja.md +0 -182
  62. package/docs/components-component-management-component-installer.md +0 -182
  63. package/docs/components-component-management-component-installer.zh-TW.md +0 -182
  64. package/docs/components-component-management-component-installer.zh.md +0 -182
  65. package/docs/components-component-management.ja.md +0 -30
  66. package/docs/components-component-management.md +0 -30
  67. package/docs/components-component-management.zh-TW.md +0 -30
  68. package/docs/components-component-management.zh.md +0 -30
  69. package/docs/components-layout-dashboard.ja.md +0 -185
  70. package/docs/components-layout-dashboard.md +0 -187
  71. package/docs/components-layout-dashboard.zh-TW.md +0 -185
  72. package/docs/components-layout-dashboard.zh.md +0 -185
  73. package/docs/components-layout-footer.ja.md +0 -165
  74. package/docs/components-layout-footer.md +0 -165
  75. package/docs/components-layout-footer.zh-TW.md +0 -165
  76. package/docs/components-layout-footer.zh.md +0 -165
  77. package/docs/components-layout-header.ja.md +0 -183
  78. package/docs/components-layout-header.md +0 -183
  79. package/docs/components-layout-header.zh-TW.md +0 -183
  80. package/docs/components-layout-header.zh.md +0 -183
  81. package/docs/components-layout.ja.md +0 -31
  82. package/docs/components-layout.md +0 -31
  83. package/docs/components-layout.zh-TW.md +0 -31
  84. package/docs/components-layout.zh.md +0 -31
  85. package/docs/components-notifications.ja.md +0 -125
  86. package/docs/components-notifications.md +0 -125
  87. package/docs/components-notifications.zh-TW.md +0 -125
  88. package/docs/components-notifications.zh.md +0 -125
  89. package/docs/components-user-management-user-center.ja.md +0 -148
  90. package/docs/components-user-management-user-center.md +0 -147
  91. package/docs/components-user-management-user-center.zh-TW.md +0 -148
  92. package/docs/components-user-management-user-center.zh.md +0 -148
  93. package/docs/components-user-management-user-sessions.ja.md +0 -121
  94. package/docs/components-user-management-user-sessions.md +0 -123
  95. package/docs/components-user-management-user-sessions.zh-TW.md +0 -121
  96. package/docs/components-user-management-user-sessions.zh.md +0 -121
  97. package/docs/components-user-management.ja.md +0 -49
  98. package/docs/components-user-management.md +0 -51
  99. package/docs/components-user-management.zh-TW.md +0 -49
  100. package/docs/components-user-management.zh.md +0 -49
  101. package/docs/components-utilities-icon.ja.md +0 -106
  102. package/docs/components-utilities-icon.md +0 -106
  103. package/docs/components-utilities-icon.zh-TW.md +0 -106
  104. package/docs/components-utilities-icon.zh.md +0 -106
  105. package/docs/components-utilities.ja.md +0 -136
  106. package/docs/components-utilities.md +0 -136
  107. package/docs/components-utilities.zh-TW.md +0 -136
  108. package/docs/components-utilities.zh.md +0 -136
  109. package/docs/components.ja.md +0 -27
  110. package/docs/components.md +0 -27
  111. package/docs/components.zh-TW.md +0 -27
  112. package/docs/components.zh.md +0 -27
  113. package/docs/core-concepts.ja.md +0 -134
  114. package/docs/core-concepts.md +0 -135
  115. package/docs/core-concepts.zh-TW.md +0 -134
  116. package/docs/core-concepts.zh.md +0 -134
  117. package/docs/getting-started.ja.md +0 -132
  118. package/docs/getting-started.md +0 -132
  119. package/docs/getting-started.zh-TW.md +0 -132
  120. package/docs/getting-started.zh.md +0 -132
  121. package/docs/hooks-api.ja.md +0 -214
  122. package/docs/hooks-api.md +0 -214
  123. package/docs/hooks-api.zh-TW.md +0 -214
  124. package/docs/hooks-api.zh.md +0 -214
  125. package/docs/how-to-guides.ja.md +0 -413
  126. package/docs/how-to-guides.md +0 -413
  127. package/docs/how-to-guides.zh-TW.md +0 -413
  128. package/docs/how-to-guides.zh.md +0 -413
  129. package/docs/overview.ja.md +0 -51
  130. package/docs/overview.md +0 -51
  131. package/docs/overview.zh-TW.md +0 -51
  132. package/docs/overview.zh.md +0 -51
  133. package/glossary.md +0 -12
  134. package/src/@types/index.ts +0 -230
  135. package/src/@types/shims.d.ts +0 -18
  136. package/src/BlockletStudio/README.md +0 -116
  137. package/src/BlockletStudio/index.tsx +0 -145
  138. package/src/ComponentInstaller/ComponentInstaller.stories.jsx +0 -16
  139. package/src/ComponentInstaller/index.jsx +0 -207
  140. package/src/ComponentInstaller/installer-item.jsx +0 -129
  141. package/src/ComponentInstaller/locales.js +0 -22
  142. package/src/ComponentInstaller/use-component-installed.js +0 -88
  143. package/src/ComponentManager/components/add-component.tsx +0 -136
  144. package/src/ComponentManager/components/check-component.tsx +0 -3
  145. package/src/ComponentManager/components/publish-component.tsx +0 -90
  146. package/src/ComponentManager/components/resource-dialog.tsx +0 -91
  147. package/src/ComponentManager/index.tsx +0 -3
  148. package/src/ComponentManager/libs/locales.ts +0 -15
  149. package/src/Dashboard/Dashboard.stories.jsx +0 -20
  150. package/src/Dashboard/app-shell/app-badge.stories.tsx +0 -64
  151. package/src/Dashboard/app-shell/app-badge.tsx +0 -94
  152. package/src/Dashboard/app-shell/app-header.tsx +0 -104
  153. package/src/Dashboard/app-shell/app-info-context.tsx +0 -182
  154. package/src/Dashboard/app-shell/badges/app-badge-default.tsx +0 -130
  155. package/src/Dashboard/app-shell/badges/app-badge-did.tsx +0 -28
  156. package/src/Dashboard/app-shell/badges/app-badge-state.tsx +0 -40
  157. package/src/Dashboard/app-shell/badges/app-badge-switch.tsx +0 -72
  158. package/src/Dashboard/app-shell/badges/app-badge-version.tsx +0 -60
  159. package/src/Dashboard/app-shell/index.ts +0 -5
  160. package/src/Dashboard/index.jsx +0 -184
  161. package/src/Footer/Footer.stories.jsx +0 -33
  162. package/src/Footer/brand.jsx +0 -81
  163. package/src/Footer/copyright.jsx +0 -22
  164. package/src/Footer/index.jsx +0 -111
  165. package/src/Footer/internal-footer.jsx +0 -139
  166. package/src/Footer/layout/plain.jsx +0 -55
  167. package/src/Footer/layout/row.jsx +0 -43
  168. package/src/Footer/layout/standard.jsx +0 -114
  169. package/src/Footer/links.jsx +0 -321
  170. package/src/Footer/social-media.jsx +0 -55
  171. package/src/Header/Header.stories.jsx +0 -30
  172. package/src/Header/index.tsx +0 -259
  173. package/src/Icon/Icon.stories.jsx +0 -12
  174. package/src/Icon/index.tsx +0 -87
  175. package/src/Notifications/Snackbar.tsx +0 -261
  176. package/src/Notifications/hooks/use-title.tsx +0 -254
  177. package/src/Notifications/hooks/use-width.tsx +0 -16
  178. package/src/Notifications/utils.ts +0 -246
  179. package/src/UserCenter/assets/banner.png +0 -0
  180. package/src/UserCenter/components/config-inviter.tsx +0 -48
  181. package/src/UserCenter/components/config-profile.tsx +0 -99
  182. package/src/UserCenter/components/danger-zone.tsx +0 -82
  183. package/src/UserCenter/components/editable-field.tsx +0 -273
  184. package/src/UserCenter/components/fallback.tsx +0 -57
  185. package/src/UserCenter/components/nft-preview.tsx +0 -84
  186. package/src/UserCenter/components/nft.tsx +0 -279
  187. package/src/UserCenter/components/notification.tsx +0 -319
  188. package/src/UserCenter/components/passport.tsx +0 -107
  189. package/src/UserCenter/components/privacy.tsx +0 -120
  190. package/src/UserCenter/components/settings.tsx +0 -170
  191. package/src/UserCenter/components/status-dialog/date-picker.tsx +0 -77
  192. package/src/UserCenter/components/status-dialog/index.tsx +0 -293
  193. package/src/UserCenter/components/status-selector/duration-menu.tsx +0 -90
  194. package/src/UserCenter/components/status-selector/index.tsx +0 -58
  195. package/src/UserCenter/components/status-selector/menu-item.tsx +0 -56
  196. package/src/UserCenter/components/storage/action.tsx +0 -49
  197. package/src/UserCenter/components/storage/connected.tsx +0 -61
  198. package/src/UserCenter/components/storage/delete.tsx +0 -72
  199. package/src/UserCenter/components/storage/disconnect.tsx +0 -40
  200. package/src/UserCenter/components/storage/icons/empty-spaces-nft.svg +0 -1
  201. package/src/UserCenter/components/storage/icons/long-arrow.svg +0 -5
  202. package/src/UserCenter/components/storage/icons/space-connected.svg +0 -3
  203. package/src/UserCenter/components/storage/icons/space-disconnect.svg +0 -3
  204. package/src/UserCenter/components/storage/index.tsx +0 -41
  205. package/src/UserCenter/components/storage/preview-nft.tsx +0 -72
  206. package/src/UserCenter/components/third-party-login/index.tsx +0 -199
  207. package/src/UserCenter/components/third-party-login/third-party-item.tsx +0 -296
  208. package/src/UserCenter/components/user-center.tsx +0 -787
  209. package/src/UserCenter/components/user-info/address.tsx +0 -143
  210. package/src/UserCenter/components/user-info/index.tsx +0 -4
  211. package/src/UserCenter/components/user-info/link-preview-input.tsx +0 -274
  212. package/src/UserCenter/components/user-info/metadata.tsx +0 -658
  213. package/src/UserCenter/components/user-info/social-actions/chat.tsx +0 -43
  214. package/src/UserCenter/components/user-info/social-actions/follow.tsx +0 -23
  215. package/src/UserCenter/components/user-info/social-actions/index.tsx +0 -17
  216. package/src/UserCenter/components/user-info/switch-role.tsx +0 -42
  217. package/src/UserCenter/components/user-info/timezone-select.tsx +0 -119
  218. package/src/UserCenter/components/user-info/user-basic-info.tsx +0 -292
  219. package/src/UserCenter/components/user-info/user-info-item.tsx +0 -54
  220. package/src/UserCenter/components/user-info/user-info.tsx +0 -91
  221. package/src/UserCenter/components/user-info/user-status.tsx +0 -234
  222. package/src/UserCenter/components/user-info/utils.ts +0 -320
  223. package/src/UserCenter/components/webhook-item.tsx +0 -248
  224. package/src/UserCenter/index.tsx +0 -1
  225. package/src/UserCenter/libs/locales.ts +0 -378
  226. package/src/UserCenter/libs/utils.ts +0 -30
  227. package/src/UserSessions/components/user-session-info.tsx +0 -78
  228. package/src/UserSessions/components/user-sessions.tsx +0 -545
  229. package/src/UserSessions/index.tsx +0 -1
  230. package/src/UserSessions/libs/locales.ts +0 -60
  231. package/src/UserSessions/libs/utils.ts +0 -82
  232. package/src/blocklets.js +0 -195
  233. package/src/common/domain-warning.jsx +0 -178
  234. package/src/common/header-addons.jsx +0 -119
  235. package/src/common/link-blocker.jsx +0 -20
  236. package/src/common/notification-addon.jsx +0 -135
  237. package/src/common/org-switch/avatar-uploader.jsx +0 -271
  238. package/src/common/org-switch/create.jsx +0 -267
  239. package/src/common/org-switch/index.jsx +0 -407
  240. package/src/common/org-switch/locales.js +0 -52
  241. package/src/common/org-switch/use-org.jsx +0 -79
  242. package/src/common/overridable-theme-provider.jsx +0 -17
  243. package/src/common/wallet-hidden-topbar.js +0 -14
  244. package/src/common/wizard-modal.jsx +0 -200
  245. package/src/common/ws.js +0 -68
  246. package/src/contexts/config-user-space.tsx +0 -88
  247. package/src/contexts/user-followers.tsx +0 -54
  248. package/src/hooks/use-follow.tsx +0 -75
  249. package/src/hooks/use-mobile.tsx +0 -6
  250. package/src/index.ts +0 -16
  251. package/src/libs/constant.ts +0 -1
  252. package/src/libs/spaces.tsx +0 -18
  253. package/src/libs/with-hide-when-embed.tsx +0 -24
  254. package/src/types.js +0 -45
  255. package/src/utils.js +0 -161
  256. package/vite.config.mjs +0 -34
@@ -1,200 +0,0 @@
1
- import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';
2
- import { Box, CircularProgress, Dialog, Typography, useMediaQuery, useTheme } from '@mui/material';
3
- import merge from 'lodash/merge';
4
- import PropTypes from 'prop-types';
5
- import { useEffect, useRef, useState } from 'react';
6
- import { joinURL, withQuery } from 'ufo';
7
-
8
- const DEFAULT_WIZARD_PATH = '/.well-known/service/onboard/bind-account';
9
-
10
- export default function WizardModal({
11
- onFinished = () => {},
12
- show = false,
13
- onChangeVisible = () => {},
14
- loadingText = '',
15
- defaultPath = DEFAULT_WIZARD_PATH,
16
- ...props
17
- }) {
18
- const [open, setOpen] = useState(show);
19
- const [loaded, setLoaded] = useState(false);
20
- const [currentUrl, setCurrentUrl] = useState(() => {
21
- // 从 localStorage 恢复上次的 URL
22
- const savedUrl = localStorage.getItem('wizard-current-url');
23
- if (savedUrl?.includes('/.well-known/service/onboard')) {
24
- return savedUrl;
25
- }
26
- return defaultPath;
27
- });
28
- const onFinishedRef = useRef(onFinished);
29
- const handleCloseRef = useRef();
30
- const iframeRef = useRef(null);
31
- const { locale } = useLocaleContext();
32
- const theme = useTheme();
33
- const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
34
- onFinishedRef.current = onFinished;
35
-
36
- handleCloseRef.current = () => {
37
- if (iframeRef.current?.contentWindow) {
38
- try {
39
- const url = new URL(iframeRef.current.contentWindow.location.href);
40
- const savedUrl = url.pathname;
41
- localStorage.setItem('wizard-current-url', savedUrl);
42
- setCurrentUrl(savedUrl);
43
- } catch (e) {
44
- setCurrentUrl(defaultPath);
45
- console.warn('Failed to save wizard URL:', e);
46
- }
47
- }
48
- localStorage.setItem('wizard-completed', 'true');
49
- setOpen(false);
50
- onChangeVisible(false);
51
- };
52
-
53
- useEffect(() => {
54
- if (show !== open) {
55
- setOpen(show);
56
- }
57
- }, [show]); // eslint-disable-line react-hooks/exhaustive-deps
58
-
59
- useEffect(() => {
60
- if (!open && loaded) {
61
- setLoaded(false);
62
- }
63
- }, [open]); // eslint-disable-line react-hooks/exhaustive-deps
64
-
65
- // 处理 iframe 消息
66
- useEffect(() => {
67
- const listener = (event) => {
68
- // 只处理来自同源的消息
69
- if (event.origin !== window.location.origin) {
70
- return;
71
- }
72
-
73
- const { type, data } = event.data || {};
74
-
75
- switch (type) {
76
- case 'wizard.loaded':
77
- setLoaded(true);
78
- break;
79
- case 'wizard.finished': {
80
- setOpen(false);
81
- // 完成后重置为默认 URL
82
- setCurrentUrl(defaultPath);
83
- localStorage.removeItem('wizard-current-url');
84
- localStorage.setItem('wizard-completed', 'true');
85
- onFinishedRef.current?.(data);
86
- break;
87
- }
88
- case 'wizard.close': {
89
- handleCloseRef.current();
90
- break;
91
- }
92
- default:
93
- break;
94
- }
95
- };
96
-
97
- window.addEventListener('message', listener);
98
- return () => {
99
- window.removeEventListener('message', listener);
100
- };
101
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
102
-
103
- // 控制弹窗显示
104
- useEffect(() => {
105
- const wizardCompleted = localStorage.getItem('wizard-completed');
106
- if (!wizardCompleted) {
107
- setOpen(true);
108
- }
109
- }, []);
110
-
111
- if (!open) {
112
- return null;
113
- }
114
-
115
- const src = withQuery(joinURL(window.location.origin, currentUrl), {
116
- locale,
117
- });
118
-
119
- return (
120
- <Dialog
121
- id="wizard-dialog"
122
- open={open}
123
- onClose={() => handleCloseRef.current()}
124
- fullWidth
125
- maxWidth={isMobile ? false : 'md'}
126
- fullScreen={isMobile}
127
- {...props}
128
- slotProps={merge(
129
- {},
130
- {
131
- paper: {
132
- sx: {
133
- margin: 0,
134
- borderRadius: 0,
135
- position: 'relative',
136
- overflow: 'hidden',
137
- ...(isMobile
138
- ? { borderRadius: 0 }
139
- : {
140
- borderRadius: 1,
141
- height: '720px',
142
- }),
143
- },
144
- },
145
- },
146
- props.slotProps
147
- )}
148
- sx={{
149
- '& .MuiBackdrop-root': {
150
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
151
- },
152
- ...props.sx,
153
- }}>
154
- <iframe
155
- ref={iframeRef}
156
- id="wizard-iframe"
157
- src={src}
158
- title="Setup Wizard"
159
- style={{
160
- width: '100%',
161
- height: '100%',
162
- border: 0,
163
- padding: 0,
164
- margin: 0,
165
- opacity: loaded ? 1 : 0,
166
- transition: 'opacity 0.3s ease-in-out',
167
- }}
168
- onLoad={() => setLoaded(true)}
169
- />
170
- {loaded ? null : (
171
- <Box
172
- sx={{
173
- position: 'absolute',
174
- top: 0,
175
- left: 0,
176
- right: 0,
177
- bottom: 0,
178
- display: 'flex',
179
- justifyContent: 'center',
180
- alignItems: 'center',
181
- bgcolor: 'background.paper',
182
- }}>
183
- <Box sx={{ display: 'flex', alignItems: 'center', flexDirection: 'column', gap: 1 }}>
184
- <CircularProgress />
185
- {typeof loadingText === 'string' ? <Typography variant="body1">{loadingText}</Typography> : loadingText}
186
- </Box>
187
- </Box>
188
- )}
189
- </Dialog>
190
- );
191
- }
192
-
193
- WizardModal.propTypes = {
194
- onFinished: PropTypes.func,
195
- show: PropTypes.bool,
196
- onChangeVisible: PropTypes.func,
197
- loadingText: PropTypes.node,
198
- defaultPath: PropTypes.string,
199
- ...Dialog.propTypes,
200
- };
package/src/common/ws.js DELETED
@@ -1,68 +0,0 @@
1
- import { use } from 'react';
2
- import { WsClient } from '@arcblock/ws';
3
- import { useCreation, usePrevious, useUnmount } from 'ahooks';
4
- import { SessionContext } from '@arcblock/did-connect-react/lib/Session';
5
- import { joinURL } from 'ufo';
6
- import { BLOCKLET_SERVICE_PATH_PREFIX } from '@arcblock/ux/lib/Util/constant';
7
-
8
- const client = {};
9
-
10
- export function create(endpoint = 'admin') {
11
- let pathPrefix = '/';
12
- if (!window?.blocklet && window?.env?.apiPrefix) {
13
- pathPrefix = window.env.apiPrefix;
14
- }
15
- const url = joinURL(pathPrefix, BLOCKLET_SERVICE_PATH_PREFIX, endpoint);
16
- return new WsClient(url, {
17
- heartbeatIntervalMs: 100 * 1000,
18
- });
19
- }
20
-
21
- export default function getWsClient(endpoint = 'admin') {
22
- if (!client[endpoint]) {
23
- client[endpoint] = create(endpoint);
24
- }
25
-
26
- return client[endpoint];
27
- }
28
-
29
- export const useListenWsClient = (endpoint = 'admin') => {
30
- const sessionCtx = use(SessionContext);
31
- const { session } = sessionCtx ?? {};
32
-
33
- const userDid = useCreation(() => session.user?.did, [session.user]);
34
-
35
- const previousUserDid = usePrevious(userDid);
36
-
37
- useUnmount(() => {
38
- Object.keys(client).forEach((key) => {
39
- if (client[key]?.isConnected()) {
40
- client[key]?.disconnect();
41
- }
42
- delete client[key];
43
- });
44
- });
45
-
46
- if (!userDid) {
47
- return null;
48
- }
49
-
50
- // 同步检查:如果用户切换了,断开并重新连接所有客户端
51
- if (previousUserDid && previousUserDid !== userDid) {
52
- Object.keys(client).forEach((key) => {
53
- if (client[key]) {
54
- if (client[key].isConnected()) {
55
- client[key].disconnect();
56
- }
57
- // 重新连接
58
- client[key].connect();
59
- }
60
- });
61
- }
62
- if (!client[endpoint] && session.user) {
63
- client[endpoint] = getWsClient(endpoint);
64
- client[endpoint].connect();
65
- }
66
-
67
- return client[endpoint];
68
- };
@@ -1,88 +0,0 @@
1
- import { createContext, use, useMemo, useState, useEffect } from 'react';
2
- import { SessionContext } from '@arcblock/did-connect-react/lib/Session';
3
-
4
- import type { SessionContext as TSessionContext, Session } from '../@types';
5
-
6
- export interface SpaceGateway {
7
- did: string;
8
- name: string;
9
- url: string;
10
- endpoint: string;
11
- }
12
-
13
- export interface SettingStorageEndpoint {
14
- (endpoint: string | undefined): void | Promise<void>;
15
- }
16
-
17
- interface ConfigUserSpaceContextType {
18
- loading: boolean;
19
- spaceGateway: SpaceGateway | undefined;
20
- session: Session;
21
- deleteSpaceGateway: (spaceGateway: SpaceGateway) => Promise<void>;
22
- updateSpaceGateway: (updateSpaceGateway: SpaceGateway) => Promise<void>;
23
- storageEndpoint: string;
24
- settingStorageEndpoint: SettingStorageEndpoint;
25
- hasStorageEndpoint: boolean;
26
- }
27
-
28
- const ConfigUserSpaceContext = createContext<ConfigUserSpaceContextType>({} as ConfigUserSpaceContextType);
29
- const { Provider, Consumer } = ConfigUserSpaceContext;
30
-
31
- function ConfigUserSpaceProvider({ children }: { children: React.ReactNode }) {
32
- const [loading] = useState(false);
33
- const { session } = use<TSessionContext>(SessionContext);
34
- const { user } = session;
35
-
36
- const [spaceGateway, setSpaceGateway] = useState<SpaceGateway | undefined>();
37
- const storageEndpoint = useMemo(() => {
38
- return user?.didSpace?.endpoint;
39
- }, [user?.didSpace]);
40
-
41
- useEffect(() => {
42
- setSpaceGateway(user?.didSpace as SpaceGateway);
43
- }, [user?.didSpace]);
44
-
45
- // eslint-disable-next-line require-await
46
- const deleteSpaceGateway = async (): Promise<void> => {
47
- setSpaceGateway(undefined);
48
- };
49
-
50
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
51
- const settingStorageEndpoint = (endpoint: string | undefined) => {};
52
-
53
- const updateSpaceGateway = async (x: SpaceGateway) => {
54
- setSpaceGateway(x);
55
- // eslint-disable-next-line no-use-before-define
56
- await settingStorageEndpoint(x.endpoint);
57
- };
58
-
59
- const hasStorageEndpoint = Boolean(storageEndpoint && spaceGateway);
60
-
61
- return (
62
- <Provider
63
- value={{
64
- loading,
65
- spaceGateway,
66
- session,
67
- deleteSpaceGateway,
68
- updateSpaceGateway,
69
- storageEndpoint,
70
- settingStorageEndpoint,
71
- hasStorageEndpoint,
72
- }}>
73
- {children}
74
- </Provider>
75
- );
76
- }
77
-
78
- function useConfigUserSpaceContext() {
79
- const res = use(ConfigUserSpaceContext);
80
- return res;
81
- }
82
-
83
- export {
84
- ConfigUserSpaceContext,
85
- ConfigUserSpaceProvider,
86
- Consumer as ConfigUserSpaceConsumer,
87
- useConfigUserSpaceContext,
88
- };
@@ -1,54 +0,0 @@
1
- import { createContext, useContext } from 'react';
2
- import { translate } from '@arcblock/ux/lib/Locale/util';
3
- import { useMemoizedFn } from 'ahooks';
4
- import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';
5
-
6
- import useFollow from '../hooks/use-follow';
7
- import { translations } from '../UserCenter/libs/locales';
8
-
9
- const UserFollowersContext = createContext<UserFollowersContextType>({
10
- followed: false,
11
- followUser: () => {},
12
- unfollowUser: () => {},
13
- });
14
- const { Provider } = UserFollowersContext;
15
-
16
- type UserFollowersContextType = {
17
- followed: boolean;
18
- followUser: () => void;
19
- unfollowUser: () => void;
20
- };
21
-
22
- function UserFollowersProvider({
23
- isMySelf,
24
- userDid,
25
- children,
26
- }: {
27
- children: React.ReactNode;
28
- isMySelf: boolean;
29
- userDid: string;
30
- }) {
31
- const { locale } = useLocaleContext();
32
- const t = useMemoizedFn((key, data = {}) => {
33
- return translate(translations, key, locale, 'en', data);
34
- });
35
- const { followed, followUser, unfollowUser } = useFollow({ userDid, t, isMySelf });
36
-
37
- return (
38
- <Provider
39
- value={{
40
- followed,
41
- followUser,
42
- unfollowUser,
43
- }}>
44
- {children}
45
- </Provider>
46
- );
47
- }
48
-
49
- function useUserFollowersContext() {
50
- const res = useContext(UserFollowersContext);
51
- return res;
52
- }
53
-
54
- export { UserFollowersContext, useUserFollowersContext, UserFollowersProvider };
@@ -1,75 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
- import { useMemoizedFn } from 'ahooks';
3
- import Toast from '@arcblock/ux/lib/Toast';
4
- import { getBlockletSDK } from '@blocklet/js-sdk';
5
-
6
- import type { AxiosError } from 'axios';
7
- import { formatAxiosError } from '../UserCenter/libs/utils';
8
-
9
- /**
10
- * 登录用户与当前用户(userDid)的关注关系
11
- */
12
- export default function useFollow({
13
- userDid,
14
- t,
15
- isMySelf,
16
- }: {
17
- userDid: string;
18
- t: (k: string) => string;
19
- isMySelf: boolean;
20
- }) {
21
- const client = getBlockletSDK();
22
- const [followed, setFollowed] = useState(false);
23
-
24
- const isFollowingUser = useMemoizedFn(async () => {
25
- try {
26
- if (isMySelf) {
27
- setFollowed(true);
28
- return;
29
- }
30
- const res = await client.user.isFollowingUser({ userDid });
31
- setFollowed(res);
32
- } catch (error) {
33
- console.error(error);
34
- }
35
- });
36
-
37
- const followUser = useMemoizedFn(async (followUserDid: string = userDid) => {
38
- if (isMySelf && followUserDid === userDid) {
39
- return;
40
- }
41
- try {
42
- await client.user.followUser({ userDid: followUserDid });
43
- Toast.success(t('profile.follow_success'));
44
- isFollowingUser();
45
- } catch (error) {
46
- console.error(error);
47
- Toast.error(formatAxiosError(error as AxiosError));
48
- }
49
- });
50
- const unfollowUser = useMemoizedFn(async (unfollowUserDid: string = userDid) => {
51
- if (isMySelf && unfollowUserDid === userDid) {
52
- return;
53
- }
54
- try {
55
- await client.user.unfollowUser({ userDid: unfollowUserDid });
56
- Toast.success(t('profile.unfollow_success'));
57
- isFollowingUser();
58
- } catch (error) {
59
- console.error(error);
60
- Toast.error(formatAxiosError(error as AxiosError));
61
- }
62
- });
63
-
64
- useEffect(() => {
65
- if (userDid && !isMySelf) {
66
- isFollowingUser();
67
- }
68
- }, [isFollowingUser, userDid, isMySelf]);
69
-
70
- return {
71
- followed,
72
- followUser,
73
- unfollowUser,
74
- };
75
- }
@@ -1,6 +0,0 @@
1
- import { Breakpoint, useTheme, useMediaQuery } from '@mui/material';
2
-
3
- export default function useMobile({ key = 'sm' }: { key?: number | Breakpoint } = {}) {
4
- const theme = useTheme();
5
- return useMediaQuery(theme.breakpoints.down(key));
6
- }
package/src/index.ts DELETED
@@ -1,16 +0,0 @@
1
- // @ts-ignore
2
- export { default as Header } from './Header';
3
- // @ts-ignore
4
- export { default as Footer } from './Footer';
5
- // @ts-ignore
6
- export { default as Dashboard } from './Dashboard';
7
- // @ts-ignore
8
- export { default as Icon } from './Icon';
9
- // @ts-ignore
10
- export { default as ComponentInstaller } from './ComponentInstaller';
11
- export { default as BlockletStudio } from './BlockletStudio';
12
- // @ts-ignore
13
- export { default as useComponentInstaller } from './ComponentInstaller/use-component-installed';
14
- export * from './UserCenter';
15
- export * from './UserSessions';
16
- export * from './ComponentManager';
@@ -1 +0,0 @@
1
- export const EMBED_MODE_KEY = 'blocklet-ui-react-embed-mode';
@@ -1,18 +0,0 @@
1
- import { joinURL } from 'ufo';
2
-
3
- export function getSpaceNftDisplayUrlFromEndpoint(endpoint: string): string {
4
- const prefix = endpoint.replace(/\/api\/space\/.+/, '');
5
-
6
- const strArray = endpoint.replace(/\/$/, '').split('/');
7
- const spaceDid = strArray.at(-4);
8
-
9
- return joinURL(prefix, `/api/space/nft/display?spaceDid=${spaceDid}`);
10
- }
11
-
12
- export function getSpaceHomeUrl(endpoint: string): string {
13
- const baseUrl = endpoint.replace(/\/api\/space\/.+/, '');
14
- const strArray = endpoint.replace(/\/$/, '').split('/');
15
- const spaceDid = strArray.at(-4) as string;
16
-
17
- return joinURL(baseUrl, 'space', spaceDid);
18
- }
@@ -1,24 +0,0 @@
1
- import { useSessionStorageState } from 'ahooks';
2
- import { EMBED_MODE_KEY } from './constant';
3
-
4
- export default function withHideWhenEmbed<T extends object>(Component: React.ComponentType<T>) {
5
- const displayName = Component.displayName || Component.name || 'Component';
6
-
7
- function WrappedComponent(props: T) {
8
- const [embedMode] = useSessionStorageState(EMBED_MODE_KEY, {
9
- defaultValue: 0,
10
- listenStorageChange: true,
11
- });
12
- const isEmbed = embedMode === 1;
13
-
14
- if (isEmbed) {
15
- return null;
16
- }
17
-
18
- return <Component {...props} />;
19
- }
20
-
21
- WrappedComponent.displayName = `withHideWhenEmbed(${displayName})`;
22
-
23
- return WrappedComponent;
24
- }
package/src/types.js DELETED
@@ -1,45 +0,0 @@
1
- /* eslint-disable import/prefer-default-export */
2
- import PropTypes from 'prop-types';
3
-
4
- export const BlockletMetaProps = PropTypes.shape({
5
- appLogo: PropTypes.node,
6
- appName: PropTypes.string,
7
- theme: PropTypes.shape({
8
- background: PropTypes.string,
9
- }),
10
- enableConnect: PropTypes.bool,
11
- enableLocale: PropTypes.bool,
12
- navigation: PropTypes.arrayOf(
13
- PropTypes.shape({
14
- title: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
15
- link: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
16
- icon: PropTypes.string,
17
- items: PropTypes.arrayOf(
18
- PropTypes.shape({
19
- title: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
20
- link: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
21
- })
22
- ),
23
- })
24
- ),
25
- });
26
-
27
- export const SessionManagerProps = PropTypes.shape({
28
- showText: PropTypes.bool,
29
- showRole: PropTypes.bool,
30
- switchDid: PropTypes.bool,
31
- switchProfile: PropTypes.bool,
32
- switchPassport: PropTypes.bool,
33
- disableLogout: PropTypes.bool,
34
- onLogin: PropTypes.func,
35
- onLogout: PropTypes.func,
36
- onSwitchDid: PropTypes.func,
37
- onSwitchProfile: PropTypes.func,
38
- onSwitchPassport: PropTypes.func,
39
- menu: PropTypes.array,
40
- menuRender: PropTypes.func,
41
- dark: PropTypes.bool,
42
- size: PropTypes.number,
43
- profileUrl: PropTypes.string,
44
- renderUserButton: PropTypes.func,
45
- });