@blueking/chat-x 0.0.4 → 0.0.6
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.
- package/dist/index.css +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/generated/docs/activity-message.md +428 -0
- package/dist/mcp/generated/docs/ai-image.md +227 -0
- package/dist/mcp/generated/docs/ai-loading.md +129 -0
- package/dist/mcp/generated/docs/ai-selection.md +436 -0
- package/dist/mcp/generated/docs/animation-text.md +199 -0
- package/dist/mcp/generated/docs/assistant-message.md +424 -0
- package/dist/mcp/generated/docs/chat-container.md +365 -0
- package/dist/mcp/generated/docs/chat-input.md +625 -0
- package/dist/mcp/generated/docs/cite-content.md +138 -0
- package/dist/mcp/generated/docs/code-content.md +199 -0
- package/dist/mcp/generated/docs/common-error-content.md +70 -0
- package/dist/mcp/generated/docs/constants.md +216 -0
- package/dist/mcp/generated/docs/content-render.md +238 -0
- package/dist/mcp/generated/docs/delete-tool.md +188 -0
- package/dist/mcp/generated/docs/desc-panel.md +139 -0
- package/dist/mcp/generated/docs/execution-summary.md +126 -0
- package/dist/mcp/generated/docs/file-content.md +300 -0
- package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
- package/dist/mcp/generated/docs/flow-message.md +305 -0
- package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
- package/dist/mcp/generated/docs/image-content.md +178 -0
- package/dist/mcp/generated/docs/image-preview-group.md +181 -0
- package/dist/mcp/generated/docs/image-preview.md +224 -0
- package/dist/mcp/generated/docs/info-message.md +124 -0
- package/dist/mcp/generated/docs/key-value-content.md +124 -0
- package/dist/mcp/generated/docs/latex-content.md +196 -0
- package/dist/mcp/generated/docs/loading-message.md +171 -0
- package/dist/mcp/generated/docs/markdown-content.md +186 -0
- package/dist/mcp/generated/docs/markdown-latex.md +208 -0
- package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
- package/dist/mcp/generated/docs/mermaid-content.md +185 -0
- package/dist/mcp/generated/docs/message-container.md +534 -0
- package/dist/mcp/generated/docs/message-render.md +329 -0
- package/dist/mcp/generated/docs/message-tools.md +376 -0
- package/dist/mcp/generated/docs/messages.md +472 -0
- package/dist/mcp/generated/docs/overflow-tips.md +209 -0
- package/dist/mcp/generated/docs/reasoning-message.md +233 -0
- package/dist/mcp/generated/docs/reference-content.md +132 -0
- package/dist/mcp/generated/docs/scroll-btn.md +155 -0
- package/dist/mcp/generated/docs/selection-footer.md +75 -0
- package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
- package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
- package/dist/mcp/generated/docs/shortcut-render.md +418 -0
- package/dist/mcp/generated/docs/text-content.md +74 -0
- package/dist/mcp/generated/docs/theme.md +388 -0
- package/dist/mcp/generated/docs/tool-btn.md +254 -0
- package/dist/mcp/generated/docs/tool-message.md +217 -0
- package/dist/mcp/generated/docs/toolcall-render.md +299 -0
- package/dist/mcp/generated/docs/use-animation-text.md +198 -0
- package/dist/mcp/generated/docs/use-clipboard.md +206 -0
- package/dist/mcp/generated/docs/use-command-selection.md +128 -0
- package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
- package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
- package/dist/mcp/generated/docs/use-global-config.md +154 -0
- package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
- package/dist/mcp/generated/docs/use-message-group.md +175 -0
- package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
- package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
- package/dist/mcp/generated/docs/user-feedback.md +229 -0
- package/dist/mcp/generated/docs/user-message.md +347 -0
- package/dist/mcp/generated/index.json +1311 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +42 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +43 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-component-doc.d.ts +19 -0
- package/dist/mcp/tools/get-component-doc.js +60 -0
- package/dist/mcp/tools/get-component-doc.js.map +1 -0
- package/dist/mcp/tools/list-components.d.ts +35 -0
- package/dist/mcp/tools/list-components.js +147 -0
- package/dist/mcp/tools/list-components.js.map +1 -0
- package/dist/mcp/tools/search-docs.d.ts +14 -0
- package/dist/mcp/tools/search-docs.js +82 -0
- package/dist/mcp/tools/search-docs.js.map +1 -0
- package/dist/mcp/utils/doc-loader.d.ts +35 -0
- package/dist/mcp/utils/doc-loader.js +64 -0
- package/dist/mcp/utils/doc-loader.js.map +1 -0
- package/package.json +5 -7
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
MessageTools 渲染 AI 消息底部工具区:左侧消息工具(复制、引用、重建等),右侧更新工具;点赞/踩会弹出 UserFeedback 收集原因。 工具 id 为 delete 时用 DeleteTool 替代普通 ToolBtn 做二次确认;其余操作通过 onAction 异步解析或直出。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **tool-btn** — 普通工具项由 ToolBtn 渲染
|
|
8
|
+
- **user-feedback** — like/unlike 时弹出反馈表单
|
|
9
|
+
- **delete-tool** — id 为 delete 时替换为带确认的删除按钮
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# MessageTools 消息工具栏
|
|
15
|
+
|
|
16
|
+
> **层级**:分子组件 · **功能域**:工具与反馈
|
|
17
|
+
|
|
18
|
+
AI 消息的操作工具栏组件,由**左侧消息工具区**和**右侧更新工具区**两部分组成,中间以分隔线分隔。仅 `like` / `unlike` 按钮会弹出反馈表单(`UserFeedback`),其余按钮直接触发 `onAction`。
|
|
19
|
+
|
|
20
|
+
## 组件结构
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
┌─────────────────────────────────────────────────────┐
|
|
24
|
+
│ .message-tools-container │
|
|
25
|
+
│ ┌─────────────────────┐ │ ┌───────────────────┐ │
|
|
26
|
+
│ │ messageTools │ │ │ updateTools │ │
|
|
27
|
+
│ │ copy cite rebuild… │ │ │ like unlike del │ │
|
|
28
|
+
│ └─────────────────────┘ │ └───────────────────┘ │
|
|
29
|
+
│ 左侧区域 分隔线 右侧区域 │
|
|
30
|
+
└─────────────────────────────────────────────────────┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- 分隔线(`.ai-divider`)仅在 `updateTools` 非空时显示
|
|
34
|
+
- `updateTools` 中 `id` 为 `like` / `unlike` 的按钮被 `Tippy` 弹窗包裹,点击后展示 `UserFeedback` 反馈表单
|
|
35
|
+
- `updateTools` 中 `id` 为 `delete` 的按钮使用 `DeleteTool` 组件,点击后展示**确认删除弹窗**(含"删除"/"取消"按钮),确认后触发 `onAction`
|
|
36
|
+
- `updateTools` 中其他按钮直接触发 `onAction`,不弹表单
|
|
37
|
+
- `messageTools` 中 `id` 为 `delete` 的按钮同样使用 `DeleteTool` 组件弹确认框
|
|
38
|
+
|
|
39
|
+
## 基础用法
|
|
40
|
+
|
|
41
|
+
```vue
|
|
42
|
+
<template>
|
|
43
|
+
<MessageTools
|
|
44
|
+
:on-action="handleAction"
|
|
45
|
+
@feedback="handleFeedback"
|
|
46
|
+
/>
|
|
47
|
+
</template>
|
|
48
|
+
|
|
49
|
+
<script setup lang="ts">
|
|
50
|
+
import { MessageTools, type IToolBtn } from '@blueking/chat-x';
|
|
51
|
+
|
|
52
|
+
// like / unlike 必须返回 Promise<string[]>,作为反馈表单的选项
|
|
53
|
+
const handleAction = async (tool: IToolBtn) => {
|
|
54
|
+
if (tool.id === 'like' || tool.id === 'unlike') {
|
|
55
|
+
return ['回答准确', '信息全面', '表达清晰', '解决了问题'];
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// 用户在反馈表单点击"提交"后触发
|
|
60
|
+
const handleFeedback = (tool: IToolBtn, reasonList: string[], otherReason: string) => {
|
|
61
|
+
console.log('反馈:', tool.id, reasonList, otherReason);
|
|
62
|
+
};
|
|
63
|
+
</script>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**渲染效果**
|
|
67
|
+
|
|
68
|
+
## 反馈交互流程
|
|
69
|
+
|
|
70
|
+
点赞(`like`)和不满意(`unlike`)按钮的完整交互流程:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
用户点击 like/unlike
|
|
74
|
+
│
|
|
75
|
+
▼
|
|
76
|
+
调用 onAction(tool)(显示 loading 状态)
|
|
77
|
+
│
|
|
78
|
+
▼
|
|
79
|
+
onAction 返回 string[](反馈选项列表)
|
|
80
|
+
│
|
|
81
|
+
▼
|
|
82
|
+
弹出 UserFeedback 表单(显示选项)
|
|
83
|
+
│
|
|
84
|
+
┌────┴────┐
|
|
85
|
+
取消 提交
|
|
86
|
+
│ │
|
|
87
|
+
关闭弹窗 emit('feedback', tool, reasonList, otherReason)
|
|
88
|
+
│
|
|
89
|
+
▼
|
|
90
|
+
按钮切换为激活图标(activeLike / activeUnLike)
|
|
91
|
+
↑ 再次点击同一按钮 → 取消激活并关闭弹窗(不触发 feedback)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**图标切换说明**:
|
|
95
|
+
|
|
96
|
+
| 状态 | `like` 按钮图标 | `like` Tooltip | `unlike` 按钮图标 | `unlike` Tooltip |
|
|
97
|
+
| ------------ | ------------------------ | ---------------- | -------------------------- | ---------------- |
|
|
98
|
+
| 未提交 | `like`(空心) | 原始 description | `unlike`(空心) | 原始 description |
|
|
99
|
+
| 已提交点赞 | `activeLike`(实心填充) | 取消满意 | `unlike`(空心) | 原始 description |
|
|
100
|
+
| 已提交不满意 | `like`(空心) | 原始 description | `activeUnLike`(实心填充) | 取消不满意 |
|
|
101
|
+
|
|
102
|
+
> 激活态下 tooltip 内容自动切换为"取消满意"/"取消不满意",用于提示用户再次点击可取消评价。
|
|
103
|
+
|
|
104
|
+
## 默认工具列表
|
|
105
|
+
|
|
106
|
+
### messageTools(左侧)
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const CONST_MESSAGE_TOOLS = [
|
|
110
|
+
{ id: 'copy', name: '复制', description: '复制' },
|
|
111
|
+
{ id: 'cite', name: '引用', description: '引用' },
|
|
112
|
+
{ id: 'rebuild', name: '重新生成', description: '重新生成' },
|
|
113
|
+
{ id: 'share', name: '分享', description: '分享' },
|
|
114
|
+
];
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### updateTools(右侧)
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const CONST_UPDATE_TOOLS = [
|
|
121
|
+
{ id: 'like', name: '点赞', description: '点赞' },
|
|
122
|
+
{ id: 'unlike', name: '不满意', description: '不满意' },
|
|
123
|
+
{ id: 'delete', name: '删除', description: '删除' },
|
|
124
|
+
];
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> **注意**:`delete` 在 `updateTools` 中**不弹反馈表单**,而是弹出确认删除弹窗(`DeleteTool`)。用户确认后才触发 `onAction`,取消则不触发。
|
|
128
|
+
|
|
129
|
+
## 内置图标 ID
|
|
130
|
+
|
|
131
|
+
`ToolBtn` 会根据 `tool.id` 自动匹配图标,支持以下 ID:
|
|
132
|
+
|
|
133
|
+
| ID | 图标说明 |
|
|
134
|
+
| -------------- | ------------------------------------ |
|
|
135
|
+
| `copy` | 复制 |
|
|
136
|
+
| `cite` | 引用 |
|
|
137
|
+
| `rebuild` | 重新生成 |
|
|
138
|
+
| `share` | 分享 |
|
|
139
|
+
| `like` | 点赞(空心) |
|
|
140
|
+
| `unlike` | 不满意(空心) |
|
|
141
|
+
| `delete` | 删除 |
|
|
142
|
+
| `edit` | 编辑 |
|
|
143
|
+
| `activeLike` | 点赞已激活(实心,由组件内部使用) |
|
|
144
|
+
| `activeUnLike` | 不满意已激活(实心,由组件内部使用) |
|
|
145
|
+
|
|
146
|
+
> ID 不在列表中时,按钮显示 `tool.name` 文本。
|
|
147
|
+
|
|
148
|
+
## 仅显示消息工具(不含反馈)
|
|
149
|
+
|
|
150
|
+
将 `updateTools` 设为空数组可去掉右侧反馈按钮和分隔线:
|
|
151
|
+
|
|
152
|
+
```vue
|
|
153
|
+
<template>
|
|
154
|
+
<MessageTools
|
|
155
|
+
:message-tools="messageTools"
|
|
156
|
+
:update-tools="[]"
|
|
157
|
+
:on-action="handleAction"
|
|
158
|
+
/>
|
|
159
|
+
</template>
|
|
160
|
+
|
|
161
|
+
<script setup lang="ts">
|
|
162
|
+
import { MessageTools, type IToolBtn } from '@blueking/chat-x';
|
|
163
|
+
|
|
164
|
+
const messageTools: IToolBtn[] = [
|
|
165
|
+
{ id: 'copy', name: '复制', description: '复制' },
|
|
166
|
+
{ id: 'cite', name: '引用', description: '引用' },
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
const handleAction = async (tool: IToolBtn) => {
|
|
170
|
+
console.log('操作:', tool.id);
|
|
171
|
+
};
|
|
172
|
+
</script>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**渲染效果**
|
|
176
|
+
|
|
177
|
+
## 自定义工具列表
|
|
178
|
+
|
|
179
|
+
`messageTools` 和 `updateTools` 均可完全替换:
|
|
180
|
+
|
|
181
|
+
```vue
|
|
182
|
+
<template>
|
|
183
|
+
<MessageTools
|
|
184
|
+
:message-tools="customMessageTools"
|
|
185
|
+
:update-tools="customUpdateTools"
|
|
186
|
+
:on-action="handleAction"
|
|
187
|
+
@feedback="handleFeedback"
|
|
188
|
+
/>
|
|
189
|
+
</template>
|
|
190
|
+
|
|
191
|
+
<script setup lang="ts">
|
|
192
|
+
import { MessageTools, type IToolBtn } from '@blueking/chat-x';
|
|
193
|
+
|
|
194
|
+
const customMessageTools: IToolBtn[] = [
|
|
195
|
+
{ id: 'copy', name: '复制', description: '复制消息内容' },
|
|
196
|
+
{ id: 'rebuild', name: '重新生成', description: '重新生成回答' },
|
|
197
|
+
{ id: 'custom-action', name: '自定义', description: '自定义操作' }, // 无图标,显示文本
|
|
198
|
+
];
|
|
199
|
+
|
|
200
|
+
// like / unlike 仍会触发反馈弹窗;delete 弹确认框,确认后触发 onAction
|
|
201
|
+
const customUpdateTools: IToolBtn[] = [
|
|
202
|
+
{ id: 'like', name: '有帮助', description: '这个回答对我有帮助' },
|
|
203
|
+
{ id: 'unlike', name: '没帮助', description: '这个回答没有帮助' },
|
|
204
|
+
{ id: 'delete', name: '删除', description: '删除消息' },
|
|
205
|
+
];
|
|
206
|
+
|
|
207
|
+
const handleAction = async (tool: IToolBtn) => {
|
|
208
|
+
if (tool.id === 'like' || tool.id === 'unlike') {
|
|
209
|
+
return ['回答准确', '信息全面', '表达清晰', '解决了问题'];
|
|
210
|
+
}
|
|
211
|
+
console.log('操作:', tool.id);
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const handleFeedback = (tool: IToolBtn, reasonList: string[], otherReason: string) => {
|
|
215
|
+
console.log('反馈:', tool.id, reasonList, otherReason);
|
|
216
|
+
};
|
|
217
|
+
</script>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**渲染效果**
|
|
221
|
+
|
|
222
|
+
## 工具栏状态控制
|
|
223
|
+
|
|
224
|
+
`messageToolsStatus` 控制工具栏整体状态:
|
|
225
|
+
|
|
226
|
+
| 值 | 效果 |
|
|
227
|
+
| ----------- | ---------------------------------------------------------------------- |
|
|
228
|
+
| `undefined` | 默认,按钮正常可点击,hover 有 tooltip |
|
|
229
|
+
| `disabled` | 按钮显示但不可点击,tooltip 不显示,反馈弹窗无法打开 |
|
|
230
|
+
| `hidden` | `MessageContainer` 检测到此值时不渲染 `MessageTools`(组件自身不处理) |
|
|
231
|
+
|
|
232
|
+
> `hidden` 由 `MessageContainer` 在外部用 `v-if` 判断,`MessageTools` 本身不感知该值。
|
|
233
|
+
|
|
234
|
+
**禁用状态**
|
|
235
|
+
|
|
236
|
+
```vue
|
|
237
|
+
<template>
|
|
238
|
+
<MessageTools
|
|
239
|
+
:message-tools-status="MessageToolsStatus.Disabled"
|
|
240
|
+
:on-action="handleAction"
|
|
241
|
+
@feedback="handleFeedback"
|
|
242
|
+
/>
|
|
243
|
+
</template>
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 自定义 Tippy 配置
|
|
247
|
+
|
|
248
|
+
反馈弹窗的 `Tippy` 默认配置如下,可通过 `tippyOptions` 覆盖:
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
// 内部默认值
|
|
252
|
+
{
|
|
253
|
+
arrow: false,
|
|
254
|
+
interactive: true,
|
|
255
|
+
offset: [0, 6],
|
|
256
|
+
theme: 'ai-chat-box-light light',
|
|
257
|
+
trigger: 'click',
|
|
258
|
+
appendTo: () => document.body,
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
```vue
|
|
263
|
+
<template>
|
|
264
|
+
<MessageTools
|
|
265
|
+
:on-action="handleAction"
|
|
266
|
+
:tippy-options="tippyOptions"
|
|
267
|
+
@feedback="handleFeedback"
|
|
268
|
+
/>
|
|
269
|
+
</template>
|
|
270
|
+
|
|
271
|
+
<script setup lang="ts">
|
|
272
|
+
import { MessageTools, type IToolBtn } from '@blueking/chat-x';
|
|
273
|
+
|
|
274
|
+
const tippyOptions = {
|
|
275
|
+
placement: 'top', // 弹窗方向
|
|
276
|
+
offset: [0, 12], // 偏移量
|
|
277
|
+
appendTo: () => document.querySelector('#my-container') || document.body,
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const handleAction = async (tool: IToolBtn) => {
|
|
281
|
+
if (tool.id === 'like' || tool.id === 'unlike') {
|
|
282
|
+
return ['回答准确', '信息全面'];
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
const handleFeedback = (tool: IToolBtn, reasonList: string[], otherReason: string) => {
|
|
286
|
+
console.log('反馈:', tool.id, reasonList);
|
|
287
|
+
};
|
|
288
|
+
</script>
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
> **注意**:`content`、`theme`、`getReferenceClientRect`、`triggerTarget` 四个选项由组件内部管理,不可通过 `tippyOptions` 覆盖。
|
|
292
|
+
|
|
293
|
+
## 在 MessageContainer 中的使用
|
|
294
|
+
|
|
295
|
+
`MessageContainer` 在每个 Assistant 消息组底部自动渲染 `MessageTools`,无需手动引入:
|
|
296
|
+
|
|
297
|
+
```vue
|
|
298
|
+
<template>
|
|
299
|
+
<MessageContainer
|
|
300
|
+
:messages="messages"
|
|
301
|
+
:message-status="messageStatus"
|
|
302
|
+
:message-tools-status="messageToolsStatus"
|
|
303
|
+
:on-agent-action="handleAgentAction"
|
|
304
|
+
:on-agent-feedback="handleAgentFeedback"
|
|
305
|
+
@stop-streaming="handleStopStreaming"
|
|
306
|
+
/>
|
|
307
|
+
</template>
|
|
308
|
+
|
|
309
|
+
<script setup lang="ts">
|
|
310
|
+
import { computed, ref } from 'vue';
|
|
311
|
+
import { MessageContainer, MessageStatus, MessageToolsStatus, type Message, type IToolBtn } from '@blueking/chat-x';
|
|
312
|
+
|
|
313
|
+
const messageStatus = ref(MessageStatus.Complete);
|
|
314
|
+
|
|
315
|
+
// 流式输出时禁用工具栏,避免误操作
|
|
316
|
+
const messageToolsStatus = computed(() =>
|
|
317
|
+
messageStatus.value === MessageStatus.Streaming ? MessageToolsStatus.Disabled : undefined,
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
// copy 操作由 MessageContainer 内部自动处理(无需在此实现)
|
|
321
|
+
const handleAgentAction = async (tool: IToolBtn, messages: Message[]) => {
|
|
322
|
+
if (tool.id === 'like' || tool.id === 'unlike') {
|
|
323
|
+
return ['回答准确', '信息全面', '表达清晰'];
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
const handleAgentFeedback = (tool: IToolBtn, messages: Message[], reasonList: string[], otherReason: string) => {
|
|
328
|
+
console.log('反馈提交:', tool.id, reasonList, otherReason);
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
const handleStopStreaming = () => {
|
|
332
|
+
messageStatus.value = MessageStatus.Stop;
|
|
333
|
+
};
|
|
334
|
+
</script>
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## API
|
|
338
|
+
|
|
339
|
+
### Props
|
|
340
|
+
|
|
341
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
342
|
+
| ------------------ | -------------------------------------------------------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
|
343
|
+
| messageTools | `IToolBtn[]` | `CONST_MESSAGE_TOOLS` | 左侧工具列表 |
|
|
344
|
+
| updateTools | `IToolBtn[]` | `CONST_UPDATE_TOOLS` | 右侧工具列表(`like`/`unlike` 弹反馈表单,`delete` 弹确认框,其他直接触发 `onAction`) |
|
|
345
|
+
| messageToolsStatus | `MessageToolsStatus` | — | 工具栏状态:`disabled` 禁用按钮和弹窗 |
|
|
346
|
+
| onAction | `(tool: IToolBtn, content?: UserMessage['content'], docSchema?: TagSchema) => Promise<string[] \| void>` | — | 工具操作回调;`like`/`unlike` 需返回 `string[]` 作为反馈选项;`delete` 确认后触发;`content`、`docSchema` 为可选参数,供上层扩展使用 |
|
|
347
|
+
| tippyOptions | `AITippyProps` | — | 覆盖反馈弹窗和删除确认弹窗的默认配置;可覆盖 `placement` 等 |
|
|
348
|
+
|
|
349
|
+
### Events
|
|
350
|
+
|
|
351
|
+
| 事件名 | 参数 | 触发时机 |
|
|
352
|
+
| -------- | ------------------------------------------------------------- | ------------------------------------------ |
|
|
353
|
+
| feedback | `(tool: IToolBtn, reasonList: string[], otherReason: string)` | 用户在反馈表单点击"提交"后触发(not 取消) |
|
|
354
|
+
|
|
355
|
+
## 类型定义
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
import { MessageToolsStatus, type IToolBtn } from '@blueking/chat-x';
|
|
359
|
+
|
|
360
|
+
interface IToolBtn {
|
|
361
|
+
id: string; // 工具唯一标识;与 ToolIconsMap 匹配时显示内置图标,否则显示 name 文本
|
|
362
|
+
name: string; // 工具名称,无对应图标时显示;也用作 tooltip fallback
|
|
363
|
+
description: string; // tooltip 文本
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
enum MessageToolsStatus {
|
|
367
|
+
Disabled = 'disabled', // 禁用:按钮显示但不可点击,弹窗不打开
|
|
368
|
+
Hidden = 'hidden', // 隐藏:由 MessageContainer 外部 v-if 控制,组件本身不处理
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## 关联组件
|
|
373
|
+
|
|
374
|
+
- [ToolBtn](../atomic/tool-btn.md) — 单项工具按钮
|
|
375
|
+
- [UserFeedback](./user-feedback.md) — 点赞/踩反馈面板
|
|
376
|
+
- [DeleteTool](./delete-tool.md) — 删除二次确认
|