@tencentcloud/sdk-mcp 1.7.3 → 1.7.5

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 (135) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +22 -23
  3. package/knowledge/path-meta.js +23 -1
  4. package/package.json +1 -1
  5. package/resource/index/manifest.json +1 -1
  6. package/resource/integration/callkit/preset/android/integration.md +4 -0
  7. package/resource/integration/callkit/preset/flutter/integration.md +8 -4
  8. package/resource/integration/callkit/preset/ios/integration.md +16 -15
  9. package/resource/integration/callkit/preset/react/integration.md +2 -2
  10. package/resource/integration/callkit/preset/vue/integration.md +9 -12
  11. package/resource/integration/chat/preset/android/integration.md +5 -147
  12. package/resource/integration/chat/preset/flutter/integration.md +22 -130
  13. package/resource/integration/chat/preset/ios/integration.md +12 -279
  14. package/resource/integration/chat/preset/react/integration.md +27 -1
  15. package/resource/integration/chat/preset/uni-app/integration.md +5 -1
  16. package/resource/integration/chat/preset/vue/integration.md +21 -31
  17. package/resource/integration/livekit/preset/live/android/live-host-integration.md +4 -0
  18. package/resource/integration/livekit/preset/live/ios/live-host-integration.md +4 -0
  19. package/resource/integration/livekit/preset/live/ios/prepare-integration.md +3 -3
  20. package/resource/integration/livekit/preset/live/vue/live-list-integration.md +3 -4
  21. package/resource/integration/livekit/preset/live/vue/live-player-desk-integration.md +0 -1
  22. package/resource/integration/livekit/preset/live/vue/live-player-h5-integration.md +0 -1
  23. package/resource/integration/livekit/preset/live/vue/live-pusher-integration.md +4 -9
  24. package/resource/integration/roomkit/preset/vue/integration.md +152 -652
  25. package/resource/knowledge/callkit/best-practice/android/video-chat-dating.md +490 -0
  26. package/resource/knowledge/callkit/best-practice/flutter/android-keep-call-alive-background.md +79 -0
  27. package/resource/knowledge/callkit/best-practice/flutter/background-incoming-call-no-notification.md +99 -0
  28. package/resource/knowledge/callkit/best-practice/flutter/ios-keep-call-alive-background.md +93 -0
  29. package/resource/knowledge/callkit/best-practice/flutter/ios-startup-crash-version-voip.md +68 -0
  30. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +2 -2
  31. package/resource/knowledge/callkit/core-sdk/android/make-call.md +5 -5
  32. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +7 -7
  33. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +10 -10
  34. package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +1 -1
  35. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +18 -16
  36. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +16 -14
  37. package/resource/knowledge/callkit/core-sdk/miniprogram/call-engine.md +19 -19
  38. package/resource/knowledge/callkit/core-sdk/miniprogram/call-event.md +16 -16
  39. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +2 -86
  40. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +2 -104
  41. package/resource/knowledge/callkit/core-sdk/web/call-event.md +2 -2
  42. package/resource/knowledge/callkit/faq/android.md +4 -4
  43. package/resource/knowledge/callkit/faq/common.md +4 -4
  44. package/resource/knowledge/callkit/faq/error-code.md +62 -36
  45. package/resource/knowledge/callkit/faq/uniapp-miniprogram.md +1 -1
  46. package/resource/knowledge/callkit/preset/android/api.md +10 -10
  47. package/resource/knowledge/callkit/preset/harmonyos/api.md +362 -0
  48. package/resource/knowledge/callkit/preset/harmonyos/integration.md +322 -0
  49. package/resource/knowledge/callkit/preset/ios/api.md +9 -9
  50. package/resource/knowledge/callkit/preset/miniprogram/api-uniapp.md +293 -0
  51. package/resource/knowledge/callkit/preset/miniprogram/api.md +19 -19
  52. package/resource/knowledge/callkit/preset/miniprogram/integration.md +292 -0
  53. package/resource/knowledge/callkit/preset/miniprogram/uniapp-integration.md +521 -0
  54. package/resource/knowledge/callkit/preset/uni-app/api.md +49 -0
  55. package/resource/knowledge/callkit/preset/uni-app/integration.md +353 -0
  56. package/resource/knowledge/chat/preset/android-view/integration.md +54 -102
  57. package/resource/knowledge/chat/preset/ios/features/language.md +5 -5
  58. package/resource/knowledge/chat/preset/ios-uikit/integration.md +194 -926
  59. package/resource/knowledge/chat/preset/react/features/search.md +9 -214
  60. package/resource/knowledge/chat/preset/react/h5/integration.md +965 -0
  61. package/resource/knowledge/chat/preset/vue/features/chat-header.md +0 -36
  62. package/resource/knowledge/chat/preset/vue/features/contact-list.md +0 -34
  63. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +0 -39
  64. package/resource/knowledge/chat/preset/vue/features/conversation-preview.md +0 -74
  65. package/resource/knowledge/chat/preset/vue/features/message-input.md +4 -4
  66. package/resource/knowledge/chat/preset/vue/features/search.md +9 -790
  67. package/resource/knowledge/chat/preset/vue/h5/integration.md +724 -0
  68. package/resource/knowledge/livekit/core-sdk/features/android/audience-list.md +3 -3
  69. package/resource/knowledge/livekit/core-sdk/features/android/live-list.md +3 -3
  70. package/resource/knowledge/livekit/core-sdk/features/flutter/audience-list.md +3 -3
  71. package/resource/knowledge/livekit/core-sdk/features/flutter/live-list.md +3 -3
  72. package/resource/knowledge/livekit/core-sdk/features/ios/audience-list.md +3 -3
  73. package/resource/knowledge/livekit/core-sdk/features/ios/live-list.md +3 -3
  74. package/resource/knowledge/livekit/core-sdk/features/uni-app/audience-list.md +3 -3
  75. package/resource/knowledge/livekit/core-sdk/features/uni-app/live-list.md +3 -170
  76. package/resource/knowledge/livekit/core-sdk/live/android/co-guest-interaction.md +1 -1
  77. package/resource/knowledge/livekit/core-sdk/live/android/host-interaction.md +3 -3
  78. package/resource/knowledge/livekit/core-sdk/live/flutter/co-guest-interaction.md +1 -1
  79. package/resource/knowledge/livekit/core-sdk/live/flutter/host-interaction.md +3 -3
  80. package/resource/knowledge/livekit/core-sdk/live/flutter/integration.md +3 -3
  81. package/resource/knowledge/livekit/core-sdk/live/ios/co-guest-interaction.md +1 -1
  82. package/resource/knowledge/livekit/core-sdk/live/ios/host-interaction.md +3 -3
  83. package/resource/knowledge/livekit/core-sdk/live/ios/integration.md +2 -2
  84. package/resource/knowledge/livekit/core-sdk/live/uni-app/co-guest-interaction.md +13 -78
  85. package/resource/knowledge/livekit/core-sdk/live/uni-app/host-interaction.md +5 -70
  86. package/resource/knowledge/livekit/core-sdk/live/uni-app/integration.md +10 -10
  87. package/resource/knowledge/livekit/core-sdk/voice/android/co-guest-interaction.md +1 -1
  88. package/resource/knowledge/livekit/core-sdk/voice/android/host-interaction.md +4 -4
  89. package/resource/knowledge/livekit/core-sdk/voice/flutter/co-guest-interaction.md +1 -1
  90. package/resource/knowledge/livekit/core-sdk/voice/ios/co-guest-interaction.md +1 -1
  91. package/resource/knowledge/livekit/core-sdk/voice/ios/host-interaction.md +4 -4
  92. package/resource/knowledge/livekit/core-sdk/voice/uni-app/integration.md +7 -7
  93. package/resource/knowledge/livekit/preset/live/vue/features/barrage.md +1 -24
  94. package/resource/knowledge/livekit/preset/live/vue/features/live-audience-list.md +0 -3
  95. package/resource/knowledge/livekit/preset/live/vue/features/live-view.md +0 -5
  96. package/resource/knowledge/push/api-reference/harmonyos.md +9 -9
  97. package/resource/knowledge/push/api-reference/unity.md +10 -10
  98. package/resource/knowledge/push/api-reference/unreal-engine.md +11 -11
  99. package/resource/knowledge/push/config/donut.md +3 -3
  100. package/resource/knowledge/push/config/harmonyos.md +12 -12
  101. package/resource/knowledge/push/config/ios.md +2 -2
  102. package/resource/knowledge/push/integration/android.md +90 -1067
  103. package/resource/knowledge/push/integration/donut.md +11 -11
  104. package/resource/knowledge/push/integration/flutter.md +38 -24
  105. package/resource/knowledge/push/integration/harmonyos.md +1 -11
  106. package/resource/knowledge/push/integration/ios.md +29 -40
  107. package/resource/knowledge/push/integration/react-native.md +1 -1
  108. package/resource/knowledge/push/integration/uni-app.md +1 -1
  109. package/resource/knowledge/push/integration/unity.md +4 -4
  110. package/resource/knowledge/push/integration/unreal-engine.md +9 -9
  111. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +6 -6
  112. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +13 -13
  113. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +5 -5
  114. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +4 -4
  115. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +6 -6
  116. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +4 -4
  117. package/resource/knowledge/roomkit/core-sdk/vue/device-detection.md +0 -9
  118. package/resource/knowledge/roomkit/core-sdk/vue/free-beauty-panel.md +0 -9
  119. package/resource/knowledge/roomkit/core-sdk/vue/recording.md +3 -3
  120. package/resource/knowledge/roomkit/core-sdk/vue/room-chat.md +0 -3
  121. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -16
  122. package/resource/knowledge/roomkit/core-sdk/vue/schedule-room.md +0 -3
  123. package/resource/knowledge/roomkit/core-sdk/vue/virtual-background.md +3 -6
  124. package/resource/knowledge/roomkit/core-sdk/vue/whiteboard-annotation.md +0 -15
  125. package/resource/knowledge/roomkit/preset/android/integration.md +5 -202
  126. package/resource/knowledge/roomkit/preset/flutter/integration.md +17 -13
  127. package/resource/knowledge/roomkit/preset/harmonyos/integration.md +10 -2
  128. package/resource/knowledge/roomkit/preset/ios/integration.md +7 -204
  129. package/resource/knowledge/roomkit/preset/react/integration.md +0 -202
  130. package/resource/knowledge/roomkit/preset/uniapp-app/integration.md +244 -500
  131. package/resource/knowledge/rtcengine/web/plugin/42-advanced-realtime-transcriber.md +25 -6
  132. package/server.js +1 -1
  133. package/utils/preflight-route.js +203 -185
  134. package/utils/report-cls-client.js +1 -1
  135. package/utils/report-es-client.js +1 -1
@@ -6,820 +6,39 @@ Search 是一个功能完整的搜索解决方案,包含了搜索框、搜索
6
6
  > 此功能属于增值服务,需要您购买云端搜索插件,请点击 [购买](https://cloud.tencent.com/document/product/269/120945)。
7
7
  >
8
8
 
9
+ 图片仅为效果示意
10
+
9
11
  ## 搜索模式
10
12
  | <strong>迷你模式 (MINI)</strong> | <strong>标准模式 (STANDARD)</strong> | <strong>嵌入式模式 (EMBEDDED)</strong> |
11
13
  | --- | --- | --- |
12
- | 适用于侧边栏或小容器<br>显示有限结果数量<br>支持展开查看更多 | 适用于全屏搜索界面<br>完整功能展示<br>支持高级搜索 | 适用于聊天界面<br>专注消息搜索<br>优化的布局 |
14
+ | - 适用于侧边栏或小容器<br>- 显示有限结果数量<br>- 支持展开查看更多 | - 适用于全屏搜索界面<br>- 完整功能展示<br>- 支持高级搜索 | - 适用于聊天界面<br>- 专注消息搜索<br>- 优化的布局 |
15
+ | | | |
13
16
 
14
17
  ## Props
15
18
 
16
19
  |属性名|类型|默认值|说明|
17
20
  |---------|---------|---------|---------|
18
21
  |variant|VariantType|VariantType.MINI|搜索模式:mini(迷你)、standard(标准)、embedded(嵌入式)|
19
- |SearchBar|Component<SearchBarProps>|DefaultSearchBar|自定义搜索框组件|
20
- |SearchResults|Component<SearchResultsProps>|DefaultSearchResults|自定义搜索结果组件|
21
- |SearchAdvanced|Component<SearchAdvancedProps>|DefaultSearchAdvanced|自定义高级搜索组件|
22
- |SearchResultsPresearch|Component|-|搜索前占位符组件|
23
- |SearchResultsLoading|Component|-|加载中占位符组件|
24
- |SearchResultsEmpty|Component|-|空结果占位符组件|
25
- |SearchResultItem|Component<ResultItemProps>|-|自定义搜索结果项组件|
26
- |debounceTime|number|300|搜索防抖时间(毫秒)|
27
- |autoFocus|boolean|false|是否自动聚焦搜索框|
28
22
  |className|string|-|自定义样式类名|
29
23
  |style|CSSProperties|-|自定义样式|
30
24
  |onKeywordChange|(keyword: string) => void|-|搜索关键词变化回调|
31
- |onSearchComplete|(results: Map<SearchType, SearchResult>) => void|-|搜索完成回调|
32
- |onResultItemClick|(data: SearchResultItem, type: SearchType) => void|-|搜索结果点击回调|
33
- |onError|(error: Error) => void|-|搜索错误回调|
25
+ |onResultItemClick|(result: object) => void|-|搜索结果点击回调|
34
26
 
35
27
  ## 基础用法
36
28
  ``` typescript
37
29
  <template>
38
30
  <div class="app">
39
- <Search
40
- :variant="VariantType.STANDARD"
41
- @result-item-click="handleResultClick"
42
- @keyword-change="handleKeywordChange"
43
- @error="handleError"
44
- />
31
+ <Search :variant="VariantType.MINI" />
45
32
  </div>
46
33
  </template>
47
34
 
48
35
  <script setup lang="ts">
49
36
  import { Search, VariantType } from '@tencentcloud/chat-uikit-vue3';
50
- import type { SearchResultItemType, SearchType } from '@tencentcloud/chat-uikit-vue3';
51
-
52
- const handleResultClick = (data: SearchResultItemType, type: SearchType) => {
53
- console.log('搜索结果点击:', data, type);
54
- };
55
-
56
- const handleKeywordChange = (keyword: string) => {
57
- console.log('搜索关键词变化:', keyword);
58
- };
59
-
60
- const handleError = (error: Error) => {
61
- console.error('搜索错误:', error);
62
- };
63
- </script>
64
- ```
65
-
66
- ## 自定义
67
-
68
- `Search` 组件提供了多个可替换的子组件,允许用户自定义 `SearchBar`, `SearchResults`, `SearchAdvanced`, `SearchResultItem`, `SearchResultsPresearch`, `SearchResultsLoading`, `SearchResultsEmpty` 等。同时,用户还可以利用默认子组件进行二次开发定制。
69
-
70
- 【自定义 SearchBar】
71
-
72
- **Props**
73
-
74
- |属性名|类型|默认值|说明|
75
- |---------|---------|---------|---------|
76
- |value|string|-|搜索框值|
77
- |onChange|(e: Event) => void|-|输入变化回调|
78
- |onKeyDown|(e: KeyboardEvent) => void|-|键盘事件回调|
79
- |onClear|() => void|-|清除回调|
80
- |placeholder|string|-|占位符文本|
81
- |SearchIcon|Component|-|自定义搜索图标|
82
- |ClearIcon|Component|-|自定义清除图标|
83
- |className|string|-|自定义样式类名|
84
- |style|CSSProperties|-|自定义样式|
85
- |onFocus|(e: FocusEvent) => void|-|获得焦点回调|
86
- |onBlur|(e: FocusEvent) => void|-|失去焦点回调|
87
- |autoFocus|boolean|false|是否自动聚焦|
88
- |variant|VariantType|-|搜索模式|
89
-
90
- **示例**
91
- ``` typescript
92
- <template>
93
- <div class="custom-search-bar">
94
- <div class="search-bar-header">
95
- <span class="search-icon">🔍</span>
96
- <span class="search-title">智能搜索</span>
97
- </div>
98
- <div class="search-input-wrapper">
99
- <input
100
- type="text"
101
- :value="value"
102
- :placeholder="placeholder || '输入关键词开始搜索...'"
103
- @input="handleChange"
104
- class="enhanced-search-input"
105
- />
106
- <button
107
- v-if="value"
108
- @click="handleClear"
109
- class="enhanced-clear-btn"
110
- >
111
- ✕
112
- </button>
113
- </div>
114
- </div>
115
- </template>
116
-
117
- <script setup lang="ts">
118
- interface SearchBarProps {
119
- value?: string;
120
- onChange?: (event: Event) => void;
121
- onClear?: () => void;
122
- placeholder?: string;
123
- variant?: string;
124
- }
125
-
126
- const props = defineProps<SearchBarProps>();
127
-
128
- const emit = defineEmits<{
129
- change: [event: Event];
130
- clear: [];
131
- }>();
132
-
133
- const handleChange = (event: Event) => {
134
- if (props.onChange) {
135
- props.onChange(event);
136
- }
137
- emit('change', event);
138
- };
139
-
140
- const handleClear = () => {
141
- if (props.onClear) {
142
- props.onClear();
143
- }
144
- emit('clear');
145
- };
146
- </script>
147
-
148
- <style scoped>
149
- .custom-search-bar {
150
- display: flex;
151
- flex-direction: column;
152
- gap: 8px;
153
- }
154
-
155
- .search-bar-header {
156
- display: flex;
157
- align-items: center;
158
- gap: 8px;
159
- }
160
-
161
- .search-icon {
162
- font-size: 16px;
163
- }
164
-
165
- .search-title {
166
- font-weight: 500;
167
- color: #333;
168
- }
169
-
170
- .search-input-wrapper {
171
- position: relative;
172
- display: flex;
173
- align-items: center;
174
- }
175
-
176
- .enhanced-search-input {
177
- width: 100%;
178
- padding: 8px 12px;
179
- border: 1px solid #ddd;
180
- border-radius: 4px;
181
- font-size: 14px;
182
- outline: none;
183
- }
184
-
185
- .enhanced-search-input:focus {
186
- border-color: #007bff;
187
- }
188
-
189
- .enhanced-clear-btn {
190
- position: absolute;
191
- right: 8px;
192
- background: none;
193
- border: none;
194
- cursor: pointer;
195
- color: #999;
196
- font-size: 16px;
197
- }
198
-
199
- .enhanced-clear-btn:hover {
200
- color: #666;
201
- }
202
- </style>
203
-
204
- ```
205
-
206
- ``` typescript
207
- <template>
208
- <Search :SearchBar="CustomSearchBar" />
209
- </template>
210
-
211
- <script setup lang="ts">
212
- import { Search } from '@tencentcloud/chat-uikit-vue3';
213
- import CustomSearchBar from './CustomSearchBar.vue';
214
- </script>
215
-
216
- ```
217
-
218
- 【自定义 SearchResults】
219
-
220
- **Props**
221
-
222
- |属性名|类型|默认值|说明|
223
- |---------|---------|---------|---------|
224
- |results|Map<SearchType, SearchResult>|-|搜索结果数据|
225
- |isLoading|boolean|-|是否正在加载|
226
- |error|Error \| null|-|错误信息|
227
- |keyword|string|-|搜索关键词|
228
- |typeLabels|Record<SearchType, string>|-|搜索类型标签|
229
- |onLoadMore|(type: SearchType) => void|-|加载更多回调|
230
- |onResultItemClick|(data: SearchResultItemType, type: SearchType) => void|-|结果项点击回调|
231
- |SearchResultsLoading|Component|Loading|自定义加载组件|
232
- |SearchResultsPresearch|Component|-|搜索前占位符组件|
233
- |SearchResultsEmpty|Component|EmptyResult|空结果占位符组件|
234
- |SearchResultItem|Component<ResultItemProps>|DefaultSearchResultsItem|自定义结果项组件|
235
- |variant|VariantType|VariantType.STANDARD|显示模式|
236
- |searchType|SearchType \| 'all'|'all'|当前搜索类型|
237
-
238
- **示例**
239
- ``` typescript
240
- <template>
241
- <div class="custom-search-results">
242
- <div class="search-results-header">
243
- <span class="results-icon">📋</span>
244
- <span class="results-title">搜索结果</span>
245
- </div>
246
- <div class="search-results-content">
247
- <div v-if="!results || results.size === 0" class="no-results">
248
- 暂无搜索结果
249
- </div>
250
- <div v-else class="results-list">
251
- <div
252
- v-for="(item, key) in results.keys()"
253
- :key="key"
254
- class="result-item"
255
- >
256
- <div class="result-group">
257
- <div class="result-title">
258
- {{ item }}
259
- </div>
260
- <ul v-if="item === SearchType.MESSAGE" class="result-description">
261
- <li
262
- v-for="(data, index) in results.get(item)?.resultList"
263
- :key="index"
264
- @click="handleResultClick(data)"
265
- >
266
- {{ (data as SearchCloudMessagesResultItem).conversation?.getShowName() }}
267
- </li>
268
- </ul>
269
- <ul v-if="item === SearchType.USER" class="result-description">
270
- <li
271
- v-for="(data, index) in results.get(item)?.resultList"
272
- :key="index"
273
- @click="handleResultClick(data)"
274
- >
275
- {{ (data as SearchCloudUsersResultItem).profile.nick
276
- || (data as SearchCloudUsersResultItem).profile.userID }}
277
- </li>
278
- </ul>
279
- <ul v-if="item === SearchType.GROUP" class="result-description">
280
- <li
281
- v-for="(data, index) in results.get(item)?.resultList"
282
- :key="index"
283
- @click="handleResultClick(data)"
284
- >
285
- {{ (data as SearchCloudGroupsResultItem).groupInfo.name
286
- || (data as SearchCloudGroupsResultItem).groupInfo.groupID }}
287
- </li>
288
- </ul>
289
- </div>
290
- </div>
291
- </div>
292
- </div>
293
- </div>
294
- </template>
295
-
296
- <script setup lang="ts">
297
- import { SearchType } from '@tencentcloud/chat-uikit-vue3';
298
- import type {
299
- SearchCloudGroupsResultItem,
300
- SearchCloudMessagesResultItem,
301
- SearchCloudUsersResultItem,
302
- SearchResult,
303
- SearchResultItemType,
304
- } from '@tencentcloud/chat-uikit-vue3';
305
-
306
- interface SearchResultsProps {
307
- results?: Map<SearchType, SearchResult<any>>;
308
- loading?: boolean;
309
- keyword?: string;
310
- searchType?: SearchType;
311
- }
312
-
313
- const props = defineProps<SearchResultsProps>();
314
-
315
- const emit = defineEmits<{
316
- 'result-item-click': [data: SearchResultItemType, type: any];
317
- }>();
318
-
319
- const handleResultClick = (item: SearchResultItemType) => {
320
- emit('result-item-click', item, props.searchType || 'ALL');
321
- };
322
- </script>
323
-
324
- <style scoped>
325
- .custom-search-results {
326
- display: flex;
327
- flex-direction: column;
328
- gap: 8px;
329
- }
330
-
331
- .search-results-header {
332
- display: flex;
333
- align-items: center;
334
- gap: 8px;
335
- }
336
-
337
- .results-icon {
338
- font-size: 16px;
339
- }
340
-
341
- .results-title {
342
- font-weight: 500;
343
- color: #333;
344
- }
345
-
346
- .search-results-content {
347
- max-height: 400px;
348
- overflow-y: auto;
349
- }
350
-
351
- .no-results {
352
- padding: 20px;
353
- text-align: center;
354
- color: #999;
355
- font-size: 14px;
356
- }
357
-
358
- .results-list {
359
- display: flex;
360
- flex-direction: column;
361
- gap: 4px;
362
- }
363
-
364
- .result-item {
365
- padding: 12px;
366
- border: 1px solid #eee;
367
- border-radius: 4px;
368
- cursor: pointer;
369
- transition: background-color 0.2s;
370
- }
371
-
372
- .result-item:hover {
373
- background-color: #f5f5f5;
374
- }
375
-
376
- .result-content {
377
- display: flex;
378
- flex-direction: column;
379
- gap: 4px;
380
- }
381
-
382
- .result-title {
383
- font-weight: 500;
384
- color: #333;
385
- font-size: 14px;
386
- }
387
-
388
- .result-description {
389
- color: #666;
390
- font-size: 12px;
391
- line-height: 1.4;
392
- }
393
- </style>
394
-
395
- ```
396
-
397
- ``` typescript
398
- <template>
399
- <Search :SearchResults="CustomSearchResults" />
400
- </template>
401
-
402
- <script setup lang="ts">
403
- import { Search } from '@tencentcloud/chat-uikit-vue3';
404
- import CustomSearchResults from './CustomSearchResults.vue';
405
- </script>
406
- ```
407
-
408
- 【自定义 SearchAdvanced】
409
-
410
- **Props**
411
-
412
- |属性名|类型|默认值|说明|
413
- |---------|---------|---------|---------|
414
- |variant|VariantType|-|显示模式|
415
- |searchType|SearchTabType|-|当前搜索类型|
416
- |advancedParams|Map<SearchType, SearchParamsMap[SearchType]>|-|高级搜索参数|
417
- |onAdvancedParamsChange|(type: SearchType, params: SearchParamsMap[SearchType]) => void|-|参数变化回调|
418
-
419
- **示例**
420
- ``` typescript
421
- <template>
422
- <div class="custom-search-advanced">
423
- <div class="search-advanced-header">
424
- <span class="advanced-icon">⚙️</span>
425
- <span class="advanced-title">高级搜索</span>
426
- </div>
427
- <div class="search-advanced-content">
428
- <div class="search-type-section">
429
- <div class="section-title">
430
- 搜索类型
431
- </div>
432
- <div class="search-type-options">
433
- <label
434
- v-for="type in searchTypes"
435
- :key="type.value"
436
- class="type-option"
437
- >
438
- <input
439
- type="radio"
440
- :value="type.value"
441
- :checked="searchType === type.value"
442
- @change="handleSearchTypeChange(type.value as SearchType)"
443
- >
444
- <span class="type-label">{{ type.label }}</span>
445
- </label>
446
- </div>
447
- </div>
448
- </div>
449
- </div>
450
- </template>
451
-
452
- <script setup lang="ts">
453
- import { ref } from 'vue';
454
- import { SearchType, useSearchState } from '@tencentcloud/chat-uikit-vue3';
455
- import type { VariantType } from '@tencentcloud/chat-uikit-vue3';
456
-
457
- interface CustomSearchAdvancedProps {
458
- variant?: VariantType;
459
- searchType?: SearchType;
460
- }
461
-
462
- const props = defineProps<CustomSearchAdvancedProps>();
463
- const { setSelectedType } = useSearchState();
464
-
465
- const emit = defineEmits<{
466
- 'search-type-change': [type: SearchType | 'all'];
467
- }>();
468
-
469
- const searchTypes = [
470
- { value: 'all', label: '全部' },
471
- { value: SearchType.MESSAGE, label: '消息' },
472
- { value: SearchType.USER, label: '用户' },
473
- { value: SearchType.GROUP, label: '群组' },
474
- ];
475
-
476
- const searchType = ref<SearchType | 'all'>(props.searchType || 'all');
477
-
478
- const handleSearchTypeChange = (type: SearchType) => {
479
- searchType.value = type;
480
- setSelectedType(type);
481
- emit('search-type-change', type);
482
- };
483
- </script>
484
-
485
- <style scoped>
486
- .custom-search-advanced {
487
- display: flex;
488
- flex-direction: column;
489
- gap: 16px;
490
- padding: 16px;
491
- border: 1px solid #eee;
492
- border-radius: 8px;
493
- background-color: #fff;
494
- }
495
-
496
- .search-advanced-header {
497
- display: flex;
498
- align-items: center;
499
- gap: 8px;
500
- padding-bottom: 12px;
501
- border-bottom: 1px solid #f0f0f0;
502
- }
503
-
504
- .advanced-icon {
505
- font-size: 16px;
506
- }
507
-
508
- .advanced-title {
509
- font-weight: 500;
510
- color: #333;
511
- font-size: 16px;
512
- }
513
-
514
- .search-advanced-content {
515
- display: flex;
516
- flex-direction: column;
517
- gap: 16px;
518
- }
519
-
520
- .section-title {
521
- font-weight: 500;
522
- color: #333;
523
- font-size: 14px;
524
- margin-bottom: 8px;
525
- }
526
-
527
- .search-type-options {
528
- display: flex;
529
- flex-wrap: wrap;
530
- gap: 12px;
531
- }
532
-
533
- .type-option {
534
- display: flex;
535
- align-items: center;
536
- gap: 6px;
537
- cursor: pointer;
538
- }
539
-
540
- .type-option input[type="radio"] {
541
- margin: 0;
542
- }
543
-
544
- .type-label {
545
- font-size: 14px;
546
- color: #666;
547
- }
548
- </style>
549
-
550
- ```
551
-
552
- ``` typescript
553
- <template>
554
- <Search :SearchAdvanced="CustomSearchAdvanced" />
555
- </template>
556
-
557
- <script setup lang="ts">
558
- import { Search } from '@tencentcloud/chat-uikit-vue3';
559
- import CustomSearchAdvanced from './CustomSearchAdvanced.vue';
560
37
  </script>
561
38
  ```
562
39
 
563
- 【自定义 SearchResultItem】
564
-
565
- **Props**
566
-
567
- |属性名|类型|默认值|说明|
568
- |---------|---------|---------|---------|
569
- |data|SearchResultItem|-|搜索结果数据|
570
- |type|SearchType|-|搜索结果类型|
571
- |keyword|string|-|搜索关键词|
572
- |onClick|(data: SearchResultItem, type: SearchType) => void|-|点击回调|
573
- |className|string|-|自定义样式类名|
574
-
575
- **示例**
576
- ``` java
577
- <template>
578
- <div class="custom-search-item">
579
- <div
580
- v-if="type === SearchType.USER"
581
- class="user-item"
582
- @click="handleClick"
583
- >
584
- <div class="user-avatar">
585
-
586
- </div>
587
- <div class="user-info">
588
- <div class="user-name">{{ data.profile.nick }}</div>
589
- <div class="user-id">{{ data.profile.userID }}</div>
590
- </div>
591
- </div>
592
-
593
- <div
594
- v-else-if="type === SearchType.GROUP"
595
- class="group-item"
596
- @click="handleClick"
597
- >
598
- <div class="group-avatar">👥</div>
599
- <div class="group-info">
600
- <div class="group-name">{{ data.groupInfo.name }}</div>
601
- <div class="group-id">{{ data.groupInfo.groupID }}</div>
602
- </div>
603
- </div>
604
-
605
- <div
606
- v-else-if="type === SearchType.MESSAGE"
607
- class="message-item"
608
- @click="handleClick"
609
- >
610
- <div class="message-content">{{ data.conversation.getShowName() }}</div>
611
- <div class="message-num">{{ data.messageCount }}</div>
612
- </div>
613
- </div>
614
- </template>
615
-
616
- <script setup lang="ts">
617
- import { SearchType } from '@tencentcloud/chat-uikit-vue3';
618
- import type { SearchResultItemType } from '@tencentcloud/chat-uikit-vue3';
40
+ ## 常见问题
619
41
 
620
- interface CustomSearchItemProps {
621
- data: SearchResultItemType;
622
- type?: SearchType;
623
- onClick?: (data: SearchResultItemType, type: SearchType) => void;
624
- }
42
+ ### Q:如何自定义搜索结果的显示格式?
625
43
 
626
- const props = defineProps<CustomSearchItemProps>();
627
-
628
- console.warn('CustomSearchItem', props);
629
-
630
- const handleClick = () => {
631
- if (props.onClick && props.type) {
632
- props.onClick(props.data, props.type);
633
- }
634
- };
635
-
636
- const formatTime = (timestamp: number) => {
637
- return new Date(timestamp).toLocaleString();
638
- };
639
- </script>
640
-
641
- <style scoped>
642
- .custom-search-item {
643
- cursor: pointer;
644
- padding: 12px;
645
- border-bottom: 1px solid #f0f0f0;
646
- transition: background-color 0.2s;
647
- }
648
-
649
- .custom-search-item:hover {
650
- background-color: #f5f5f5;
651
- }
652
-
653
- .user-item,
654
- .group-item,
655
- .message-item {
656
- display: flex;
657
- align-items: center;
658
- gap: 12px;
659
- }
660
-
661
- .user-avatar img {
662
- width: 40px;
663
- height: 40px;
664
- border-radius: 50%;
665
- object-fit: cover;
666
- }
667
-
668
- .group-avatar {
669
- width: 40px;
670
- height: 40px;
671
- border-radius: 8px;
672
- background-color: #e9ecef;
673
- display: flex;
674
- align-items: center;
675
- justify-content: center;
676
- font-size: 18px;
677
- }
678
-
679
- .user-info,
680
- .group-info {
681
- flex: 1;
682
- }
683
-
684
- .user-name,
685
- .group-name {
686
- font-weight: 500;
687
- color: #333;
688
- font-size: 14px;
689
- margin-bottom: 4px;
690
- }
691
-
692
- .user-id,
693
- .group-id {
694
- color: #666;
695
- font-size: 12px;
696
- }
697
-
698
- .message-content {
699
- flex: 1;
700
- color: #333;
701
- font-size: 14px;
702
- line-height: 1.4;
703
- }
704
-
705
- .message-num {
706
- color: #666;
707
- font-size: 12px;
708
- white-space: nowrap;
709
- }
710
- </style>
711
- ```
712
-
713
- ``` typescript
714
- <template>
715
- <Search :SearchResultItem="CustomSearchItem" />
716
- </template>
717
-
718
- <script setup lang="ts">
719
- import { Search } from '@tencentcloud/chat-uikit-vue3';
720
- import CustomSearchItem from './CustomSearchItem.vue';
721
- </script>
722
- ```
723
-
724
- 【自定义占位符】
725
-
726
- **Props**
727
-
728
- |属性名|类型|默认值|说明|
729
- |---------|---------|---------|---------|
730
- |SearchResultsPresearch|Component|-|搜索前占位符组件|
731
- |SearchResultsLoading|Component|-|加载中占位符组件|
732
- |SearchResultsEmpty|Component|-|空结果占位符组件|
733
-
734
- **示例**
735
- ``` typescript
736
- <template>
737
- <Search
738
- :search-results-presearch="PresearchComponent"
739
- :search-results-loading="LoadingComponent"
740
- :search-results-empty="EmptyComponent"
741
- />
742
- </template>
743
-
744
- <script setup lang="ts">
745
- import { defineComponent, h } from 'vue';
746
- import { Search } from '@tencentcloud/chat-uikit-vue3';
747
-
748
- const PresearchComponent = defineComponent({
749
- name: 'PresearchComponent',
750
- setup() {
751
- return () => h('div', { class: 'presearch-placeholder' }, [
752
- h('div', { class: 'placeholder-icon' }, '🔍'),
753
- h('div', { class: 'placeholder-text' }, '输入关键词开始搜索')
754
- ]);
755
- }
756
- });
757
-
758
- const LoadingComponent = defineComponent({
759
- name: 'LoadingComponent',
760
- setup() {
761
- return () => h('div', { class: 'loading-placeholder' }, [
762
- h('div', { class: 'loading-spinner' }),
763
- h('div', { class: 'loading-text' }, '搜索中...')
764
- ]);
765
- }
766
- });
767
-
768
- const EmptyComponent = defineComponent({
769
- name: 'EmptyComponent',
770
- setup() {
771
- return () => h('div', { class: 'empty-placeholder' }, [
772
- h('div', { class: 'empty-icon' }, '😔'),
773
- h('div', { class: 'empty-text' }, '未找到相关结果'),
774
- h('div', { class: 'empty-hint' }, '尝试使用其他关键词搜索')
775
- ]);
776
- }
777
- });
778
- </script>
779
-
780
- <style scoped>
781
- .presearch-placeholder,
782
- .loading-placeholder,
783
- .empty-placeholder {
784
- display: flex;
785
- flex-direction: column;
786
- align-items: center;
787
- justify-content: center;
788
- padding: 60px 20px;
789
- color: #999;
790
- }
791
-
792
- .placeholder-icon,
793
- .empty-icon {
794
- font-size: 48px;
795
- margin-bottom: 16px;
796
- }
797
-
798
- .loading-spinner {
799
- width: 32px;
800
- height: 32px;
801
- border: 3px solid #f3f3f3;
802
- border-top: 3px solid #1890ff;
803
- border-radius: 50%;
804
- animation: spin 1s linear infinite;
805
- margin-bottom: 16px;
806
- }
807
-
808
- @keyframes spin {
809
- 0% { transform: rotate(0deg); }
810
- 100% { transform: rotate(360deg); }
811
- }
812
-
813
- .placeholder-text,
814
- .loading-text,
815
- .empty-text {
816
- font-size: 16px;
817
- margin-bottom: 8px;
818
- }
819
-
820
- .empty-hint {
821
- font-size: 14px;
822
- color: #bbb;
823
- }
824
- </style>
825
- ```
44
+ A:搜索组件不支持自定义,可以使用 SearchStore 自主实现 Search 组件。