@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,194 +0,0 @@
1
- # BlockletStudio
2
-
3
- `BlockletStudio` 组件提供了一个精简的、可嵌入的用户界面,用于发布和管理 blocklet 资源。它通过渲染一个全页 `iframe` 来运行,该 `iframe` 从指定的 blocklet 服务加载一个专用的发布界面。这使得您的应用程序能够提供一致且强大的资源管理体验,而无需从头开始构建 UI。
4
-
5
- 主机应用程序与 `BlockletStudio` iframe 之间的通信通过 `window.postMessage` API 进行安全处理,从而可以为上传、发布和连接等事件启用回调。
6
-
7
- ## 使用示例
8
-
9
- 要集成 `BlockletStudio`,您需要管理其可见性状态(例如,使用 `useState`)。由于 iframe 可能需要一些时间来加载,建议向用户显示一个加载指示器。`onOpened` 回调可用于表示 iframe 内容已准备就绪,此时可以隐藏加载指示器。
10
-
11
- 以下示例演示了如何实现一个打开 `BlockletStudio` 对话框并管理加载状态的按钮。
12
-
13
- ```tsx icon=logos:react title="Exporter.tsx"
14
- import { Icon } from '@iconify-icon/react';
15
- import ArrowUp from '@iconify-icons/tabler/arrow-big-up-line';
16
- import { Box, IconButton, CircularProgress as Spinner, svgIconClasses } from '@mui/material';
17
- import { useState } from 'react';
18
- import { BlockletStudio } from '@arcblock/ux-react';
19
-
20
- // 提供 studio 服务的 blocklet 的 DID。
21
- const AI_STUDIO_COMPONENT_DID = 'z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9';
22
-
23
- export default function Exporter() {
24
- const [showCreateResource, setShowCreateResource] = useState(false);
25
- const [opening, setOpening] = useState(false);
26
-
27
- const handleShowDialog = () => {
28
- setOpening(true);
29
- setShowCreateResource(true);
30
- };
31
-
32
- return (
33
- <>
34
- <IconButton
35
- sx={{
36
- position: 'relative',
37
- minWidth: 40,
38
- minHeight: 40,
39
- borderRadius: '100%',
40
- [`.${svgIconClasses.root}`]: {
41
- color: 'text.secondary',
42
- },
43
- }}
44
- onClick={handleShowDialog}>
45
- {opening ? <Spinner size={16} /> : <Box component={Icon} icon={ArrowUp} style={{ fontSize: 24 }} />}
46
- </IconButton>
47
- <BlockletStudio
48
- open={showCreateResource}
49
- setOpen={setShowCreateResource}
50
- onOpened={() => setOpening(false)}
51
- componentDid={AI_STUDIO_COMPONENT_DID}
52
- mode="dialog"
53
- title="Demo Project"
54
- description="This is a demo project for the 'aigne' blocklet."
55
- note='Please review all resources and components before publishing.'
56
- introduction="Welcome to the resource publisher."
57
- tenantScope="test-tenant-scope-id-2"
58
- resourcesParams={{ name: 'test-project', extra: true }}
59
- dependentComponentsMode="readonly"
60
- componentsTitle="Required Components"
61
- resourcesTitle="Add Project Files"
62
- onConnected={() => alert('Connected')}
63
- onUploaded={() => alert('Uploaded')}
64
- onReleased={() => alert('Released')}
65
- components={[
66
- { did: 'z8ia3xzq2tMq8CRHfaXj1BTYJyYnEcHbqP8cJ', included: true, required: true },
67
- { did: 'z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ', included: true, required: false },
68
- ]}
69
- resources={{
70
- 'z8iZpog7mcgcgBZzTiXJCWESvmnRrQmnd3XBB': [
71
- 'template-448698592710885376',
72
- 'template-448696391418511360',
73
- ],
74
- }}
75
- />
76
- </>
77
- );
78
- }
79
- ```
80
-
81
- ## Props
82
-
83
- `BlockletStudio` 组件接受以下 props 来控制其行为和外观。
84
-
85
- <x-field-group>
86
- <x-field data-name="open" data-type="boolean" data-required="true">
87
- <x-field-desc markdown>控制 `BlockletStudio` iframe 的可见性。设置为 `true` 显示,设置为 `false` 隐藏。</x-field-desc>
88
- </x-field>
89
- <x-field data-name="setOpen" data-type="(open: boolean) => void" data-required="true">
90
- <x-field-desc markdown>一个回调函数,`BlockletStudio` 使用它来请求关闭。通常,此函数会将与 `open` prop 关联的状态变量设置为 `false`。</x-field-desc>
91
- </x-field>
92
- <x-field data-name="componentDid" data-type="string" data-required="true">
93
- <x-field-desc markdown>提供资源发布服务的 blocklet 的去中心化标识符 (DID)。这决定了加载哪个 studio 界面。</x-field-desc>
94
- </x-field>
95
- <x-field data-name="onOpened" data-type="() => void" data-required="false">
96
- <x-field-desc markdown>一个可选的回调函数,当 `BlockletStudio` iframe 加载完成并准备好进行用户交互时执行。</x-field-desc>
97
- </x-field>
98
- <x-field data-name="onUploaded" data-type="(data: unknown) => void" data-required="false">
99
- <x-field-desc markdown>一个可选的回调函数,在用户成功上传新资源后触发。`data` 参数包含有关上传项的元数据。</x-field-desc>
100
- </x-field>
101
- <x-field data-name="onReleased" data-type="(data: unknown) => void" data-required="false">
102
- <x-field-desc markdown>一个可选的回调函数,在用户发布组件的新版本后触发。`data` 参数包含有关新版本的信息。</x-field-desc>
103
- </x-field>
104
- <x-field data-name="onConnected" data-type="(data: unknown) => void" data-required="false">
105
- <x-field-desc markdown>一个可选的回调函数,在用户连接资源或组件后触发。</x-field-desc>
106
- </x-field>
107
- <x-field data-name="tenantScope" data-type="string" data-required="false">
108
- <x-field-desc markdown>一个可选字符串,用于将资源范围限定于特定租户。这可用于确保多租户环境中的数据隔离。</x-field-desc>
109
- </x-field>
110
- <x-field data-name="resourcesParams" data-type="Record<string, any>" data-required="false" data-default="{}">
111
- <x-field-desc markdown>一个包含查询参数的对象,这些参数将传递给 blocklet 的资源获取 API 端点。这允许对资源进行动态过滤。</x-field-desc>
112
- </x-field>
113
- <x-field data-name="mode" data-type="string" data-required="false" data-default='"dialog"'>
114
- <x-field-desc markdown>决定 studio 界面的显示模式。默认为 `'dialog'`。</x-field-desc>
115
- </x-field>
116
- <x-field data-name="title" data-type="string" data-required="false">
117
- <x-field-desc markdown>一个可选的标题,显示在 studio 界面的顶部。</x-field-desc>
118
- </x-field>
119
- <x-field data-name="logo" data-type="string" data-required="false">
120
- <x-field-desc markdown>一个可选的 logo URL,显示在 studio 界面中。</x-field-desc>
121
- </x-field>
122
- <x-field data-name="description" data-type="string" data-required="false">
123
- <x-field-desc markdown>一个可选的字符串,提供简短描述,显示在 studio UI 中。</x-field-desc>
124
- </x-field>
125
- <x-field data-name="introduction" data-type="string" data-required="false">
126
- <x-field-desc markdown>一个可选的字符串,用于更详细的介绍,显示在 studio UI 中。</x-field-desc>
127
- </x-field>
128
- <x-field data-name="note" data-type="string" data-required="false">
129
- <x-field-desc markdown>一个可选的字符串,用于向用户显示注释或重要消息。</x-field-desc>
130
- </x-field>
131
- <x-field data-name="componentsTitle" data-type="string" data-required="false">
132
- <x-field-desc markdown>一个可选的字符串,用于自定义组件部分的标题。</x-field-desc>
133
- </x-field>
134
- <x-field data-name="resourcesTitle" data-type="string" data-required="false">
135
- <x-field-desc markdown>一个可选的字符串,用于自定义资源部分的标题。</x-field-desc>
136
- </x-field>
137
- <x-field data-name="components" data-type="Record<string, unknown>[]" data-required="false" data-default="[]">
138
- <x-field-desc markdown>一个对象数组,代表在 studio 中默认应预先选中的组件。</x-field-desc>
139
- </x-field>
140
- <x-field data-name="resources" data-type="Record<string, unknown>" data-required="false" data-default="{}">
141
- <x-field-desc markdown>一个对象,代表在 studio 中默认应预先选中的资源。</x-field-desc>
142
- </x-field>
143
- <x-field data-name="dependentComponentsMode" data-type="'auto' | 'readonly'" data-required="false">
144
- <x-field-desc markdown>控制依赖组件的行为。在 `'readonly'` 模式下,用户无法取消选择作为所选资源依赖项而自动包含的组件。</x-field-desc>
145
- </x-field>
146
- <x-field data-name="style" data-type="React.CSSProperties" data-required="false" data-default="{}">
147
- <x-field-desc markdown>一个用于将自定义 CSS 样式应用于 `iframe` 元素的对象。</x-field-desc>
148
- </x-field>
149
- <x-field data-name="zIndex" data-type="number" data-required="false" data-default="9999">
150
- <x-field-desc markdown>`iframe` 元素的 z-index CSS 属性,控制其堆叠顺序。</x-field-desc>
151
- </x-field>
152
- </x-field-group>
153
-
154
- ## 依赖组件
155
-
156
- 为 `BlockletStudio` 提供资源 API 的 Blocklet 可以直接在资源数据中指定组件依赖项。当用户选择一个列出了 `dependentComponents` 的资源时,`BlockletStudio` 将在 UI 中自动选择这些组件。
157
-
158
- 此功能通过确保所有必要的依赖项都自动包含进来,从而简化了用户体验。
159
-
160
- 要实现此功能,您的 blocklet 的资源 API 应返回一个包含所需组件 DID 的 `dependentComponents` 数组。
161
-
162
- ### API 响应示例
163
-
164
- 以下是来自资源 API 端点的 JSON 响应示例。"Application" 和 "Tool" 资源声明了它们的组件依赖项。
165
-
166
- ```json 带有依赖项的 API 响应
167
- {
168
- "resources": [
169
- {
170
- "id": "application-448698592710885376",
171
- "name": "My App (as Application)",
172
- "dependentComponents": [
173
- "error-did",
174
- "z8ia1mAXo8ZE7ytGF36L5uBf9kD2kenhqFGp9",
175
- "z2qZyjnsRffFtn2PDnDwDHTRbAu53RpKqDtFZ",
176
- "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"
177
- ]
178
- },
179
- {
180
- "id": "tool-448698592710885376",
181
- "name": "My App (as Tool)",
182
- "dependentComponents": ["error-did", "z2qaCNvKMv5GjouKdcDWexv6WqtHbpNPQDnAk"]
183
- },
184
- {
185
- "id": "template-448698592710885376",
186
- "name": "My App (as Template)"
187
- }
188
- ]
189
- }
190
- ```
191
-
192
- ## 总结
193
-
194
- `BlockletStudio` 组件提供了一种强大而便捷的方式,可将资源和组件管理直接集成到您的应用程序中。通过利用 `iframe` 和一组清晰的 props,它在简化开发的同时提供了一致的用户体验。有关依赖项管理的相关功能,您可能还想查看 [ComponentInstaller](./components-component-management-component-installer.md) 文档。
@@ -1,182 +0,0 @@
1
- # ComponentInstaller
2
-
3
- `ComponentInstaller` は、他の Blocklet に依存する機能のゲートキーパーとして機能するユーティリティコンポーネントです。指定されたコンポーネントの依存関係がインストールされているかどうかを検証します。インストールされていない場合、管理者(デフォルトでは `owner` または `admin` ロール)が直接インストールするためのユーザーフレンドリーなインターフェースを提供します。ユーザーが必要な権限を持っていない場合は、管理者に連絡するよう促すメッセージを表示します。
4
-
5
- このコンポーネントは、不足しているオプションの依存関係を適切に処理できる堅牢なアプリケーションを作成するために不可欠であり、管理者をインストールプロセスを通じてガイドすることでユーザーエクスペリエンスを向上させます。
6
-
7
- ## 仕組み
8
-
9
- このコンポーネントのロジックは、子コンポーネントをレンダリングする前に依存関係が満たされていることを確認するため、明確で順次的なプロセスに従います。
10
-
11
- <!-- DIAGRAM_IMAGE_START:flowchart:4:3:1765962229 -->
12
- ![ComponentInstaller](assets/diagram/component-installer-diagram-0.ja.jpg)
13
- <!-- DIAGRAM_IMAGE_END -->
14
-
15
- 1. **依存関係のチェック**: `did` プロパティを読み取り、Blocklet のメタデータ(`window.blocklet.optionalComponents`)と照合して、必要なコンポーネントがインストールされているかどうかを判断します。
16
- 2. **権限チェック**: 不足しているコンポーネントがある場合、`SessionPermission` コンポーネントを使用して、現在のユーザーのロールが `roles` プロパティで指定されたものと一致するかどうかを検証します。
17
- 3. **条件付きレンダリング**:
18
- * すべての依存関係がインストールされている場合、その `children` をレンダリングします。
19
- * 依存関係が不足しており、ユーザーに権限がある場合、ポップアップのインストールパネルを表示します。
20
- * 依存関係が不足しており、ユーザーに権限がない場合、管理者に連絡するよう提案を表示するか、`noPermissionMute` が有効な場合は `fallback` コンポーネントをレンダリングします。
21
-
22
- ## 基本的な使い方
23
-
24
- オプションの Blocklet に依存するコンポーネントや機能を `ComponentInstaller` でラップします。必要なコンポーネントの DID を提供してください。
25
-
26
- ```jsx "MyFeature.jsx" icon=logos:react
27
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
28
- import MyDependentComponent from './MyDependentComponent';
29
-
30
- export default function MyFeature() {
31
- // 必要なコンポーネントの実際の DID に置き換えてください
32
- const requiredComponentDid = 'z8ia2427634f1e909a304e2b963715a18';
33
-
34
- return (
35
- <ComponentInstaller did={requiredComponentDid}>
36
- {/* このコンポーネントは依存関係が満たされている場合にのみレンダリングされます */}
37
- <MyDependentComponent />
38
- </ComponentInstaller>
39
- );
40
- }
41
- ```
42
-
43
- ## Props
44
-
45
- `ComponentInstaller` は、その動作をカスタマイズするために以下の props を受け入れます。
46
-
47
- <x-field-group>
48
- <x-field data-name="did" data-type="string | string[]" data-required="true">
49
- <x-field-desc markdown>チェックするコンポーネントの依存関係の DID(または DID の配列)。これは、必要な Blocklet の主要な識別子です。</x-field-desc>
50
- </x-field>
51
- <x-field data-name="children" data-type="any" data-required="true">
52
- <x-field-desc markdown>すべての依存関係がインストールされていることを確認した後にレンダリングするコンテンツ。標準の React ノードまたはレンダー関数を指定できます。</x-field-desc>
53
- </x-field>
54
- <x-field data-name="roles" data-type="string[]" data-default='["owner", "admin"]'>
55
- <x-field-desc markdown>インストール UI を表示し、不足しているコンポーネントをインストールすることが許可されているユーザーロールの配列。</x-field-desc>
56
- </x-field>
57
- <x-field data-name="fallback" data-type="React.ReactNode" data-required="false">
58
- <x-field-desc markdown>依存関係をチェックしている間、またはインストール権限のないユーザーに対して `noPermissionMute` が有効な場合に表示するフォールバックコンポーネント。</x-field-desc>
59
- </x-field>
60
- <x-field data-name="noPermissionMute" data-type="boolean" data-default="false">
61
- <x-field-desc markdown>`true` の場合、権限のないユーザーには「管理者に連絡」メッセージの代わりに `fallback` コンポーネント(または何も表示しない)が表示されます。</x-field-desc>
62
- </x-field>
63
- <x-field data-name="disabled" data-type="boolean" data-default="false">
64
- <x-field-desc markdown>`true` の場合、コンポーネントはすべてのチェックをバイパスし、即座にその `children` をレンダリングします。</x-field-desc>
65
- </x-field>
66
- <x-field data-name="onInstalled" data-type="function" data-required="false">
67
- <x-field-desc markdown>依存関係のチェックが完了した後にトリガーされるコールバック関数。インストール済みのコンポーネントのリストを受け取ります。</x-field-desc>
68
- </x-field>
69
- <x-field data-name="onError" data-type="function" data-required="false">
70
- <x-field-desc markdown>依存関係のチェック中にエラーが発生した場合にトリガーされるコールバック関数。エラーの原因となったコンポーネントのリストを受け取ります。</x-field-desc>
71
- </x-field>
72
- <x-field data-name="onClose" data-type="function" data-required="false">
73
- <x-field-desc markdown>インストールのポップアップが閉じられたときに呼び出されるコールバック関数。</x-field-desc>
74
- </x-field>
75
- <x-field data-name="closeByOutSize" data-type="boolean" data-default="false">
76
- <x-field-desc markdown>`true` の場合、ユーザーがポップアップの外側をクリックすると、インストールのポップアップが閉じます。</x-field-desc>
77
- </x-field>
78
- <x-field data-name="warnIcon" data-type="React.ReactNode" data-required="false">
79
- <x-field-desc markdown>インストールのポップアップのデフォルトの警告アイコンを置き換えるためのカスタム React ノード。</x-field-desc>
80
- </x-field>
81
- </x-field-group>
82
-
83
- ## 高度な使い方
84
-
85
- ### 複数のコンポーネントのチェック
86
-
87
- `did` プロパティに DID の配列を渡すことで、複数の依存関係を一度にチェックできます。指定されたすべてのコンポーネントがインストールされている場合にのみ、子はレンダリングされます。
88
-
89
- ```jsx "MyDashboard.jsx" icon=logos:react
90
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
91
- import AnalyticsWidget from './AnalyticsWidget';
92
- import CmsWidget from './CmsWidget';
93
-
94
- export default function MyDashboard() {
95
- const requiredDids = [
96
- 'z8ia2427634f1e909a304e2b963715a18', // 分析サービス
97
- 'z8ia3c1f2e4b8e6a1b2c3d4e5f6a7b8c9', // CMS サービス
98
- ];
99
-
100
- return (
101
- <ComponentInstaller did={requiredDids}>
102
- <AnalyticsWidget />
103
- <CmsWidget />
104
- </ComponentInstaller>
105
- );
106
- }
107
- ```
108
-
109
- ### ローディング状態のためのフォールバックの使用
110
-
111
- 依存関係のチェックが進行中の間、`fallback` コンポーネントを提供してユーザーエクスペリエンスを向上させます。これは、`noPermissionMute` と共に使用して、権限のないユーザーにプレースホルダーを表示する場合にも役立ちます。
112
-
113
- ```jsx "FeatureWithLoading.jsx" icon=logos:react
114
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
115
- import CircularProgress from '@mui/material/CircularProgress';
116
- import Box from '@mui/material/Box';
117
- import MyDependentComponent from './MyDependentComponent';
118
-
119
- export default function FeatureWithLoading() {
120
- const LoadingSpinner = (
121
- <Box sx={{ display: 'flex', justifyContent: 'center', p: 4 }}>
122
- <CircularProgress />
123
- </Box>
124
- );
125
-
126
- return (
127
- <ComponentInstaller
128
- did="z8ia2427634f1e909a304e2b963715a18"
129
- fallback={LoadingSpinner}
130
- noPermissionMute={true}
131
- >
132
- <MyDependentComponent />
133
- </ComponentInstaller>
134
- );
135
- }
136
- ```
137
-
138
- ### レンダープロップによるカスタム UI
139
-
140
- UI を完全に制御するために、`children` として関数を渡すことができます。この関数は `hasPermission`、`optComponents`、および `installStatus` を含むオブジェクトを受け取り、完全にカスタムのインストールインターフェースを構築することができます。
141
-
142
- ```jsx "CustomInstallerButton.jsx" icon=logos:react
143
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
144
- import Button from '@mui/material/Button';
145
-
146
- export default function CustomInstallerButton() {
147
- const requiredDid = 'z8ia2427634f1e909a304e2b963715a18';
148
-
149
- return (
150
- <ComponentInstaller did={requiredDid}>
151
- {({ hasPermission, optComponents, installStatus }) => {
152
- const isMissing = optComponents.length > 0;
153
- const status = installStatus[requiredDid] || 'not_installed';
154
-
155
- if (!isMissing) {
156
- return <p>Feature is ready to use!</p>;
157
- }
158
-
159
- if (!hasPermission) {
160
- return <p>Please ask an admin to install the required component.</p>;
161
- }
162
-
163
- return (
164
- <Button
165
- variant="contained"
166
- disabled={status !== 'not_installed'}
167
- onClick={() => window.open(optComponents[0].installUrl, '_blank')}
168
- >
169
- {status === 'not_installed' ? `Install ${optComponents[0].meta.title}` : `Installing... (${status})`}
170
- </Button>
171
- );
172
- }}
173
- </ComponentInstaller>
174
- );
175
- }
176
- ```
177
-
178
- ## まとめ
179
-
180
- `ComponentInstaller` は、Blocklet アプリケーション内でオプションの依存関係を管理するための強力なコンポーネントです。必要なコンポーネントが利用可能であることを保証するための構造化されたユーザーフレンドリーな方法を提供し、必要に応じて管理者をインストールプロセスを通じてガイドします。このコンポーネントを使用することで、ユーザーの環境に適応する、より回復力があり機能豊富なアプリケーションを構築できます。
181
-
182
- コンポーネントの管理に関する詳細については、リソースとコンポーネント管理のためのより包括的なインターフェースを提供する [BlockletStudio](./components-component-management-blocklet-studio.md) コンポーネントにも興味があるかもしれません。
@@ -1,182 +0,0 @@
1
- # ComponentInstaller
2
-
3
- The `ComponentInstaller` is a utility component that acts as a gatekeeper for features that depend on other blocklets. It verifies whether specified component dependencies are installed. If they are not, it provides a user-friendly interface for administrators (`owner` or `admin` roles by default) to install them directly. If the user lacks the necessary permissions, it displays a message advising them to contact an administrator.
4
-
5
- This component is essential for creating robust applications that can gracefully handle missing optional dependencies, improving the user experience by guiding administrators through the installation process.
6
-
7
- ## How It Works
8
-
9
- The component's logic follows a clear, sequential process to ensure dependencies are met before rendering its child components.
10
-
11
- <!-- DIAGRAM_IMAGE_START:flowchart:4:3:1765962229 -->
12
- ![ComponentInstaller](assets/diagram/component-installer-diagram-0.jpg)
13
- <!-- DIAGRAM_IMAGE_END -->
14
-
15
- 1. **Dependency Check**: It reads the `did` prop and checks against the blocklet's metadata (`window.blocklet.optionalComponents`) to determine if the required components are installed.
16
- 2. **Permission Check**: If any components are missing, it uses the `SessionPermission` component to verify if the current user's role matches those specified in the `roles` prop.
17
- 3. **Conditional Rendering**:
18
- * If all dependencies are installed, it renders its `children`.
19
- * If dependencies are missing and the user has permission, it displays a pop-up installation panel.
20
- * If dependencies are missing and the user lacks permission, it either shows a suggestion to contact an admin or renders a `fallback` component if `noPermissionMute` is enabled.
21
-
22
- ## Basic Usage
23
-
24
- Wrap any component or feature that relies on an optional blocklet with `ComponentInstaller`. Provide the DID of the required component.
25
-
26
- ```jsx "MyFeature.jsx" icon=logos:react
27
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
28
- import MyDependentComponent from './MyDependentComponent';
29
-
30
- export default function MyFeature() {
31
- // Replace with the actual DID of the required component
32
- const requiredComponentDid = 'z8ia2427634f1e909a304e2b963715a18';
33
-
34
- return (
35
- <ComponentInstaller did={requiredComponentDid}>
36
- {/* This component will only be rendered if the dependency is met */}
37
- <MyDependentComponent />
38
- </ComponentInstaller>
39
- );
40
- }
41
- ```
42
-
43
- ## Props
44
-
45
- The `ComponentInstaller` accepts the following props to customize its behavior.
46
-
47
- <x-field-group>
48
- <x-field data-name="did" data-type="string | string[]" data-required="true">
49
- <x-field-desc markdown>The DID (or an array of DIDs) of the component dependencies to check. This is the primary identifier for the blocklet(s) you need.</x-field-desc>
50
- </x-field>
51
- <x-field data-name="children" data-type="any" data-required="true">
52
- <x-field-desc markdown>The content to render once all dependencies are confirmed to be installed. Can be a standard React node or a render function.</x-field-desc>
53
- </x-field>
54
- <x-field data-name="roles" data-type="string[]" data-default='["owner", "admin"]'>
55
- <x-field-desc markdown>An array of user roles that are permitted to see the installation UI and install missing components.</x-field-desc>
56
- </x-field>
57
- <x-field data-name="fallback" data-type="React.ReactNode" data-required="false">
58
- <x-field-desc markdown>A fallback component to display while checking for dependencies or when `noPermissionMute` is active for a user without installation rights.</x-field-desc>
59
- </x-field>
60
- <x-field data-name="noPermissionMute" data-type="boolean" data-default="false">
61
- <x-field-desc markdown>If `true`, users without permission will see the `fallback` component (or nothing) instead of the "contact admin" message.</x-field-desc>
62
- </x-field>
63
- <x-field data-name="disabled" data-type="boolean" data-default="false">
64
- <x-field-desc markdown>If `true`, the component bypasses all checks and immediately renders its `children`.</x-field-desc>
65
- </x-field>
66
- <x-field data-name="onInstalled" data-type="function" data-required="false">
67
- <x-field-desc markdown>A callback function that is triggered after the dependency check is complete. It receives the list of installed components.</x-field-desc>
68
- </x-field>
69
- <x-field data-name="onError" data-type="function" data-required="false">
70
- <x-field-desc markdown>A callback function that is triggered if an error occurs during the dependency check. It receives the list of components that caused the error.</x-field-desc>
71
- </x-field>
72
- <x-field data-name="onClose" data-type="function" data-required="false">
73
- <x-field-desc markdown>A callback function invoked when the installation pop-up is closed.</x-field-desc>
74
- </x-field>
75
- <x-field data-name="closeByOutSize" data-type="boolean" data-default="false">
76
- <x-field-desc markdown>If `true`, the installation pop-up will close when the user clicks outside of it.</x-field-desc>
77
- </x-field>
78
- <x-field data-name="warnIcon" data-type="React.ReactNode" data-required="false">
79
- <x-field-desc markdown>A custom React node to replace the default warning icon in the installation pop-up.</x-field-desc>
80
- </x-field>
81
- </x-field-group>
82
-
83
- ## Advanced Usage
84
-
85
- ### Checking Multiple Components
86
-
87
- You can pass an array of DIDs to the `did` prop to check for multiple dependencies at once. The children will only render if all specified components are installed.
88
-
89
- ```jsx "MyDashboard.jsx" icon=logos:react
90
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
91
- import AnalyticsWidget from './AnalyticsWidget';
92
- import CmsWidget from './CmsWidget';
93
-
94
- export default function MyDashboard() {
95
- const requiredDids = [
96
- 'z8ia2427634f1e909a304e2b963715a18', // Analytics Service
97
- 'z8ia3c1f2e4b8e6a1b2c3d4e5f6a7b8c9', // CMS Service
98
- ];
99
-
100
- return (
101
- <ComponentInstaller did={requiredDids}>
102
- <AnalyticsWidget />
103
- <CmsWidget />
104
- </ComponentInstaller>
105
- );
106
- }
107
- ```
108
-
109
- ### Using a Fallback for Loading States
110
-
111
- Provide a `fallback` component to improve the user experience while the dependency check is in progress. This is also useful with `noPermissionMute` to display a placeholder for unauthorized users.
112
-
113
- ```jsx "FeatureWithLoading.jsx" icon=logos:react
114
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
115
- import CircularProgress from '@mui/material/CircularProgress';
116
- import Box from '@mui/material/Box';
117
- import MyDependentComponent from './MyDependentComponent';
118
-
119
- export default function FeatureWithLoading() {
120
- const LoadingSpinner = (
121
- <Box sx={{ display: 'flex', justifyContent: 'center', p: 4 }}>
122
- <CircularProgress />
123
- </Box>
124
- );
125
-
126
- return (
127
- <ComponentInstaller
128
- did="z8ia2427634f1e909a304e2b963715a18"
129
- fallback={LoadingSpinner}
130
- noPermissionMute={true}
131
- >
132
- <MyDependentComponent />
133
- </ComponentInstaller>
134
- );
135
- }
136
- ```
137
-
138
- ### Custom UI with Render Props
139
-
140
- For full control over the UI, you can pass a function as `children`. This function receives an object with `hasPermission`, `optComponents`, and `installStatus`, allowing you to build a completely custom installation interface.
141
-
142
- ```jsx "CustomInstallerButton.jsx" icon=logos:react
143
- import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
144
- import Button from '@mui/material/Button';
145
-
146
- export default function CustomInstallerButton() {
147
- const requiredDid = 'z8ia2427634f1e909a304e2b963715a18';
148
-
149
- return (
150
- <ComponentInstaller did={requiredDid}>
151
- {({ hasPermission, optComponents, installStatus }) => {
152
- const isMissing = optComponents.length > 0;
153
- const status = installStatus[requiredDid] || 'not_installed';
154
-
155
- if (!isMissing) {
156
- return <p>Feature is ready to use!</p>;
157
- }
158
-
159
- if (!hasPermission) {
160
- return <p>Please ask an admin to install the required component.</p>;
161
- }
162
-
163
- return (
164
- <Button
165
- variant="contained"
166
- disabled={status !== 'not_installed'}
167
- onClick={() => window.open(optComponents[0].installUrl, '_blank')}
168
- >
169
- {status === 'not_installed' ? `Install ${optComponents[0].meta.title}` : `Installing... (${status})`}
170
- </Button>
171
- );
172
- }}
173
- </ComponentInstaller>
174
- );
175
- }
176
- ```
177
-
178
- ## Summary
179
-
180
- The `ComponentInstaller` is a powerful component for managing optional dependencies within a blocklet application. It provides a structured and user-friendly way to ensure that required components are available, guiding administrators through the installation process when necessary. By using this component, you can build more resilient and feature-rich applications that adapt to the user's environment.
181
-
182
- For further details on managing components, you may also be interested in the [BlockletStudio](./components-component-management-blocklet-studio.md) component, which offers a more comprehensive interface for resource and component management.