@blocklet/ui-react 3.1.47 → 3.1.49

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 (98) hide show
  1. package/.aigne/doc-smith/config.yaml +76 -0
  2. package/.aigne/doc-smith/history.yaml +9 -0
  3. package/.aigne/doc-smith/output/structure-plan.json +249 -0
  4. package/.aigne/doc-smith/upload-cache.yaml +528 -0
  5. package/docs/_sidebar.md +19 -0
  6. package/docs/components-component-management-blocklet-studio.ja.md +194 -0
  7. package/docs/components-component-management-blocklet-studio.md +194 -0
  8. package/docs/components-component-management-blocklet-studio.zh-TW.md +194 -0
  9. package/docs/components-component-management-blocklet-studio.zh.md +194 -0
  10. package/docs/components-component-management-component-installer.ja.md +256 -0
  11. package/docs/components-component-management-component-installer.md +256 -0
  12. package/docs/components-component-management-component-installer.zh-TW.md +256 -0
  13. package/docs/components-component-management-component-installer.zh.md +256 -0
  14. package/docs/components-component-management.ja.md +59 -0
  15. package/docs/components-component-management.md +59 -0
  16. package/docs/components-component-management.zh-TW.md +59 -0
  17. package/docs/components-component-management.zh.md +59 -0
  18. package/docs/components-layout-dashboard.ja.md +231 -0
  19. package/docs/components-layout-dashboard.md +231 -0
  20. package/docs/components-layout-dashboard.zh-TW.md +231 -0
  21. package/docs/components-layout-dashboard.zh.md +231 -0
  22. package/docs/components-layout-footer.ja.md +165 -0
  23. package/docs/components-layout-footer.md +165 -0
  24. package/docs/components-layout-footer.zh-TW.md +165 -0
  25. package/docs/components-layout-footer.zh.md +165 -0
  26. package/docs/components-layout-header.ja.md +233 -0
  27. package/docs/components-layout-header.md +233 -0
  28. package/docs/components-layout-header.zh-TW.md +233 -0
  29. package/docs/components-layout-header.zh.md +233 -0
  30. package/docs/components-layout.ja.md +50 -0
  31. package/docs/components-layout.md +50 -0
  32. package/docs/components-layout.zh-TW.md +50 -0
  33. package/docs/components-layout.zh.md +50 -0
  34. package/docs/components-notifications.ja.md +173 -0
  35. package/docs/components-notifications.md +173 -0
  36. package/docs/components-notifications.zh-TW.md +174 -0
  37. package/docs/components-notifications.zh.md +173 -0
  38. package/docs/components-user-management-user-center.ja.md +183 -0
  39. package/docs/components-user-management-user-center.md +183 -0
  40. package/docs/components-user-management-user-center.zh-TW.md +183 -0
  41. package/docs/components-user-management-user-center.zh.md +183 -0
  42. package/docs/components-user-management-user-sessions.ja.md +164 -0
  43. package/docs/components-user-management-user-sessions.md +164 -0
  44. package/docs/components-user-management-user-sessions.zh-TW.md +164 -0
  45. package/docs/components-user-management-user-sessions.zh.md +164 -0
  46. package/docs/components-user-management.ja.md +76 -0
  47. package/docs/components-user-management.md +76 -0
  48. package/docs/components-user-management.zh-TW.md +76 -0
  49. package/docs/components-user-management.zh.md +76 -0
  50. package/docs/components-utilities-icon.ja.md +106 -0
  51. package/docs/components-utilities-icon.md +106 -0
  52. package/docs/components-utilities-icon.zh-TW.md +106 -0
  53. package/docs/components-utilities-icon.zh.md +106 -0
  54. package/docs/components-utilities.ja.md +136 -0
  55. package/docs/components-utilities.md +136 -0
  56. package/docs/components-utilities.zh-TW.md +136 -0
  57. package/docs/components-utilities.zh.md +136 -0
  58. package/docs/components.ja.md +27 -0
  59. package/docs/components.md +27 -0
  60. package/docs/components.zh-TW.md +27 -0
  61. package/docs/components.zh.md +27 -0
  62. package/docs/core-concepts.ja.md +164 -0
  63. package/docs/core-concepts.md +164 -0
  64. package/docs/core-concepts.zh-TW.md +164 -0
  65. package/docs/core-concepts.zh.md +164 -0
  66. package/docs/getting-started.ja.md +132 -0
  67. package/docs/getting-started.md +132 -0
  68. package/docs/getting-started.zh-TW.md +132 -0
  69. package/docs/getting-started.zh.md +132 -0
  70. package/docs/hooks-api.ja.md +214 -0
  71. package/docs/hooks-api.md +214 -0
  72. package/docs/hooks-api.zh-TW.md +214 -0
  73. package/docs/hooks-api.zh.md +214 -0
  74. package/docs/how-to-guides.ja.md +413 -0
  75. package/docs/how-to-guides.md +413 -0
  76. package/docs/how-to-guides.zh-TW.md +413 -0
  77. package/docs/how-to-guides.zh.md +413 -0
  78. package/docs/overview.ja.md +91 -0
  79. package/docs/overview.md +91 -0
  80. package/docs/overview.zh-TW.md +91 -0
  81. package/docs/overview.zh.md +91 -0
  82. package/glossary.md +12 -0
  83. package/lib/Dashboard/index.js +46 -42
  84. package/lib/Footer/index.js +51 -36
  85. package/lib/Header/index.js +48 -44
  86. package/lib/UserCenter/components/settings.js +1 -0
  87. package/lib/UserCenter/components/user-center.js +133 -133
  88. package/lib/blocklets.d.ts +13 -2
  89. package/lib/blocklets.js +40 -40
  90. package/lib/common/header-addons.js +37 -33
  91. package/package.json +7 -7
  92. package/src/Dashboard/index.jsx +8 -3
  93. package/src/Footer/index.jsx +22 -4
  94. package/src/Header/index.tsx +7 -2
  95. package/src/UserCenter/components/settings.tsx +1 -0
  96. package/src/UserCenter/components/user-center.tsx +6 -6
  97. package/src/blocklets.js +18 -9
  98. package/src/common/header-addons.jsx +7 -2
@@ -0,0 +1,194 @@
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) 文档。
@@ -0,0 +1,256 @@
1
+ # ComponentInstaller
2
+
3
+ `ComponentInstaller` は、他の Blocklet に依存する機能のゲートキーパーとして機能するユーティリティコンポーネントです。指定されたコンポーネントの依存関係がインストールされているかどうかを検証します。インストールされていない場合、管理者(デフォルトでは `owner` または `admin` ロール)が直接インストールするためのユーザーフレンドリーなインターフェースを提供します。ユーザーが必要な権限を持っていない場合は、管理者に連絡するよう促すメッセージを表示します。
4
+
5
+ このコンポーネントは、不足しているオプションの依存関係を適切に処理できる堅牢なアプリケーションを作成するために不可欠であり、管理者をインストールプロセスを通じてガイドすることでユーザーエクスペリエンスを向上させます。
6
+
7
+ ## 仕組み
8
+
9
+ このコンポーネントのロジックは、子コンポーネントをレンダリングする前に依存関係が満たされていることを確認するため、明確で順次的なプロセスに従います。
10
+
11
+ ```d2
12
+ direction: down
13
+
14
+ start: {
15
+ label: "開始"
16
+ shape: oval
17
+ }
18
+
19
+ check_dependencies: {
20
+ label: "'did' プロパティで定義された依存関係を確認"
21
+ shape: rectangle
22
+ }
23
+
24
+ is_installed: {
25
+ label: "すべての依存関係はインストール済みか?"
26
+ shape: diamond
27
+ }
28
+
29
+ render_children: {
30
+ label: "子コンポーネントをレンダリング"
31
+ shape: rectangle
32
+ style.fill: "#d4edda"
33
+ }
34
+
35
+ check_permission: {
36
+ label: "'roles' プロパティに対してユーザーのロールを確認"
37
+ shape: rectangle
38
+ }
39
+
40
+ has_permission: {
41
+ label: "ユーザーに権限があるか?"
42
+ shape: diamond
43
+ }
44
+
45
+ display_installer: {
46
+ label: "インストーラーUIを表示"
47
+ shape: rectangle
48
+ style.fill: "#cce5ff"
49
+ }
50
+
51
+ is_mute: {
52
+ label: "'noPermissionMute' プロパティは true か?"
53
+ shape: diamond
54
+ }
55
+
56
+ display_suggestion: {
57
+ label: "'管理者に連絡' の提案を表示"
58
+ shape: rectangle
59
+ style.fill: "#f8d7da"
60
+ }
61
+
62
+ render_fallback: {
63
+ label: "フォールバックコンポーネントまたは null をレンダリング"
64
+ shape: rectangle
65
+ }
66
+
67
+ end: {
68
+ label: "終了"
69
+ shape: oval
70
+ }
71
+
72
+ start -> check_dependencies
73
+ check_dependencies -> is_installed
74
+ is_installed -> render_children: "はい"
75
+ is_installed -> check_permission: "いいえ"
76
+ render_children -> end
77
+
78
+ check_permission -> has_permission
79
+ has_permission -> display_installer: "はい"
80
+ has_permission -> is_mute: "いいえ"
81
+ display_installer -> end
82
+
83
+ is_mute -> render_fallback: "はい"
84
+ is_mute -> display_suggestion: "いいえ"
85
+ render_fallback -> end
86
+ display_suggestion -> end
87
+ ```
88
+
89
+ 1. **依存関係のチェック**: `did` プロパティを読み取り、Blocklet のメタデータ(`window.blocklet.optionalComponents`)と照合して、必要なコンポーネントがインストールされているかどうかを判断します。
90
+ 2. **権限チェック**: 不足しているコンポーネントがある場合、`SessionPermission` コンポーネントを使用して、現在のユーザーのロールが `roles` プロパティで指定されたものと一致するかどうかを検証します。
91
+ 3. **条件付きレンダリング**:
92
+ * すべての依存関係がインストールされている場合、その `children` をレンダリングします。
93
+ * 依存関係が不足しており、ユーザーに権限がある場合、ポップアップのインストールパネルを表示します。
94
+ * 依存関係が不足しており、ユーザーに権限がない場合、管理者に連絡するよう提案を表示するか、`noPermissionMute` が有効な場合は `fallback` コンポーネントをレンダリングします。
95
+
96
+ ## 基本的な使い方
97
+
98
+ オプションの Blocklet に依存するコンポーネントや機能を `ComponentInstaller` でラップします。必要なコンポーネントの DID を提供してください。
99
+
100
+ ```jsx "MyFeature.jsx" icon=logos:react
101
+ import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
102
+ import MyDependentComponent from './MyDependentComponent';
103
+
104
+ export default function MyFeature() {
105
+ // 必要なコンポーネントの実際の DID に置き換えてください
106
+ const requiredComponentDid = 'z8ia2427634f1e909a304e2b963715a18';
107
+
108
+ return (
109
+ <ComponentInstaller did={requiredComponentDid}>
110
+ {/* このコンポーネントは依存関係が満たされている場合にのみレンダリングされます */}
111
+ <MyDependentComponent />
112
+ </ComponentInstaller>
113
+ );
114
+ }
115
+ ```
116
+
117
+ ## Props
118
+
119
+ `ComponentInstaller` は、その動作をカスタマイズするために以下の props を受け入れます。
120
+
121
+ <x-field-group>
122
+ <x-field data-name="did" data-type="string | string[]" data-required="true">
123
+ <x-field-desc markdown>チェックするコンポーネントの依存関係の DID(または DID の配列)。これは、必要な Blocklet の主要な識別子です。</x-field-desc>
124
+ </x-field>
125
+ <x-field data-name="children" data-type="any" data-required="true">
126
+ <x-field-desc markdown>すべての依存関係がインストールされていることを確認した後にレンダリングするコンテンツ。標準の React ノードまたはレンダー関数を指定できます。</x-field-desc>
127
+ </x-field>
128
+ <x-field data-name="roles" data-type="string[]" data-default='["owner", "admin"]'>
129
+ <x-field-desc markdown>インストール UI を表示し、不足しているコンポーネントをインストールすることが許可されているユーザーロールの配列。</x-field-desc>
130
+ </x-field>
131
+ <x-field data-name="fallback" data-type="React.ReactNode" data-required="false">
132
+ <x-field-desc markdown>依存関係をチェックしている間、またはインストール権限のないユーザーに対して `noPermissionMute` が有効な場合に表示するフォールバックコンポーネント。</x-field-desc>
133
+ </x-field>
134
+ <x-field data-name="noPermissionMute" data-type="boolean" data-default="false">
135
+ <x-field-desc markdown>`true` の場合、権限のないユーザーには「管理者に連絡」メッセージの代わりに `fallback` コンポーネント(または何も表示しない)が表示されます。</x-field-desc>
136
+ </x-field>
137
+ <x-field data-name="disabled" data-type="boolean" data-default="false">
138
+ <x-field-desc markdown>`true` の場合、コンポーネントはすべてのチェックをバイパスし、即座にその `children` をレンダリングします。</x-field-desc>
139
+ </x-field>
140
+ <x-field data-name="onInstalled" data-type="function" data-required="false">
141
+ <x-field-desc markdown>依存関係のチェックが完了した後にトリガーされるコールバック関数。インストール済みのコンポーネントのリストを受け取ります。</x-field-desc>
142
+ </x-field>
143
+ <x-field data-name="onError" data-type="function" data-required="false">
144
+ <x-field-desc markdown>依存関係のチェック中にエラーが発生した場合にトリガーされるコールバック関数。エラーの原因となったコンポーネントのリストを受け取ります。</x-field-desc>
145
+ </x-field>
146
+ <x-field data-name="onClose" data-type="function" data-required="false">
147
+ <x-field-desc markdown>インストールのポップアップが閉じられたときに呼び出されるコールバック関数。</x-field-desc>
148
+ </x-field>
149
+ <x-field data-name="closeByOutSize" data-type="boolean" data-default="false">
150
+ <x-field-desc markdown>`true` の場合、ユーザーがポップアップの外側をクリックすると、インストールのポップアップが閉じます。</x-field-desc>
151
+ </x-field>
152
+ <x-field data-name="warnIcon" data-type="React.ReactNode" data-required="false">
153
+ <x-field-desc markdown>インストールのポップアップのデフォルトの警告アイコンを置き換えるためのカスタム React ノード。</x-field-desc>
154
+ </x-field>
155
+ </x-field-group>
156
+
157
+ ## 高度な使い方
158
+
159
+ ### 複数のコンポーネントのチェック
160
+
161
+ `did` プロパティに DID の配列を渡すことで、複数の依存関係を一度にチェックできます。指定されたすべてのコンポーネントがインストールされている場合にのみ、子はレンダリングされます。
162
+
163
+ ```jsx "MyDashboard.jsx" icon=logos:react
164
+ import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
165
+ import AnalyticsWidget from './AnalyticsWidget';
166
+ import CmsWidget from './CmsWidget';
167
+
168
+ export default function MyDashboard() {
169
+ const requiredDids = [
170
+ 'z8ia2427634f1e909a304e2b963715a18', // 分析サービス
171
+ 'z8ia3c1f2e4b8e6a1b2c3d4e5f6a7b8c9', // CMS サービス
172
+ ];
173
+
174
+ return (
175
+ <ComponentInstaller did={requiredDids}>
176
+ <AnalyticsWidget />
177
+ <CmsWidget />
178
+ </ComponentInstaller>
179
+ );
180
+ }
181
+ ```
182
+
183
+ ### ローディング状態のためのフォールバックの使用
184
+
185
+ 依存関係のチェックが進行中の間、`fallback` コンポーネントを提供してユーザーエクスペリエンスを向上させます。これは、`noPermissionMute` と共に使用して、権限のないユーザーにプレースホルダーを表示する場合にも役立ちます。
186
+
187
+ ```jsx "FeatureWithLoading.jsx" icon=logos:react
188
+ import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
189
+ import CircularProgress from '@mui/material/CircularProgress';
190
+ import Box from '@mui/material/Box';
191
+ import MyDependentComponent from './MyDependentComponent';
192
+
193
+ export default function FeatureWithLoading() {
194
+ const LoadingSpinner = (
195
+ <Box sx={{ display: 'flex', justifyContent: 'center', p: 4 }}>
196
+ <CircularProgress />
197
+ </Box>
198
+ );
199
+
200
+ return (
201
+ <ComponentInstaller
202
+ did="z8ia2427634f1e909a304e2b963715a18"
203
+ fallback={LoadingSpinner}
204
+ noPermissionMute={true}
205
+ >
206
+ <MyDependentComponent />
207
+ </ComponentInstaller>
208
+ );
209
+ }
210
+ ```
211
+
212
+ ### レンダープロップによるカスタム UI
213
+
214
+ UI を完全に制御するために、`children` として関数を渡すことができます。この関数は `hasPermission`、`optComponents`、および `installStatus` を含むオブジェクトを受け取り、完全にカスタムのインストールインターフェースを構築することができます。
215
+
216
+ ```jsx "CustomInstallerButton.jsx" icon=logos:react
217
+ import ComponentInstaller from '@arcblock/blocklet-ui-react/lib/ComponentInstaller';
218
+ import Button from '@mui/material/Button';
219
+
220
+ export default function CustomInstallerButton() {
221
+ const requiredDid = 'z8ia2427634f1e909a304e2b963715a18';
222
+
223
+ return (
224
+ <ComponentInstaller did={requiredDid}>
225
+ {({ hasPermission, optComponents, installStatus }) => {
226
+ const isMissing = optComponents.length > 0;
227
+ const status = installStatus[requiredDid] || 'not_installed';
228
+
229
+ if (!isMissing) {
230
+ return <p>Feature is ready to use!</p>;
231
+ }
232
+
233
+ if (!hasPermission) {
234
+ return <p>Please ask an admin to install the required component.</p>;
235
+ }
236
+
237
+ return (
238
+ <Button
239
+ variant="contained"
240
+ disabled={status !== 'not_installed'}
241
+ onClick={() => window.open(optComponents[0].installUrl, '_blank')}
242
+ >
243
+ {status === 'not_installed' ? `Install ${optComponents[0].meta.title}` : `Installing... (${status})`}
244
+ </Button>
245
+ );
246
+ }}
247
+ </ComponentInstaller>
248
+ );
249
+ }
250
+ ```
251
+
252
+ ## まとめ
253
+
254
+ `ComponentInstaller` は、Blocklet アプリケーション内でオプションの依存関係を管理するための強力なコンポーネントです。必要なコンポーネントが利用可能であることを保証するための構造化されたユーザーフレンドリーな方法を提供し、必要に応じて管理者をインストールプロセスを通じてガイドします。このコンポーネントを使用することで、ユーザーの環境に適応する、より回復力があり機能豊富なアプリケーションを構築できます。
255
+
256
+ コンポーネントの管理に関する詳細については、リソースとコンポーネント管理のためのより包括的なインターフェースを提供する [BlockletStudio](./components-component-management-blocklet-studio.md) コンポーネントにも興味があるかもしれません。