@touchvue/chat 1.0.0-beta.53 → 1.0.0-beta.55

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 (169) hide show
  1. package/README.md +70 -70
  2. package/es/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.4.3}/node_modules/dompurify/dist/purify.es.mjs +299 -143
  3. package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
  4. package/es/package.json.css +1 -1
  5. package/es/package.json.mjs +1 -1
  6. package/es/packages/components/resolver.mjs.map +1 -1
  7. package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
  8. package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
  9. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +9 -9
  10. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
  11. package/es/packages/components/touchchat/component/AudioFile.vue.mjs +7 -0
  12. package/es/packages/components/touchchat/component/AudioFile.vue.mjs.map +1 -0
  13. package/es/packages/components/touchchat/component/AudioFile.vue2.mjs +111 -0
  14. package/es/packages/components/touchchat/component/AudioFile.vue2.mjs.map +1 -0
  15. package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
  16. package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
  17. package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
  18. package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
  19. package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
  20. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
  21. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
  22. package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
  23. package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
  24. package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
  25. package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
  26. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
  27. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
  28. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +56 -5
  29. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
  30. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +10 -10
  31. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
  32. package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs +52 -10
  33. package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs.map +1 -1
  34. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
  35. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
  36. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  37. package/es/packages/components/touchchat/component/VideoFile.vue.mjs +1 -1
  38. package/es/packages/components/touchchat/component/VideoFile.vue2.mjs.map +1 -1
  39. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +13 -4
  40. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs.map +1 -1
  41. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
  42. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
  43. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +30 -30
  44. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
  45. package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -1
  46. package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -1
  47. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +11 -8
  48. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  49. package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -1
  50. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
  51. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -1
  52. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +16 -11
  53. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  54. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
  55. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  56. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
  57. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  58. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
  59. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
  60. package/es/packages/components/touchchat/src/AiChat/MessageViewed.vue.mjs +33 -0
  61. package/es/packages/components/touchchat/src/AiChat/MessageViewed.vue.mjs.map +1 -0
  62. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
  63. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  64. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +1 -1
  65. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +36 -0
  66. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
  67. package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
  68. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +127 -75
  69. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
  70. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  71. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  72. package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
  73. package/es/packages/components/touchchat/utils/markdown.mjs +1 -1
  74. package/lib/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.4.3}/node_modules/dompurify/dist/purify.es.js +299 -143
  75. package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +1 -0
  76. package/lib/package.json.css +1 -1
  77. package/lib/package.json.js +1 -1
  78. package/lib/packages/components/resolver.js.map +1 -1
  79. package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
  80. package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
  81. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +9 -9
  82. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  83. package/lib/packages/components/touchchat/component/AudioFile.vue.js +11 -0
  84. package/lib/packages/components/touchchat/component/AudioFile.vue.js.map +1 -0
  85. package/lib/packages/components/touchchat/component/AudioFile.vue2.js +115 -0
  86. package/lib/packages/components/touchchat/component/AudioFile.vue2.js.map +1 -0
  87. package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
  88. package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
  89. package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
  90. package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
  91. package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
  92. package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
  93. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  94. package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
  95. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  96. package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
  97. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  98. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
  99. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  100. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +55 -4
  101. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  102. package/lib/packages/components/touchchat/component/PDFFile.vue2.js +10 -10
  103. package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
  104. package/lib/packages/components/touchchat/component/QuoteContent.vue2.js +51 -9
  105. package/lib/packages/components/touchchat/component/QuoteContent.vue2.js.map +1 -1
  106. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
  107. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
  108. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  109. package/lib/packages/components/touchchat/component/VideoFile.vue.js +1 -1
  110. package/lib/packages/components/touchchat/component/VideoFile.vue2.js.map +1 -1
  111. package/lib/packages/components/touchchat/component/VoiceView.vue2.js +13 -4
  112. package/lib/packages/components/touchchat/component/VoiceView.vue2.js.map +1 -1
  113. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
  114. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
  115. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +30 -30
  116. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
  117. package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -1
  118. package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -1
  119. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +11 -8
  120. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  121. package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -1
  122. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
  123. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -1
  124. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +16 -11
  125. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  126. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
  127. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  128. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
  129. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  130. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
  131. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
  132. package/lib/packages/components/touchchat/src/AiChat/MessageViewed.vue.js +37 -0
  133. package/lib/packages/components/touchchat/src/AiChat/MessageViewed.vue.js.map +1 -0
  134. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
  135. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  136. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +1 -1
  137. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +36 -0
  138. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
  139. package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
  140. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +126 -74
  141. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
  142. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  143. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  144. package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
  145. package/lib/packages/components/touchchat/utils/markdown.js +1 -1
  146. package/package.json +83 -83
  147. package/theme/components/index.css +167 -18
  148. package/theme/font/iconfont.woff +0 -0
  149. package/theme/font/iconfont.woff2 +0 -0
  150. package/theme/img/file/doc.png +0 -0
  151. package/theme/img/file/docx.png +0 -0
  152. package/theme/img/file/gif.png +0 -0
  153. package/theme/img/file/html.png +0 -0
  154. package/theme/img/file/jpg.png +0 -0
  155. package/theme/img/file/mp3.png +0 -0
  156. package/theme/img/file/mp4.png +0 -0
  157. package/theme/img/file/music.png +0 -0
  158. package/theme/img/file/pdf.png +0 -0
  159. package/theme/img/file/png.png +0 -0
  160. package/theme/img/file/ppt.png +0 -0
  161. package/theme/img/file/pptx.png +0 -0
  162. package/theme/img/file/txt.png +0 -0
  163. package/theme/img/file/unknown.png +0 -0
  164. package/theme/img/file/xls.png +0 -0
  165. package/theme/img/file/xlsx.png +0 -0
  166. package/theme/index.css +167 -18
  167. package/theme/skin/default.css +167 -18
  168. package/es/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
  169. package/lib/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleSelect.vue2.js","sources":["../../../../../../packages/components/touchchat/component/ModuleSelect.vue"],"sourcesContent":["<template>\n\t<div class=\"touchchat-custom-select\" tabindex=\"0\" @blur=\"isSelectOpen = false\">\n\t\t<div class=\"touchchat-select-trigger\" @click=\"toggleSelect\">\n\t\t\t<span class=\"touchchat-select-text\">{{ currentModuleName }}</span>\n\t\t\t<div class=\"touchchat-select-icon\" :class=\"{ 'is-open': isSelectOpen }\"></div>\n\t\t</div>\n\t\t<div v-show=\"isSelectOpen\" ref=\"dropdownRef\" class=\"touchchat-select-dropdown\" :class=\"{ 'is-upward': isUpward }\">\n\t\t\t<div v-for=\"item in modules\" :key=\"item.name\" class=\"touchchat-select-option\" :class=\"{ 'is-selected': item.name === modelValue }\" @click=\"selectOption(item)\">\n\t\t\t\t{{ item.name }}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, computed, nextTick, onMounted, onUnmounted } from 'vue'\ninterface BodyConfig {\n\tmodel: string\n\tmessages: Array<{\n\t\trole: string\n\t\tcontent: string\n\t}>\n\tstream: boolean\n}\n\n// 定义 respoKey 返回值的类型\ninterface RespoKeyConfig {\n\tcategory: string\n\tcontentCategory: string\n\tcontent: string\n\tall: string\n\tallCategory: string\n}\ninterface ModuleItem {\n\tname: string\n\tconfig: {\n\t\taction: string\n\t\theaders: () => object\n\t\tbody: () => BodyConfig // 修改为具体类型\n\t\trespoKey: () => RespoKeyConfig // 修改为具体类型\n\t}\n}\n\nconst props = defineProps<{\n\tmodules: ModuleItem[]\n\tmodelValue: string\n}>()\n\nconst emit = defineEmits<{\n\t(e: 'update:modelValue', value: string): void\n}>()\n\nconst isSelectOpen = ref(false)\nconst dropdownRef = ref<HTMLElement | null>(null)\nconst isUpward = ref(false)\n\nconst currentModuleName = computed(() => {\n\tconst selected = props.modules.find(item => item.name === props.modelValue)\n\treturn selected ? selected.name : props.modules[0]?.name || ''\n})\n\nconst toggleSelect = () => {\n\tisSelectOpen.value = !isSelectOpen.value\n\n\tif (isSelectOpen.value) {\n\t\t// 在下一个tick中计算位置\n\t\tnextTick(() => {\n\t\t\tcalculateDropdownPosition()\n\t\t})\n\t}\n}\n\nconst calculateDropdownPosition = () => {\n\tif (!dropdownRef.value) return\n\n\tconst dropdownRect = dropdownRef.value.getBoundingClientRect()\n\tconst viewportHeight = window.innerHeight\n\tconst spaceBelow = viewportHeight - dropdownRect.top - dropdownRect.height\n\tconst spaceAbove = dropdownRect.top\n\n\t// 如果下方空间不足且上方空间足够,则显示在上方\n\tisUpward.value = spaceBelow < 200 && spaceAbove > spaceBelow\n}\n\nconst selectOption = (item: ModuleItem) => {\n\temit('update:modelValue', item.name)\n\tisSelectOpen.value = false\n}\n\nconst handleWindowEvent = () => {\n\tif (isSelectOpen.value) {\n\t\tcalculateDropdownPosition()\n\t}\n}\n\nonMounted(() => {\n\twindow.addEventListener('scroll', handleWindowEvent, true)\n\twindow.addEventListener('resize', handleWindowEvent)\n\n\t// 点击外部关闭下拉菜单\n\tdocument.addEventListener('click', e => {\n\t\tconst selectEl = document.querySelector('.touchchat-custom-select')\n\t\tif (selectEl && !selectEl.contains(e.target as Node)) {\n\t\t\tisSelectOpen.value = false\n\t\t}\n\t})\n})\n\nonUnmounted(() => {\n\twindow.removeEventListener('scroll', handleWindowEvent, true)\n\twindow.removeEventListener('resize', handleWindowEvent)\n})\n</script>\n"],"names":["ref","computed","nextTick","onMounted","onUnmounted","_createElementBlock","_createElementVNode","_normalizeClass","_Fragment","_renderList","modules","modelValue","_toDisplayString"],"mappings":"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"}
1
+ {"version":3,"file":"ModuleSelect.vue2.js","sources":["../../../../../../packages/components/touchchat/component/ModuleSelect.vue"],"sourcesContent":["<template>\n\t<div class=\"touchchat-custom-select\" tabindex=\"0\" :style=\"{ width: selectWidth }\" @blur=\"isSelectOpen = false\">\n\t\t<div class=\"touchchat-select-trigger\" @click=\"toggleSelect\">\n\t\t\t<span class=\"touchchat-select-text\">{{ currentModuleName }}</span>\n\t\t\t<div class=\"touchchat-select-icon\" :class=\"{ 'is-open': isSelectOpen }\"></div>\n\t\t</div>\n\t\t<div v-show=\"isSelectOpen\" ref=\"dropdownRef\" class=\"touchchat-select-dropdown\" :class=\"{ 'is-upward': isUpward }\">\n\t\t\t<div v-for=\"item in modules\" :key=\"item.name\" class=\"touchchat-select-option\" :class=\"{ 'is-selected': item.name === modelValue }\" @click=\"selectOption(item)\">\n\t\t\t\t{{ item.name }}\n\t\t\t</div>\n\t\t</div>\n\t\t<div ref=\"measureRef\" class=\"touchchat-select-measure\">\n\t\t\t<div v-for=\"item in modules\" :key=\"'measure-' + item.name\" class=\"touchchat-select-measure-item\">{{ item.name }}</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, computed, nextTick, onMounted, onUnmounted } from 'vue'\ninterface BodyConfig {\n\tmodel: string\n\tmessages: Array<{\n\t\trole: string\n\t\tcontent: string\n\t}>\n\tstream: boolean\n}\n\n// 定义 respoKey 返回值的类型\ninterface RespoKeyConfig {\n\tcategory: string\n\tcontentCategory: string\n\tcontent: string\n\tall: string\n\tallCategory: string\n}\ninterface ModuleItem {\n\tname: string\n\tconfig: {\n\t\taction: string\n\t\theaders: () => object\n\t\tbody: () => BodyConfig // 修改为具体类型\n\t\trespoKey: () => RespoKeyConfig // 修改为具体类型\n\t}\n}\n\nconst props = defineProps<{\n\tmodules: ModuleItem[]\n\tmodelValue: string\n}>()\n\nconst emit = defineEmits<{\n\t(e: 'update:modelValue', value: string): void\n}>()\n\nconst isSelectOpen = ref(false)\nconst dropdownRef = ref<HTMLElement | null>(null)\nconst measureRef = ref<HTMLElement | null>(null)\nconst isUpward = ref(false)\nconst selectWidth = ref('auto')\n\nconst currentModuleName = computed(() => {\n\tconst selected = props.modules.find(item => item.name === props.modelValue)\n\treturn selected ? selected.name : props.modules[0]?.name || ''\n})\n\nconst toggleSelect = () => {\n\tisSelectOpen.value = !isSelectOpen.value\n\n\tif (isSelectOpen.value) {\n\t\t// 在下一个tick中计算位置\n\t\tnextTick(() => {\n\t\t\tcalculateDropdownPosition()\n\t\t})\n\t}\n}\n\nconst calculateDropdownPosition = () => {\n\tif (!dropdownRef.value) return\n\n\tconst dropdownRect = dropdownRef.value.getBoundingClientRect()\n\tconst viewportHeight = window.innerHeight\n\tconst spaceBelow = viewportHeight - dropdownRect.top - dropdownRect.height\n\tconst spaceAbove = dropdownRect.top\n\n\t// 如果下方空间不足且上方空间足够,则显示在上方\n\tisUpward.value = spaceBelow < 200 && spaceAbove > spaceBelow\n}\n\nconst selectOption = (item: ModuleItem) => {\n\temit('update:modelValue', item.name)\n\tisSelectOpen.value = false\n}\n\nconst handleWindowEvent = () => {\n\tif (isSelectOpen.value) {\n\t\tcalculateDropdownPosition()\n\t}\n}\n\nconst calculateSelectWidth = () => {\n\tif (!measureRef.value) return\n\n\tlet maxWidth = 0\n\tconst items = measureRef.value.children\n\tfor (let i = 0; i < items.length; i++) {\n\t\tconst itemWidth = (items[i] as HTMLElement).offsetWidth\n\t\tif (itemWidth > maxWidth) {\n\t\t\tmaxWidth = itemWidth\n\t\t}\n\t}\n\n\tif (maxWidth > 0) {\n\t\tselectWidth.value = `${maxWidth + 48}px`\n\t}\n}\n\nonMounted(() => {\n\tnextTick(() => {\n\t\tcalculateSelectWidth()\n\t})\n\n\twindow.addEventListener('scroll', handleWindowEvent, true)\n\twindow.addEventListener('resize', handleWindowEvent)\n\n\t// 点击外部关闭下拉菜单\n\tdocument.addEventListener('click', e => {\n\t\tconst selectEl = document.querySelector('.touchchat-custom-select')\n\t\tif (selectEl && !selectEl.contains(e.target as Node)) {\n\t\t\tisSelectOpen.value = false\n\t\t}\n\t})\n})\n\nonUnmounted(() => {\n\twindow.removeEventListener('scroll', handleWindowEvent, true)\n\twindow.removeEventListener('resize', handleWindowEvent)\n})\n</script>\n"],"names":["ref","computed","nextTick","onMounted","onUnmounted","_createElementBlock","_createElementVNode","_normalizeClass","_Fragment","_renderList","_toDisplayString"],"mappings":"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"}
@@ -107,7 +107,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
107
107
  vue.createElementVNode(
108
108
  "div",
109
109
  {
110
- class: vue.normalizeClass(["pdf-file", _ctx.item.uploadError ? "pdf-error" : "pdf-success"]),
110
+ class: vue.normalizeClass(["pdf-file", __props.item.uploadError ? "pdf-error" : "pdf-success"]),
111
111
  onClick: fileClick
112
112
  },
113
113
  [
@@ -131,12 +131,12 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
131
131
  class: "pdf-file-title",
132
132
  onMouseenter: handleMouseEnter,
133
133
  onMouseleave: ($event) => showTooltip.value = false
134
- }, vue.toDisplayString(_ctx.item.name), 41, ["onMouseleave"]),
135
- _ctx.item.uploadError ? (vue.openBlock(), vue.createElementBlock("p", {
134
+ }, vue.toDisplayString(__props.item.name), 41, ["onMouseleave"]),
135
+ __props.item.uploadError ? (vue.openBlock(), vue.createElementBlock("p", {
136
136
  key: 0,
137
137
  class: "pdf-file-info"
138
138
  }, "\u9519\u8BEF")) : vue.createCommentVNode("v-if", true),
139
- progress.value !== 100 && !_ctx.item.uploadError ? (vue.openBlock(), vue.createElementBlock(
139
+ progress.value !== 100 && !__props.item.uploadError ? (vue.openBlock(), vue.createElementBlock(
140
140
  "p",
141
141
  {
142
142
  key: 1,
@@ -146,18 +146,18 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
146
146
  1
147
147
  /* TEXT */
148
148
  )) : vue.createCommentVNode("v-if", true),
149
- progress.value === 100 && !_ctx.item.uploadError ? (vue.openBlock(), vue.createElementBlock(
149
+ progress.value === 100 && !__props.item.uploadError ? (vue.openBlock(), vue.createElementBlock(
150
150
  "p",
151
151
  {
152
152
  key: 2,
153
153
  class: "pdf-file-info"
154
154
  },
155
- vue.toDisplayString(_ctx.item.fileSize),
155
+ vue.toDisplayString(__props.item.fileSize),
156
156
  1
157
157
  /* TEXT */
158
158
  )) : vue.createCommentVNode("v-if", true),
159
- vue.createCommentVNode(` <p v-if="showTooltip" ref="tooltipElement" class="pdf-file-tooltip" :style="{ top: tooltipTop + 'px' }">
160
- {{ item.name }}
159
+ vue.createCommentVNode(` <p v-if="showTooltip" ref="tooltipElement" class="pdf-file-tooltip" :style="{ top: tooltipTop + 'px' }">\r
160
+ {{ item.name }}\r
161
161
  </p> `)
162
162
  ],
163
163
  512
@@ -182,7 +182,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
182
182
  )) : vue.createCommentVNode("v-if", true),
183
183
  vue.withDirectives(vue.createElementVNode("div", {
184
184
  class: "pdf-file-colse",
185
- onClick: ($event) => emits("colse", _ctx.item.id)
185
+ onClick: ($event) => emits("colse", __props.item.id)
186
186
  }, [
187
187
  (vue.openBlock(), vue.createElementBlock("svg", {
188
188
  xmlns: "http://www.w3.org/2000/svg",
@@ -197,7 +197,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
197
197
  })
198
198
  ]))
199
199
  ], 8, ["onClick"]), [
200
- [vue.vShow, _ctx.hasColse]
200
+ [vue.vShow, __props.hasColse]
201
201
  ])
202
202
  ],
203
203
  2
@@ -1 +1 @@
1
- {"version":3,"file":"PDFFile.vue2.js","sources":["../../../../../../packages/components/touchchat/component/PDFFile.vue"],"sourcesContent":["<template>\n\t<!-- -->\n\t<div class=\"pdf-file\" :class=\"item.uploadError ? 'pdf-error' : 'pdf-success'\" @click=\"fileClick\">\n\t\t<!-- <span>{{imgType}}</span> -->\n\t\t<img class=\"pdf-file-img\" :src=\"imgTypeInfo[imgType]\" :alt=\"imgType\" />\n\t\t<div ref=\"centerContainer\" class=\"pdf-file-center\">\n\t\t\t<p ref=\"titleElement\" class=\"pdf-file-title\" @mouseenter=\"handleMouseEnter\" @mouseleave=\"showTooltip = false\">\n\t\t\t\t{{ item.name }}\n\t\t\t</p>\n\t\t\t<p v-if=\"item.uploadError\" class=\"pdf-file-info\">错误</p>\n\t\t\t<p v-if=\"progress !== 100 && !item.uploadError\" class=\"pdf-file-info\">{{ progress }}%</p>\n\t\t\t<p v-if=\"progress === 100 && !item.uploadError\" class=\"pdf-file-info\">{{ item.fileSize }}</p>\n\t\t\t<!-- <p v-if=\"showTooltip\" ref=\"tooltipElement\" class=\"pdf-file-tooltip\" :style=\"{ top: tooltipTop + 'px' }\">\n\t\t\t\t{{ item.name }}\n\t\t\t</p> -->\n\t\t</div>\n\t\t<img class=\"pdf-file-reset\" src=\"../img/svg/reset.svg\" alt=\"reset\" @click=\"handleReset\" />\n\t\t<div v-if=\"progress !== 100\" :style=\"{ width: (progress * 2) / 3 + '%' }\" class=\"pdf-file-progress\"></div>\n\t\t<div v-show=\"hasColse\" class=\"pdf-file-colse\" @click=\"emits('colse', item.id)\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"5\" height=\"6\" viewBox=\"0 0 5 6\" fill=\"none\">\n\t\t\t\t<path d=\"M4.42492 5.31718L4.97489 4.76721L3.05002 2.84233L4.97493 0.917422L4.42496 0.36745L2.50005 2.29236L0.575118 0.367432L0.0251465 0.917403L1.95008 2.84233L0.0251875 4.76722L0.575159 5.3172L2.50005 3.39231L4.42492 5.31718Z\" fill=\"white\" />\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n</template>\n<script setup lang=\"ts\">\nimport { ref, nextTick, onMounted, onUnmounted, computed, inject } from 'vue'\nimport type { FileItem } from '../src/AiChat/Chat/types'\nimport DOC from '../img/file/doc.png'\nimport DOCX from '../img/file/docx.png'\nimport HTML from '../img/file/html.png'\nimport JPG from '../img/file/jpg.png'\nimport MP3 from '../img/file/mp3.png'\nimport MP4 from '../img/file/mp4.png'\nimport MUSIC from '../img/file/music.png'\nimport PDF from '../img/file/pdf.png'\nimport PNG from '../img/file/png.png'\nimport XLS from '../img/file/xls.png'\nimport TXT from '../img/file/txt.png'\nimport GIF from '../img/file/gif.png'\nimport PPT from '../img/file/ppt.png'\nimport PPTX from '../img/file/pptx.png'\nimport XLSX from '../img/file/xlsx.png'\n\ntype ImgType = 'doc' | 'docx' | 'html' | 'jpg' | 'mp3' | 'mp4' | 'music' | 'pdf' | 'png' | 'xls' | 'txt' | 'gif' | 'ppt' | 'pptx' | 'xlsx' | ''\nconst imgTypeInfo: Record<ImgType, string> = {\n\tdoc: DOC,\n\tdocx: DOCX,\n\thtml: HTML,\n\tjpg: JPG,\n\tmp3: MP3,\n\tmp4: MP4,\n\tmusic: MUSIC,\n\tpdf: PDF,\n\tpng: PNG,\n\txls: XLS,\n\ttxt: TXT,\n\tgif: GIF,\n\tppt: PPT,\n\tpptx: PPTX,\n\txlsx: XLSX,\n\t'': ''\n}\nconst props = defineProps<{\n\titem: FileItem\n\tindex: number\n\thasColse: boolean\n}>()\n\nconst emits = defineEmits(['colse'])\n\nconst showTooltip = ref(false)\nconst titleElement = ref<HTMLElement | null>(null)\nconst tooltipElement = ref<HTMLElement | null>(null)\nconst centerContainer = ref<HTMLElement | null>(null)\nconst tooltipTop = ref(0)\nconst progress = computed(() => {\n\treturn props.item.uploadProgress ?? 0\n})\n\nconst imgType = computed<ImgType>(() => {\n\tconst arr = props.item.name.split('.')\n\tconst type = arr[arr.length - 1].toLowerCase() as ImgType // 转换为小写并断言类型\n\t// 检查是否是有效类型,不是则返回空字符串\n\treturn (Object.keys(imgTypeInfo) as ImgType[]).includes(type) ? type : ''\n})\n\nconst updateTooltipPosition = () => {\n\tif (titleElement.value && tooltipElement.value && centerContainer.value) {\n\t\tconst titleRect = titleElement.value.getBoundingClientRect()\n\t\tconst containerRect = centerContainer.value.getBoundingClientRect()\n\t\t// 计算相对于容器的 top 值\n\t\tconst relativeTop = titleRect.top - containerRect.top\n\t\ttooltipTop.value = relativeTop - tooltipElement.value.offsetHeight - 6\n\t}\n}\n\nconst handleMouseEnter = async () => {\n\tshowTooltip.value = true\n\t// 等待 DOM 更新完成后再调用更新位置的方法\n\tawait nextTick()\n\tupdateTooltipPosition()\n}\n\nconst handleResize = () => {\n\tif (showTooltip.value) {\n\t\tupdateTooltipPosition()\n\t}\n}\n\nconst uploadFile = inject<(index: number, type?: string) => void>('uploadFile', () => {\n\tconsole.warn('未提供bottom函数')\n})\n\nconst handleReset = () => {\n\tuploadFile(props.index, 'PDF')\n}\nonMounted(() => {\n\twindow.addEventListener('resize', handleResize)\n})\nonUnmounted(() => {\n\twindow.removeEventListener('resize', handleResize)\n})\nconst fileAction = inject<(item: any, index: number) => void>('fileAction', () => {})\nconst fileClick = () => {\n\tfileAction(props.item, props.index)\n}\n</script>\n"],"names":["DOC","DOCX","HTML","JPG","MP3","MP4","MUSIC","PDF","PNG","XLS","TXT","GIF","PPT","PPTX","XLSX","ref","computed","nextTick","inject","onMounted","onUnmounted","_createCommentVNode","_createElementVNode","_normalizeClass","item","_createElementBlock","_toDisplayString","_imports_0","hasColse"],"mappings":"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"}
1
+ {"version":3,"file":"PDFFile.vue2.js","sources":["../../../../../../packages/components/touchchat/component/PDFFile.vue"],"sourcesContent":["<template>\r\n\t<!-- -->\r\n\t<div class=\"pdf-file\" :class=\"item.uploadError ? 'pdf-error' : 'pdf-success'\" @click=\"fileClick\">\r\n\t\t<!-- <span>{{imgType}}</span> -->\r\n\t\t<img class=\"pdf-file-img\" :src=\"imgTypeInfo[imgType]\" :alt=\"imgType\" />\r\n\t\t<div ref=\"centerContainer\" class=\"pdf-file-center\">\r\n\t\t\t<p ref=\"titleElement\" class=\"pdf-file-title\" @mouseenter=\"handleMouseEnter\" @mouseleave=\"showTooltip = false\">\r\n\t\t\t\t{{ item.name }}\r\n\t\t\t</p>\r\n\t\t\t<p v-if=\"item.uploadError\" class=\"pdf-file-info\">错误</p>\r\n\t\t\t<p v-if=\"progress !== 100 && !item.uploadError\" class=\"pdf-file-info\">{{ progress }}%</p>\r\n\t\t\t<p v-if=\"progress === 100 && !item.uploadError\" class=\"pdf-file-info\">{{ item.fileSize }}</p>\r\n\t\t\t<!-- <p v-if=\"showTooltip\" ref=\"tooltipElement\" class=\"pdf-file-tooltip\" :style=\"{ top: tooltipTop + 'px' }\">\r\n\t\t\t\t{{ item.name }}\r\n\t\t\t</p> -->\r\n\t\t</div>\r\n\t\t<img class=\"pdf-file-reset\" src=\"../img/svg/reset.svg\" alt=\"reset\" @click=\"handleReset\" />\r\n\t\t<div v-if=\"progress !== 100\" :style=\"{ width: (progress * 2) / 3 + '%' }\" class=\"pdf-file-progress\"></div>\r\n\t\t<div v-show=\"hasColse\" class=\"pdf-file-colse\" @click=\"emits('colse', item.id)\">\r\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"5\" height=\"6\" viewBox=\"0 0 5 6\" fill=\"none\">\r\n\t\t\t\t<path d=\"M4.42492 5.31718L4.97489 4.76721L3.05002 2.84233L4.97493 0.917422L4.42496 0.36745L2.50005 2.29236L0.575118 0.367432L0.0251465 0.917403L1.95008 2.84233L0.0251875 4.76722L0.575159 5.3172L2.50005 3.39231L4.42492 5.31718Z\" fill=\"white\" />\r\n\t\t\t</svg>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport { ref, nextTick, onMounted, onUnmounted, computed, inject } from 'vue'\r\nimport type { FileItem } from '../src/AiChat/Chat/types'\r\nimport DOC from '../img/file/doc.png'\r\nimport DOCX from '../img/file/docx.png'\r\nimport HTML from '../img/file/html.png'\r\nimport JPG from '../img/file/jpg.png'\r\nimport MP3 from '../img/file/mp3.png'\r\nimport MP4 from '../img/file/mp4.png'\r\nimport MUSIC from '../img/file/music.png'\r\nimport PDF from '../img/file/pdf.png'\r\nimport PNG from '../img/file/png.png'\r\nimport XLS from '../img/file/xls.png'\r\nimport TXT from '../img/file/txt.png'\r\nimport GIF from '../img/file/gif.png'\r\nimport PPT from '../img/file/ppt.png'\r\nimport PPTX from '../img/file/pptx.png'\r\nimport XLSX from '../img/file/xlsx.png'\r\n\r\ntype ImgType = 'doc' | 'docx' | 'html' | 'jpg' | 'mp3' | 'mp4' | 'music' | 'pdf' | 'png' | 'xls' | 'txt' | 'gif' | 'ppt' | 'pptx' | 'xlsx' | ''\r\nconst imgTypeInfo: Record<ImgType, string> = {\r\n\tdoc: DOC,\r\n\tdocx: DOCX,\r\n\thtml: HTML,\r\n\tjpg: JPG,\r\n\tmp3: MP3,\r\n\tmp4: MP4,\r\n\tmusic: MUSIC,\r\n\tpdf: PDF,\r\n\tpng: PNG,\r\n\txls: XLS,\r\n\ttxt: TXT,\r\n\tgif: GIF,\r\n\tppt: PPT,\r\n\tpptx: PPTX,\r\n\txlsx: XLSX,\r\n\t'': ''\r\n}\r\nconst props = defineProps<{\r\n\titem: FileItem\r\n\tindex: number\r\n\thasColse: boolean\r\n}>()\r\n\r\nconst emits = defineEmits(['colse'])\r\n\r\nconst showTooltip = ref(false)\r\nconst titleElement = ref<HTMLElement | null>(null)\r\nconst tooltipElement = ref<HTMLElement | null>(null)\r\nconst centerContainer = ref<HTMLElement | null>(null)\r\nconst tooltipTop = ref(0)\r\nconst progress = computed(() => {\r\n\treturn props.item.uploadProgress ?? 0\r\n})\r\n\r\nconst imgType = computed<ImgType>(() => {\r\n\tconst arr = props.item.name.split('.')\r\n\tconst type = arr[arr.length - 1].toLowerCase() as ImgType // 转换为小写并断言类型\r\n\t// 检查是否是有效类型,不是则返回空字符串\r\n\treturn (Object.keys(imgTypeInfo) as ImgType[]).includes(type) ? type : ''\r\n})\r\n\r\nconst updateTooltipPosition = () => {\r\n\tif (titleElement.value && tooltipElement.value && centerContainer.value) {\r\n\t\tconst titleRect = titleElement.value.getBoundingClientRect()\r\n\t\tconst containerRect = centerContainer.value.getBoundingClientRect()\r\n\t\t// 计算相对于容器的 top 值\r\n\t\tconst relativeTop = titleRect.top - containerRect.top\r\n\t\ttooltipTop.value = relativeTop - tooltipElement.value.offsetHeight - 6\r\n\t}\r\n}\r\n\r\nconst handleMouseEnter = async () => {\r\n\tshowTooltip.value = true\r\n\t// 等待 DOM 更新完成后再调用更新位置的方法\r\n\tawait nextTick()\r\n\tupdateTooltipPosition()\r\n}\r\n\r\nconst handleResize = () => {\r\n\tif (showTooltip.value) {\r\n\t\tupdateTooltipPosition()\r\n\t}\r\n}\r\n\r\nconst uploadFile = inject<(index: number, type?: string) => void>('uploadFile', () => {\r\n\tconsole.warn('未提供bottom函数')\r\n})\r\n\r\nconst handleReset = () => {\r\n\tuploadFile(props.index, 'PDF')\r\n}\r\nonMounted(() => {\r\n\twindow.addEventListener('resize', handleResize)\r\n})\r\nonUnmounted(() => {\r\n\twindow.removeEventListener('resize', handleResize)\r\n})\r\nconst fileAction = inject<(item: any, index: number) => void>('fileAction', () => {})\r\nconst fileClick = () => {\r\n\tfileAction(props.item, props.index)\r\n}\r\n</script>\r\n"],"names":["DOC","DOCX","HTML","JPG","MP3","MP4","MUSIC","PDF","PNG","XLS","TXT","GIF","PPT","PPTX","XLSX","ref","computed","nextTick","inject","onMounted","onUnmounted","_createCommentVNode","_createElementVNode","_normalizeClass","_toDisplayString","_createElementBlock","_imports_0"],"mappings":"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"}
@@ -6,13 +6,51 @@ var vue = require('vue');
6
6
 
7
7
  var _sfc_main = /* @__PURE__ */ vue.defineComponent({
8
8
  __name: "QuoteContent",
9
- props: ["quoteObj"],
9
+ props: {
10
+ quoteObj: {},
11
+ isClose: { type: Boolean, default: false }
12
+ },
10
13
  emits: ["close"],
11
14
  setup(__props, { emit: __emit }) {
12
15
  const props = __props;
13
16
  const emits = __emit;
17
+ const scrollToMessage = vue.inject("scrollToMessage", () => {
18
+ console.warn("scrollToMessage \u672A\u63D0\u4F9B");
19
+ });
20
+ const getQuoteContent = vue.computed(() => {
21
+ let content = "";
22
+ if (props.quoteObj.msgList && props.quoteObj.msgList.length) {
23
+ props.quoteObj.msgList.forEach((msg) => {
24
+ if (msg.type === "text" || msg.type === "markdown") {
25
+ content += msg.content;
26
+ } else if (msg.type === "a2ui" || msg.type === "component" && msg.displayMode === "inline") {
27
+ content += "[\u7EC4\u4EF6]";
28
+ } else if (msg.type === "image") {
29
+ content += "[\u56FE\u7247]";
30
+ } else if (msg.type === "file") {
31
+ content += "[\u6587\u4EF6]";
32
+ } else if (msg.type === "voice") {
33
+ content += "[\u8BED\u97F3]";
34
+ } else if (msg.type === "video") {
35
+ content += "[\u89C6\u9891]";
36
+ } else if (msg.type === "link") {
37
+ content += "[\u94FE\u63A5]";
38
+ }
39
+ });
40
+ } else {
41
+ if (props.quoteObj.content) {
42
+ content = props.quoteObj.content;
43
+ }
44
+ }
45
+ return content;
46
+ });
47
+ const handleGoChat = () => {
48
+ var _a;
49
+ if ((_a = props.quoteObj) == null ? void 0 : _a.chatId) {
50
+ scrollToMessage(props.quoteObj.chatId);
51
+ }
52
+ };
14
53
  return (_ctx, _cache) => {
15
- var _a, _b, _c, _d, _e, _f;
16
54
  return vue.openBlock(), vue.createElementBlock("div", { class: "quote-content" }, [
17
55
  vue.createElementVNode("div", { class: "quote-content-text" }, [
18
56
  vue.createElementVNode(
@@ -22,19 +60,23 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
22
60
  1
23
61
  /* TEXT */
24
62
  ),
25
- ((_a = props.quoteObj.msgList[0]) == null ? void 0 : _a.type) === "text" || ((_b = props.quoteObj.msgList[0]) == null ? void 0 : _b.type) === "markdown" ? (vue.openBlock(), vue.createElementBlock(
63
+ vue.createElementVNode(
26
64
  "span",
27
- { key: 0 },
28
- vue.toDisplayString((_c = props.quoteObj.msgList[0]) == null ? void 0 : _c.content),
65
+ null,
66
+ vue.toDisplayString(getQuoteContent.value),
29
67
  1
30
68
  /* TEXT */
31
- )) : vue.createCommentVNode("v-if", true),
32
- ((_d = props.quoteObj.msgList[0]) == null ? void 0 : _d.type) === "a2ui" || ((_e = props.quoteObj.msgList[0]) == null ? void 0 : _e.type) === "component" && ((_f = props.quoteObj.msgList[0]) == null ? void 0 : _f.displayMode) === "inline" ? (vue.openBlock(), vue.createElementBlock("span", { key: 1 }, "[\u7EC4\u4EF6]")) : vue.createCommentVNode("v-if", true)
69
+ ),
70
+ vue.createElementVNode("div", {
71
+ class: "touchchat-action-item value-right-arrow",
72
+ onClick: handleGoChat
73
+ })
33
74
  ]),
34
- vue.createElementVNode("div", {
75
+ props.isClose ? (vue.openBlock(), vue.createElementBlock("div", {
76
+ key: 0,
35
77
  class: "touchchat-action-item value-close-fill",
36
78
  onClick: ($event) => emits("close")
37
- }, null, 8, ["onClick"])
79
+ }, null, 8, ["onClick"])) : vue.createCommentVNode("v-if", true)
38
80
  ]);
39
81
  };
40
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"QuoteContent.vue2.js","sources":["../../../../../../packages/components/touchchat/component/QuoteContent.vue"],"sourcesContent":["<template>\n\t<div class=\"quote-content\">\n\t\t<div class=\"quote-content-text\">\n\t\t\t<span>{{ props.quoteObj.user }}:</span>\n\t\t\t<span v-if=\"props.quoteObj.msgList[0]?.type === 'text' || props.quoteObj.msgList[0]?.type === 'markdown'\">{{ props.quoteObj.msgList[0]?.content }}</span>\n\t\t\t<span v-if=\"props.quoteObj.msgList[0]?.type === 'a2ui' || (props.quoteObj.msgList[0]?.type === 'component' && props.quoteObj.msgList[0]?.displayMode === 'inline')\">[组件]</span>\n\t\t</div>\n\t\t<div class=\"touchchat-action-item value-close-fill\" @click=\"emits('close')\"></div>\n\t</div>\n</template>\n<script lang=\"ts\" setup>\nconst props = defineProps(['quoteObj'])\nconst emits = defineEmits(['close'])\n</script>\n"],"names":["_createElementBlock","_createElementVNode","_openBlock"],"mappings":";;;;;;;;;;;AAWA,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AACd,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAA;;;4BAXb,EAAAA,sBAAA,CAOM,OAAA,EAPD,KAAA,EAAM,iBAAe,EAAA;AAAA,QACzBC,sBAIM,CAAA,KAAA,EAAA,EAJD,KAAA,EAAM,sBAAoB,EAAA;AAAA,UAC9BA,sBAAA;AAAA,YAAuC,MAAA;AAAA;+BAA9B,CAAA,KAAA,CAAM,QAAS,CAAA,IAAI,CAAG,GAAA,QAAA;AAAA,YAAC,CAAA;AAAA;AAAA,WAAA;AAAA,UAAA,CAAA,CACpB,WAAM,QAAS,CAAA,OAAA,CAAY,CAAA,CAAA,KAA3B,mBAA2B,IAAmB,MAAA,MAAA,IAAA,CAAA,CAAA,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,eAAf,mBAA2B,IAAI,MAAA,UAAA,IAAzFC,eAAA,EAAAF,sBAAA;AAAA,YAAyJ,MAAA;AAAA;iCAA5C,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,eAAf,mBAA2B,OAAO,CAAA;AAAA,YAAA,CAAA;AAAA;AAAA,WAAA;YACnI,WAAM,QAAS,CAAA,OAAA,QAAf,mBAA2B,IAAI,MAAA,MAAA,IAAA,CAAA,CAAgB,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,QAAO,CAAA,CAAA,KAAtB,IAA2B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,MAAwB,iBAAA,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,OAAO,CAAA,CAAA,MAAtB,IAA2B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,MAAW,QAApJ,IAAAE,aAAA,IAAAF,sBAA+K,CAAA,MAAA,YAAX,EAAA,gBAAI;;QAEzKC,uBAAkF,KAAA,EAAA;AAAA,UAA7E,KAAM,EAAA,wCAAA;AAAA,UAA0C,gBAAO,KAAA,KAAA,CAAK,OAAA,CAAA;AAAA;;;;;;;;"}
1
+ {"version":3,"file":"QuoteContent.vue2.js","sources":["../../../../../../packages/components/touchchat/component/QuoteContent.vue"],"sourcesContent":["<template>\r\n\t<div class=\"quote-content\">\r\n\t\t<div class=\"quote-content-text\">\r\n\t\t\t<span>{{ props.quoteObj.user }}:</span>\r\n\t\t\t<span>{{ getQuoteContent }}</span>\r\n\t\t\t<div class=\"touchchat-action-item value-right-arrow\" @click=\"handleGoChat\"></div>\r\n\t\t</div>\r\n\t\t<div v-if=\"props.isClose\" class=\"touchchat-action-item value-close-fill\" @click=\"emits('close')\"></div>\r\n\t</div>\r\n</template>\r\n<script lang=\"ts\" setup>\r\nimport { computed, inject } from 'vue'\r\n\r\ninterface QuoteObj {\r\n\tuser?: string\r\n\tcontent?: string\r\n\tmsgList?: Array<{ type: string; content?: string; displayMode?: string }>\r\n\t[key: string]: any\r\n}\r\n\r\nconst props = withDefaults(\r\n\tdefineProps<{\r\n\t\tquoteObj: QuoteObj\r\n\t\tisClose?: boolean\r\n\t}>(),\r\n\t{\r\n\t\tisClose: false\r\n\t}\r\n)\r\n\r\nconst emits = defineEmits<{\r\n\tclose: []\r\n}>()\r\n\r\nconst scrollToMessage = inject<(chatId: string) => void>('scrollToMessage', () => {\r\n\tconsole.warn('scrollToMessage 未提供')\r\n})\r\nconst getQuoteContent = computed(() => {\r\n\tlet content = ''\r\n\tif (props.quoteObj.msgList && props.quoteObj.msgList.length) {\r\n\t\tprops.quoteObj.msgList.forEach((msg: any) => {\r\n\t\t\tif (msg.type === 'text' || msg.type === 'markdown') {\r\n\t\t\t\tcontent += msg.content\r\n\t\t\t} else if (msg.type === 'a2ui' || (msg.type === 'component' && msg.displayMode === 'inline')) {\r\n\t\t\t\tcontent += '[组件]'\r\n\t\t\t} else if (msg.type === 'image') {\r\n\t\t\t\tcontent += '[图片]'\r\n\t\t\t} else if (msg.type === 'file') {\r\n\t\t\t\tcontent += '[文件]'\r\n\t\t\t} else if (msg.type === 'voice') {\r\n\t\t\t\tcontent += '[语音]'\r\n\t\t\t} else if (msg.type === 'video') {\r\n\t\t\t\tcontent += '[视频]'\r\n\t\t\t} else if (msg.type === 'link') {\r\n\t\t\t\tcontent += '[链接]'\r\n\t\t\t}\r\n\t\t})\r\n\t} else {\r\n\t\tif (props.quoteObj.content) {\r\n\t\t\tcontent = props.quoteObj.content\r\n\t\t}\r\n\t}\r\n\treturn content\r\n})\r\n\r\nconst handleGoChat = () => {\r\n\tif (props.quoteObj?.chatId) {\r\n\t\tscrollToMessage(props.quoteObj.chatId)\r\n\t}\r\n}\r\n</script>\r\n"],"names":["inject","computed","_createElementBlock","_createElementVNode"],"mappings":"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"}
@@ -154,7 +154,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
154
154
  ])
155
155
  ])) : vue.createCommentVNode("v-if", true),
156
156
  vue.createCommentVNode(" \u663E\u793A\u8BED\u97F3\u8F6C\u6587\u5B57\u7684\u7ED3\u679C "),
157
- vue.createCommentVNode(' <div v-if="transcription" class="transcription-result">\n <h4>\u8BED\u97F3\u8F6C\u6587\u5B57\u7ED3\u679C\uFF1A</h4>\n <p>{{ transcription }}</p>\n </div> ')
157
+ vue.createCommentVNode(' <div v-if="transcription" class="transcription-result">\r\n <h4>\u8BED\u97F3\u8F6C\u6587\u5B57\u7ED3\u679C\uFF1A</h4>\r\n <p>{{ transcription }}</p>\r\n </div> ')
158
158
  ]);
159
159
  };
160
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RealtimeVoice.vue2.js","sources":["../../../../../../packages/components/touchchat/component/RealtimeVoice.vue"],"sourcesContent":["<template>\n\t<div>\n\t\t<button class=\"touchchat-edit-voice touchchat-edit-button\" @click=\"startRealtimeVoice\">\n\t\t\t<!-- 未实时语音前 -->\n\t\t\t<div v-if=\"!dialogVisible\" class=\"touchchat-edit-voice-icon\"></div>\n\t\t\t<!-- 实时语音中 -->\n\n\t\t\t<svg v-else xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n\t\t\t\t<path class=\"touchchat-voice-bar-1\" d=\"M10 2.57617V17.4247\" stroke=\"#0077FA\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-2\" d=\"M14.167 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-3\" d=\"M1.66699 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-4\" d=\"M18.333 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-5\" d=\"M5.83301 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t</svg>\n\t\t\t<div class=\"touchchat-edit-tooltip\">语音录入</div>\n\t\t</button>\n\t\t<div v-if=\"dialogVisible\" class=\"dialog-overlay\">\n\t\t\t<div class=\"dialog\">\n\t\t\t\t<div class=\"dialog-header\">\n\t\t\t\t\t<h3>已进入实时语音</h3>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"dialog-body\">\n\t\t\t\t\t<p>正在进行实时语音通话...</p>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"dialog-footer\">\n\t\t\t\t\t<button class=\"hang-up-button\" @click=\"hangUp\">挂断</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<!-- 显示语音转文字的结果 -->\n\t\t<!-- <div v-if=\"transcription\" class=\"transcription-result\">\n\t\t\t<h4>语音转文字结果:</h4>\n\t\t\t<p>{{ transcription }}</p>\n\t\t</div> -->\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { showToast } from '../utils/tools'\n\nconst emit = defineEmits(['startRealtimeVoice', 'transcription'])\n\n// 控制弹窗显示状态\nconst dialogVisible = ref(false)\n// 存储本地媒体流\nlet localStream: MediaStream | null = null\n// 存储语音转文字的结果\nconst transcription = ref('')\n// 语音识别实例 SpeechRecognition\nlet recognition: any = null\n\n// 开始实时语音\nconst startRealtimeVoice = async () => {\n\temit('startRealtimeVoice')\n\ttry {\n\t\t// 获取麦克风权限\n\t\tlocalStream = await navigator.mediaDevices.getUserMedia({ audio: true })\n\t\tdialogVisible.value = true\n\t\ttranscription.value = ''\n\n\t\t// 初始化语音识别\n\t\tconst SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition\n\t\trecognition = new SpeechRecognition()\n\t\trecognition.lang = 'zh-CN'\n\t\trecognition.continuous = true\n\t\trecognition.interimResults = true\n\n\t\t// SpeechRecognitionEvent\n\t\trecognition.onresult = (event: any) => {\n\t\t\tlet finalTranscript = ''\n\t\t\tlet interimTranscript = ''\n\n\t\t\t// 分别处理最终结果和临时结果\n\t\t\tfor (let i = event.resultIndex; i < event.results.length; ++i) {\n\t\t\t\tconst transcript = event.results[i][0].transcript\n\t\t\t\tif (event.results[i].isFinal) {\n\t\t\t\t\tfinalTranscript += transcript\n\t\t\t\t} else {\n\t\t\t\t\tinterimTranscript += transcript\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 只有最终结果才添加到 transcription.value 中\n\t\t\tif (finalTranscript) {\n\t\t\t\ttranscription.value += finalTranscript\n\t\t\t}\n\n\t\t\t// 临时结果显示(可用于实时预览)\n\t\t\tconst fullText = transcription.value + interimTranscript\n\n\t\t\temit('transcription', fullText)\n\t\t}\n\n\t\t// SpeechRecognitionEvent\n\t\trecognition.onerror = (event: any) => {\n\t\t\tconsole.error('语音识别出错:', event.error)\n\t\t\tshowToast('语音识别出错,请重试', 'error')\n\t\t\thangUp()\n\t\t}\n\n\t\trecognition.start()\n\t\tconsole.log('已成功进入实时语音')\n\t} catch (error) {\n\t\tconsole.error('获取麦克风权限失败:', error)\n\t\tconsole.error('获取麦克风权限失败,请检查设置')\n\t\tshowToast('获取麦克风权限失败', 'error')\n\t}\n}\n\n// 挂断语音\nconst hangUp = () => {\n\tif (localStream) {\n\t\t// 停止所有轨道\n\t\tlocalStream.getTracks().forEach(track => track.stop())\n\t\tlocalStream = null\n\t}\n\tif (recognition) {\n\t\trecognition.stop()\n\t\t// recognition = null;\n\t}\n\tdialogVisible.value = false\n\t// 清空转录结果\n\t// transcription.value = ''\n\tconsole.log('语音通话已挂断')\n}\n</script>\n"],"names":["ref","showToast","_createElementBlock","_createElementVNode","_createCommentVNode","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"RealtimeVoice.vue2.js","sources":["../../../../../../packages/components/touchchat/component/RealtimeVoice.vue"],"sourcesContent":["<template>\r\n\t<div>\r\n\t\t<button class=\"touchchat-edit-voice touchchat-edit-button\" @click=\"startRealtimeVoice\">\r\n\t\t\t<!-- 未实时语音前 -->\r\n\t\t\t<div v-if=\"!dialogVisible\" class=\"touchchat-edit-voice-icon\"></div>\r\n\t\t\t<!-- 实时语音中 -->\r\n\r\n\t\t\t<svg v-else xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n\t\t\t\t<path class=\"touchchat-voice-bar-1\" d=\"M10 2.57617V17.4247\" stroke=\"#0077FA\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-2\" d=\"M14.167 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-3\" d=\"M1.66699 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-4\" d=\"M18.333 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-5\" d=\"M5.83301 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t</svg>\r\n\t\t\t<div class=\"touchchat-edit-tooltip\">语音录入</div>\r\n\t\t</button>\r\n\t\t<div v-if=\"dialogVisible\" class=\"dialog-overlay\">\r\n\t\t\t<div class=\"dialog\">\r\n\t\t\t\t<div class=\"dialog-header\">\r\n\t\t\t\t\t<h3>已进入实时语音</h3>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"dialog-body\">\r\n\t\t\t\t\t<p>正在进行实时语音通话...</p>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"dialog-footer\">\r\n\t\t\t\t\t<button class=\"hang-up-button\" @click=\"hangUp\">挂断</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<!-- 显示语音转文字的结果 -->\r\n\t\t<!-- <div v-if=\"transcription\" class=\"transcription-result\">\r\n\t\t\t<h4>语音转文字结果:</h4>\r\n\t\t\t<p>{{ transcription }}</p>\r\n\t\t</div> -->\r\n\t</div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from 'vue'\r\nimport { showToast } from '../utils/tools'\r\n\r\nconst emit = defineEmits(['startRealtimeVoice', 'transcription'])\r\n\r\n// 控制弹窗显示状态\r\nconst dialogVisible = ref(false)\r\n// 存储本地媒体流\r\nlet localStream: MediaStream | null = null\r\n// 存储语音转文字的结果\r\nconst transcription = ref('')\r\n// 语音识别实例 SpeechRecognition\r\nlet recognition: any = null\r\n\r\n// 开始实时语音\r\nconst startRealtimeVoice = async () => {\r\n\temit('startRealtimeVoice')\r\n\ttry {\r\n\t\t// 获取麦克风权限\r\n\t\tlocalStream = await navigator.mediaDevices.getUserMedia({ audio: true })\r\n\t\tdialogVisible.value = true\r\n\t\ttranscription.value = ''\r\n\r\n\t\t// 初始化语音识别\r\n\t\tconst SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition\r\n\t\trecognition = new SpeechRecognition()\r\n\t\trecognition.lang = 'zh-CN'\r\n\t\trecognition.continuous = true\r\n\t\trecognition.interimResults = true\r\n\r\n\t\t// SpeechRecognitionEvent\r\n\t\trecognition.onresult = (event: any) => {\r\n\t\t\tlet finalTranscript = ''\r\n\t\t\tlet interimTranscript = ''\r\n\r\n\t\t\t// 分别处理最终结果和临时结果\r\n\t\t\tfor (let i = event.resultIndex; i < event.results.length; ++i) {\r\n\t\t\t\tconst transcript = event.results[i][0].transcript\r\n\t\t\t\tif (event.results[i].isFinal) {\r\n\t\t\t\t\tfinalTranscript += transcript\r\n\t\t\t\t} else {\r\n\t\t\t\t\tinterimTranscript += transcript\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// 只有最终结果才添加到 transcription.value 中\r\n\t\t\tif (finalTranscript) {\r\n\t\t\t\ttranscription.value += finalTranscript\r\n\t\t\t}\r\n\r\n\t\t\t// 临时结果显示(可用于实时预览)\r\n\t\t\tconst fullText = transcription.value + interimTranscript\r\n\r\n\t\t\temit('transcription', fullText)\r\n\t\t}\r\n\r\n\t\t// SpeechRecognitionEvent\r\n\t\trecognition.onerror = (event: any) => {\r\n\t\t\tconsole.error('语音识别出错:', event.error)\r\n\t\t\tshowToast('语音识别出错,请重试', 'error')\r\n\t\t\thangUp()\r\n\t\t}\r\n\r\n\t\trecognition.start()\r\n\t\tconsole.log('已成功进入实时语音')\r\n\t} catch (error) {\r\n\t\tconsole.error('获取麦克风权限失败:', error)\r\n\t\tconsole.error('获取麦克风权限失败,请检查设置')\r\n\t\tshowToast('获取麦克风权限失败', 'error')\r\n\t}\r\n}\r\n\r\n// 挂断语音\r\nconst hangUp = () => {\r\n\tif (localStream) {\r\n\t\t// 停止所有轨道\r\n\t\tlocalStream.getTracks().forEach(track => track.stop())\r\n\t\tlocalStream = null\r\n\t}\r\n\tif (recognition) {\r\n\t\trecognition.stop()\r\n\t\t// recognition = null;\r\n\t}\r\n\tdialogVisible.value = false\r\n\t// 清空转录结果\r\n\t// transcription.value = ''\r\n\tconsole.log('语音通话已挂断')\r\n}\r\n</script>\r\n"],"names":["ref","showToast","_createElementBlock","_createElementVNode","_createCommentVNode","_Fragment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"UploadView.vue2.js","sources":["../../../../../../packages/components/touchchat/component/UploadView.vue"],"sourcesContent":["<template>\n\t<div class=\"upload-view\">\n\t\t<!-- <button class=\"upload-button\" @click=\"triggerFileInput\">点击选择文件</button> -->\n\t\t<div @click=\"triggerFileInput\">\n\t\t\t<slot></slot>\n\t\t</div>\n\t\t<input ref=\"fileInput\" type=\"file\" class=\"file-input\" style=\"display: none\" multiple @change=\"handleFileChange\" />\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, inject } from 'vue'\nimport { showToast } from '../utils/tools'\nimport type { FileItem } from '../src/AiChat/Chat/types'\n\ntype UploadActionFn = (file: File, onProgress: (percent: number) => void) => Promise<any>\n\nconst uploadAction = inject<UploadActionFn | null>('uploadAction', null)\n\nconst props = defineProps<{\n\tfileList: FileItem[]\n}>()\n\nconst emit = defineEmits<{\n\t(e: 'upload-file', value: FileItem[]): void\n}>()\n\nconst fileInput = ref<HTMLInputElement | null>(null)\nconst fileInfos = ref<FileItem[]>(props.fileList || [])\nconst allowedTypes = inject<string[]>('allowedTypes', [])\n// ['doc', 'docx','word','png']\nconst types = ref<string[]>(allowedTypes || [])\n\n// 触发文件选择框\nconst triggerFileInput = () => {\n\tif (fileInput.value) {\n\t\tfileInput.value.click()\n\t}\n}\n\n// 处理文件选择\nconst handleFileChange = (event: Event) => {\n\tconst input = event.target as HTMLInputElement\n\tif (input.files && input.files.length > 0) {\n\t\tfor (let i = 0; i < input.files.length; i++) {\n\t\t\tconst file = input.files[i]\n\t\t\t// 检查是否已存在相同文件(同名同大小)\n\t\t\tconst exists = fileInfos.value.some(f => f.name === file.name && f.fileSize === formatFileSize(file.size))\n\t\t\tif (exists) {\n\t\t\t\tshowToast(`文件\"${file.name}\"已存在`, 'info', 3000)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// 检查文件类型是否允许\n\t\t\tif (!isFileTypeAllowed(file) && types.value.length > 0) {\n\t\t\t\tshowToast(`文件类型${file.type}不允许上传,请上传${types.value.join('、')}类型文件`, 'info', 3000)\n\t\t\t\tcontinue // 跳过不允许的文件类型\n\t\t\t}\n\t\t\tif (file.type.startsWith('image/')) {\n\t\t\t\tconst reader = new FileReader()\n\t\t\t\treader.onload = e => {\n\t\t\t\t\tconst base64 = e.target?.result as string\n\t\t\t\t\tfileInfos.value.push({\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tisUploading: false,\n\t\t\t\t\t\tuploadProgress: 0,\n\t\t\t\t\t\tuploadSuccess: false,\n\t\t\t\t\t\tuploadError: false,\n\t\t\t\t\t\tfileSize: formatFileSize(file.size),\n\t\t\t\t\t\tfileType: file.type,\n\t\t\t\t\t\tid: file.lastModified.toString(),\n\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\tbase64, // 存储 Base64 数据\n\t\t\t\t\t\tlastModified: file.lastModified\n\t\t\t\t\t})\n\t\t\t\t\tuploadFile(fileInfos.value.length - 1)\n\t\t\t\t}\n\t\t\t\treader.readAsDataURL(file)\n\t\t\t} else {\n\t\t\t\tfileInfos.value.push({\n\t\t\t\t\tfile,\n\t\t\t\t\tisUploading: false,\n\t\t\t\t\tuploadProgress: 0,\n\t\t\t\t\tuploadSuccess: false,\n\t\t\t\t\tuploadError: false,\n\t\t\t\t\tfileSize: formatFileSize(file.size),\n\t\t\t\t\tfileType: file.type,\n\t\t\t\t\tid: file.lastModified.toString(),\n\t\t\t\t\tname: file.name,\n\t\t\t\t\tlastModified: file.lastModified\n\t\t\t\t})\n\t\t\t\tuploadFile(fileInfos.value.length - 1)\n\t\t\t}\n\t\t}\n\t\t// 清空 input value,允许重复选择同一文件\n\t\tif (fileInput.value) {\n\t\t\tfileInput.value.value = ''\n\t\t}\n\t}\n}\n// 检查文件类型是否允许\nconst isFileTypeAllowed = (file: File): boolean => {\n\tconst fileExtension = file.name.split('.').pop()?.toLowerCase()\n\treturn types.value.includes(fileExtension || '')\n}\n// 文件上传\nconst uploadFile = async (index: number, type?: string) => {\n\tconst fileInfo = fileInfos.value[index]\n\tif (!fileInfo || !fileInfo.file) return\n\n\tfileInfo.isUploading = true\n\tfileInfo.uploadSuccess = false\n\tfileInfo.uploadError = false\n\tfileInfo.uploadProgress = 0\n\tfileInfo.fileSize = formatFileSize(fileInfo.file.size)\n\tfileInfo.fileType = fileInfo.file.type\n\tfileInfo.id = fileInfo.file.lastModified.toString()\n\tfileInfo.name = fileInfo.file.name\n\n\tif (type) return\n\n\tif (uploadAction) {\n\t\t// 真实上传\n\t\tlet progressCalled = false\n\t\t// 保底进度:如果 onProgress 未被调用(如用 fetch),按时间递进补进度\n\t\tconst progressTimer = setInterval(() => {\n\t\t\tif (progressCalled) return\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress < 90) {\n\t\t\t\tfileInfo.uploadProgress += 10\n\t\t\t\temit('upload-file', fileInfos.value)\n\t\t\t}\n\t\t}, 100)\n\t\ttry {\n\t\t\tconst res = await uploadAction(fileInfo.file, percent => {\n\t\t\t\tprogressCalled = true\n\t\t\t\tfileInfo.uploadProgress = percent\n\t\t\t\temit('upload-file', fileInfos.value)\n\t\t\t})\n\t\t\tclearInterval(progressTimer)\n\t\t\tfileInfo.uploadSuccess = true\n\t\t\tfileInfo.uploadProgress = 100\n\t\t\tfileInfo.url = res?.url || res?.data?.url\n\t\t\tfileInfo.fileId = res?.id || res?.data?.id\n\t\t} catch {\n\t\t\tclearInterval(progressTimer)\n\t\t\tfileInfo.uploadError = true\n\t\t}\n\t\tfileInfo.isUploading = false\n\t\temit('upload-file', fileInfos.value)\n\t} else {\n\t\t// 无 uploadAction 时保持模拟上传(向后兼容)\n\t\tconst interval = setInterval(() => {\n\t\t\tif (fileInfo.uploadProgress !== undefined) {\n\t\t\t\tfileInfo.uploadProgress += 10\n\t\t\t}\n\t\t\temit('upload-file', fileInfos.value)\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress >= 100) {\n\t\t\t\tclearInterval(interval)\n\t\t\t\tfileInfo.isUploading = false\n\t\t\t\tfileInfo.uploadSuccess = true\n\t\t\t}\n\t\t}, 100)\n\t}\n}\n\n// 格式化文件大小\nconst formatFileSize = (bytes: number) => {\n\tif (bytes === 0) return '0 Bytes'\n\tconst k = 1024\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nconst resetFile = () => {\n\tfileInfos.value = []\n\tif (fileInput.value) {\n\t\tfileInput.value.value = ''\n\t}\n}\ndefineExpose({\n\tresetFile,\n\tuploadFile\n})\n</script>\n"],"names":["inject","ref","showToast","_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"UploadView.vue2.js","sources":["../../../../../../packages/components/touchchat/component/UploadView.vue"],"sourcesContent":["<template>\r\n\t<div class=\"upload-view\">\r\n\t\t<!-- <button class=\"upload-button\" @click=\"triggerFileInput\">点击选择文件</button> -->\r\n\t\t<div @click=\"triggerFileInput\">\r\n\t\t\t<slot></slot>\r\n\t\t</div>\r\n\t\t<input ref=\"fileInput\" type=\"file\" class=\"file-input\" style=\"display: none\" multiple @change=\"handleFileChange\" />\r\n\t</div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, inject } from 'vue'\r\nimport { showToast } from '../utils/tools'\r\nimport type { FileItem } from '../src/AiChat/Chat/types'\r\n\r\ntype UploadActionFn = (file: File, onProgress: (percent: number) => void) => Promise<any>\r\n\r\nconst uploadAction = inject<UploadActionFn | null>('uploadAction', null)\r\n\r\nconst props = defineProps<{\r\n\tfileList: FileItem[]\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n\t(e: 'upload-file', value: FileItem[]): void\r\n}>()\r\n\r\nconst fileInput = ref<HTMLInputElement | null>(null)\r\nconst fileInfos = ref<FileItem[]>(props.fileList || [])\r\nconst allowedTypes = inject<string[]>('allowedTypes', [])\r\n// ['doc', 'docx','word','png']\r\nconst types = ref<string[]>(allowedTypes || [])\r\n\r\n// 触发文件选择框\r\nconst triggerFileInput = () => {\r\n\tif (fileInput.value) {\r\n\t\tfileInput.value.click()\r\n\t}\r\n}\r\n\r\n// 处理文件选择\r\nconst handleFileChange = (event: Event) => {\r\n\tconst input = event.target as HTMLInputElement\r\n\tif (input.files && input.files.length > 0) {\r\n\t\tfor (let i = 0; i < input.files.length; i++) {\r\n\t\t\tconst file = input.files[i]\r\n\t\t\t// 检查是否已存在相同文件(同名同大小)\r\n\t\t\tconst exists = fileInfos.value.some(f => f.name === file.name && f.fileSize === formatFileSize(file.size))\r\n\t\t\tif (exists) {\r\n\t\t\t\tshowToast(`文件\"${file.name}\"已存在`, 'info', 3000)\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\t\t\t// 检查文件类型是否允许\r\n\t\t\tif (!isFileTypeAllowed(file) && types.value.length > 0) {\r\n\t\t\t\tshowToast(`文件类型${file.type}不允许上传,请上传${types.value.join('、')}类型文件`, 'info', 3000)\r\n\t\t\t\tcontinue // 跳过不允许的文件类型\r\n\t\t\t}\r\n\t\t\tif (file.type.startsWith('image/')) {\r\n\t\t\t\tconst reader = new FileReader()\r\n\t\t\t\treader.onload = e => {\r\n\t\t\t\t\tconst base64 = e.target?.result as string\r\n\t\t\t\t\tfileInfos.value.push({\r\n\t\t\t\t\t\tfile,\r\n\t\t\t\t\t\tisUploading: false,\r\n\t\t\t\t\t\tuploadProgress: 0,\r\n\t\t\t\t\t\tuploadSuccess: false,\r\n\t\t\t\t\t\tuploadError: false,\r\n\t\t\t\t\t\tfileSize: formatFileSize(file.size),\r\n\t\t\t\t\t\tfileType: file.type,\r\n\t\t\t\t\t\tid: file.lastModified.toString(),\r\n\t\t\t\t\t\tname: file.name,\r\n\t\t\t\t\t\tbase64, // 存储 Base64 数据\r\n\t\t\t\t\t\tlastModified: file.lastModified\r\n\t\t\t\t\t})\r\n\t\t\t\t\tuploadFile(fileInfos.value.length - 1)\r\n\t\t\t\t}\r\n\t\t\t\treader.readAsDataURL(file)\r\n\t\t\t} else {\r\n\t\t\t\tfileInfos.value.push({\r\n\t\t\t\t\tfile,\r\n\t\t\t\t\tisUploading: false,\r\n\t\t\t\t\tuploadProgress: 0,\r\n\t\t\t\t\tuploadSuccess: false,\r\n\t\t\t\t\tuploadError: false,\r\n\t\t\t\t\tfileSize: formatFileSize(file.size),\r\n\t\t\t\t\tfileType: file.type,\r\n\t\t\t\t\tid: file.lastModified.toString(),\r\n\t\t\t\t\tname: file.name,\r\n\t\t\t\t\tlastModified: file.lastModified\r\n\t\t\t\t})\r\n\t\t\t\tuploadFile(fileInfos.value.length - 1)\r\n\t\t\t}\r\n\t\t}\r\n\t\t// 清空 input value,允许重复选择同一文件\r\n\t\tif (fileInput.value) {\r\n\t\t\tfileInput.value.value = ''\r\n\t\t}\r\n\t}\r\n}\r\n// 检查文件类型是否允许\r\nconst isFileTypeAllowed = (file: File): boolean => {\r\n\tconst fileExtension = file.name.split('.').pop()?.toLowerCase()\r\n\treturn types.value.includes(fileExtension || '')\r\n}\r\n// 文件上传\r\nconst uploadFile = async (index: number, type?: string) => {\r\n\tconst fileInfo = fileInfos.value[index]\r\n\tif (!fileInfo || !fileInfo.file) return\r\n\r\n\tfileInfo.isUploading = true\r\n\tfileInfo.uploadSuccess = false\r\n\tfileInfo.uploadError = false\r\n\tfileInfo.uploadProgress = 0\r\n\tfileInfo.fileSize = formatFileSize(fileInfo.file.size)\r\n\tfileInfo.fileType = fileInfo.file.type\r\n\tfileInfo.id = fileInfo.file.lastModified.toString()\r\n\tfileInfo.name = fileInfo.file.name\r\n\r\n\tif (type) return\r\n\r\n\tif (uploadAction) {\r\n\t\t// 真实上传\r\n\t\tlet progressCalled = false\r\n\t\t// 保底进度:如果 onProgress 未被调用(如用 fetch),按时间递进补进度\r\n\t\tconst progressTimer = setInterval(() => {\r\n\t\t\tif (progressCalled) return\r\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress < 90) {\r\n\t\t\t\tfileInfo.uploadProgress += 10\r\n\t\t\t\temit('upload-file', fileInfos.value)\r\n\t\t\t}\r\n\t\t}, 100)\r\n\t\ttry {\r\n\t\t\tconst res = await uploadAction(fileInfo.file, percent => {\r\n\t\t\t\tprogressCalled = true\r\n\t\t\t\tfileInfo.uploadProgress = percent\r\n\t\t\t\temit('upload-file', fileInfos.value)\r\n\t\t\t})\r\n\t\t\tclearInterval(progressTimer)\r\n\t\t\tfileInfo.uploadSuccess = true\r\n\t\t\tfileInfo.uploadProgress = 100\r\n\t\t\tfileInfo.url = res?.url || res?.data?.url\r\n\t\t\tfileInfo.fileId = res?.id || res?.data?.id\r\n\t\t} catch {\r\n\t\t\tclearInterval(progressTimer)\r\n\t\t\tfileInfo.uploadError = true\r\n\t\t}\r\n\t\tfileInfo.isUploading = false\r\n\t\temit('upload-file', fileInfos.value)\r\n\t} else {\r\n\t\t// 无 uploadAction 时保持模拟上传(向后兼容)\r\n\t\tconst interval = setInterval(() => {\r\n\t\t\tif (fileInfo.uploadProgress !== undefined) {\r\n\t\t\t\tfileInfo.uploadProgress += 10\r\n\t\t\t}\r\n\t\t\temit('upload-file', fileInfos.value)\r\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress >= 100) {\r\n\t\t\t\tclearInterval(interval)\r\n\t\t\t\tfileInfo.isUploading = false\r\n\t\t\t\tfileInfo.uploadSuccess = true\r\n\t\t\t}\r\n\t\t}, 100)\r\n\t}\r\n}\r\n\r\n// 格式化文件大小\r\nconst formatFileSize = (bytes: number) => {\r\n\tif (bytes === 0) return '0 Bytes'\r\n\tconst k = 1024\r\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\r\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\r\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n}\r\n\r\nconst resetFile = () => {\r\n\tfileInfos.value = []\r\n\tif (fileInput.value) {\r\n\t\tfileInput.value.value = ''\r\n\t}\r\n}\r\ndefineExpose({\r\n\tresetFile,\r\n\tuploadFile\r\n})\r\n</script>\r\n"],"names":["inject","ref","showToast","_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot"],"mappings":"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"}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var VideoFile_vue_vue_type_script_setup_true_lang = require('./VideoFile.vue2.js');
6
6
  var _pluginVue_exportHelper = require('../../../../_virtual/_plugin-vue_export-helper.js');
7
7
 
8
- var VideoFile = /* @__PURE__ */ _pluginVue_exportHelper.default(VideoFile_vue_vue_type_script_setup_true_lang.default, [["__scopeId", "data-v-7305b796"], ["__file", "VideoFile.vue"]]);
8
+ var VideoFile = /* @__PURE__ */ _pluginVue_exportHelper.default(VideoFile_vue_vue_type_script_setup_true_lang.default, [["__scopeId", "data-v-1f6d2348"], ["__file", "VideoFile.vue"]]);
9
9
 
10
10
  exports.default = VideoFile;
11
11
  //# sourceMappingURL=VideoFile.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VideoFile.vue2.js","sources":["../../../../../../packages/components/touchchat/component/VideoFile.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'VideoFile' });\n</script>\n<template>\n\t<div class=\"video-File\">\n\t\t<video class=\"video-play\" controls :src=\"createMp4LocalUrl(props.item.file)\"></video>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\n\n\nconst props = defineProps<{\n\titem: {\n\t\tfile?: File\n\t\t[key: string]: any\n\t}\n\tindex: number\n}>()\nfunction createMp4LocalUrl(mp4File: any) {\n\tconsole.log('object', mp4File)\n\t// 生成本地临时URL\n\tif (!(mp4File instanceof File) && !(mp4File instanceof Blob)) {\n\t\treturn ''\n\t}\n\tconst localUrl = URL.createObjectURL(mp4File)\n\treturn localUrl\n}\n</script>\n<style scoped>\n.video-File {\n\twidth: 5em;\n\theight: auto;\n}\n.video-play {\n\twidth: 100%;\n}\n</style>\n"],"names":["DO_defineComponent","_createElementBlock","_createElementVNode"],"mappings":";;;;;;AAEA,MAAA,WAA6B,GAAAA,mBAAA,CAAmB,EAAE,IAAA,EAAM,aAAa,CAAA,CAAA;;;;;;;;AAWrE,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAOd,IAAA,SAAS,kBAAkB,OAAc,EAAA;AACxC,MAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,OAAO,CAAA,CAAA;AAE7B,MAAA,IAAI,EAAE,OAAA,YAAmB,IAAS,CAAA,IAAA,EAAE,mBAAmB,IAAO,CAAA,EAAA;AAC7D,QAAO,OAAA,EAAA,CAAA;AAAA,OACR;AACA,MAAM,MAAA,QAAA,GAAW,GAAI,CAAA,eAAA,CAAgB,OAAO,CAAA,CAAA;AAC5C,MAAO,OAAA,QAAA,CAAA;AAAA,KACR;;4BAvBC,EAAAC,sBAAA,CAEM,OAAA,EAFD,KAAA,EAAM,cAAY,EAAA;AAAA,QACtBC,uBAAqF,OAAA,EAAA;AAAA,UAA9E,KAAM,EAAA,YAAA;AAAA,UAAa,QAAA,EAAA,EAAA;AAAA,UAAU,GAAK,EAAA,iBAAA,CAAkB,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA;;;;;;;;"}
1
+ {"version":3,"file":"VideoFile.vue2.js","sources":["../../../../../../packages/components/touchchat/component/VideoFile.vue"],"sourcesContent":["<script lang=\"ts\">\nimport { defineComponent as DO_defineComponent } from 'vue';\nexport default /*#__PURE__*/ DO_defineComponent({ name: 'VideoFile' });\n</script>\n<template>\r\n\t<div class=\"video-File\">\r\n\t\t<video class=\"video-play\" controls :src=\"createMp4LocalUrl(props.item.file)\"></video>\r\n\t</div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n\r\n\r\nconst props = defineProps<{\r\n\titem: {\r\n\t\tfile?: File\r\n\t\t[key: string]: any\r\n\t}\r\n\tindex: number\r\n}>()\r\nfunction createMp4LocalUrl(mp4File: any) {\r\n\tconsole.log('object', mp4File)\r\n\t// 生成本地临时URL\r\n\tif (!(mp4File instanceof File) && !(mp4File instanceof Blob)) {\r\n\t\treturn ''\r\n\t}\r\n\tconst localUrl = URL.createObjectURL(mp4File)\r\n\treturn localUrl\r\n}\r\n</script>\r\n<style scoped>\r\n.video-File {\r\n\twidth: 5em;\r\n\theight: auto;\r\n}\r\n.video-play {\r\n\twidth: 100%;\r\n}\r\n</style>\r\n"],"names":["DO_defineComponent","_createElementBlock","_createElementVNode"],"mappings":";;;;;;AAEA,MAAA,WAA6B,GAAAA,mBAAA,CAAmB,EAAE,IAAA,EAAM,aAAa,CAAA,CAAA;;;;;;;;AAWrE,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAOd,IAAA,SAAS,kBAAkB,OAAc,EAAA;AACxC,MAAQ,OAAA,CAAA,GAAA,CAAI,UAAU,OAAO,CAAA,CAAA;AAE7B,MAAA,IAAI,EAAE,OAAA,YAAmB,IAAS,CAAA,IAAA,EAAE,mBAAmB,IAAO,CAAA,EAAA;AAC7D,QAAO,OAAA,EAAA,CAAA;AAAA,OACR;AACA,MAAM,MAAA,QAAA,GAAW,GAAI,CAAA,eAAA,CAAgB,OAAO,CAAA,CAAA;AAC5C,MAAO,OAAA,QAAA,CAAA;AAAA,KACR;;4BAvBC,EAAAC,sBAAA,CAEM,OAAA,EAFD,KAAA,EAAM,cAAY,EAAA;AAAA,QACtBC,uBAAqF,OAAA,EAAA;AAAA,UAA9E,KAAM,EAAA,YAAA;AAAA,UAAa,QAAA,EAAA,EAAA;AAAA,UAAU,GAAK,EAAA,iBAAA,CAAkB,KAAM,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA;;;;;;;;"}
@@ -7,7 +7,7 @@ var tools = require('../utils/tools.js');
7
7
 
8
8
  var _sfc_main = /* @__PURE__ */ vue.defineComponent({
9
9
  __name: "VoiceView",
10
- emits: ["upFileList"],
10
+ emits: ["complete"],
11
11
  setup(__props, { expose: __expose, emit: __emit }) {
12
12
  const emit = __emit;
13
13
  const fileList = vue.ref([]);
@@ -24,8 +24,9 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
24
24
  const i = Math.floor(Math.log(bytes) / Math.log(k));
25
25
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
26
26
  };
27
- const handleRecordingStop = () => {
27
+ const handleRecordingStop = async () => {
28
28
  const blob = new Blob(chunks, { type: "audio/mpeg" });
29
+ const duration = await getAudioDuration(blob);
29
30
  const audioFile = new File([blob], `recording_${Date.now()}.mp3`, { type: "audio/mpeg" });
30
31
  const fileItem = {
31
32
  file: audioFile,
@@ -36,17 +37,25 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
36
37
  fileSize: formatFileSize(audioFile.size),
37
38
  fileType: audioFile.type,
38
39
  name: audioFile.name,
39
- // id: crypto.randomUUID().replace(/-/gi, ''),
40
40
  id: Math.random().toString(36).slice(2).padEnd(10, "0").slice(0, 10),
41
41
  lastModified: Date.now()
42
42
  };
43
- emit("upFileList", [fileItem]);
43
+ emit("complete", [fileItem], blob, duration);
44
44
  if (mediaRecorder && mediaRecorder.stream) {
45
45
  mediaRecorder.stream.getTracks().forEach((track) => track.stop());
46
46
  }
47
47
  mediaRecorder = null;
48
48
  chunks = [];
49
49
  };
50
+ const getAudioDuration = (blob) => {
51
+ return new Promise((resolve) => {
52
+ const audio = new Audio();
53
+ audio.src = URL.createObjectURL(blob);
54
+ audio.onloadedmetadata = () => {
55
+ resolve(Number(audio.duration.toFixed(2)));
56
+ };
57
+ });
58
+ };
50
59
  const initMediaRecorder = async () => {
51
60
  try {
52
61
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceView.vue2.js","sources":["../../../../../../packages/components/touchchat/component/VoiceView.vue"],"sourcesContent":["<template>\n\t<div>\n\t\t<button class=\"touchchat-edit-record touchchat-edit-button\" @click=\"toggleRecording()\">\n\t\t\t<div v-if=\"!isRecording\" class=\"touchchat-edit-record-icon\"></div>\n\t\t\t<svg v-else xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n\t\t\t\t<path class=\"touchchat-voice-bar-1\" d=\"M10 2.57617V17.4247\" stroke=\"#0077FA\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-2\" d=\"M14.167 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-3\" d=\"M1.66699 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-4\" d=\"M18.333 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t\t<path class=\"touchchat-voice-bar-5\" d=\"M5.83301 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\n\t\t\t</svg>\n\t\t\t<div class=\"touchchat-edit-tooltip\">{{ isRecording ? '停止录音' : '录音' }}</div>\n\t\t</button>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { showToast } from '../utils/tools'\nimport type { FileItem } from '../src/AiChat/Chat/types'\n\nconst emit = defineEmits(['upFileList'])\n\n// 初始化响应式数据\nconst fileList = ref<FileItem[]>([])\nconst isRecording = ref(false)\nconst isMediaStreamError = ref(false)\nconst mediaStreamErrorMsg = ref('')\nlet mediaRecorder: MediaRecorder | null = null\nlet chunks: Blob[] = []\n\n// 格式化文件大小\nconst formatFileSize = (bytes: number): string => {\n\tif (bytes === 0) return '0 Bytes'\n\tconst k = 1024\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\n// 处理录制结束逻辑\nconst handleRecordingStop = () => {\n\tconst blob = new Blob(chunks, { type: 'audio/mpeg' })\n\tconst audioFile = new File([blob], `recording_${Date.now()}.mp3`, { type: 'audio/mpeg' })\n\tconst fileItem: FileItem = {\n\t\tfile: audioFile,\n\t\tisUploading: false,\n\t\tuploadProgress: 0,\n\t\tuploadSuccess: false,\n\t\tuploadError: false,\n\t\tfileSize: formatFileSize(audioFile.size),\n\t\tfileType: audioFile.type,\n\t\tname: audioFile.name,\n\t\t// id: crypto.randomUUID().replace(/-/gi, ''),\n\t\tid: Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\n\t\tlastModified: Date.now()\n\t}\n\temit('upFileList', [fileItem])\n\t// 停止并释放媒体流\n\tif (mediaRecorder && mediaRecorder.stream) {\n\t\tmediaRecorder.stream.getTracks().forEach(track => track.stop())\n\t}\n\tmediaRecorder = null\n\tchunks = []\n}\n\n// 初始化 MediaRecorder\nconst initMediaRecorder = async () => {\n\ttry {\n\t\tconst stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n\t\tmediaRecorder = new MediaRecorder(stream)\n\t\tchunks = []\n\n\t\tmediaRecorder.ondataavailable = event => {\n\t\t\tif (event.data.size > 0) {\n\t\t\t\tchunks.push(event.data)\n\t\t\t}\n\t\t}\n\n\t\tmediaRecorder.onstop = handleRecordingStop\n\t\treturn true\n\t} catch (error) {\n\t\tisMediaStreamError.value = true\n\t\tmediaStreamErrorMsg.value = error instanceof Error ? error.message : '获取麦克风权限失败'\n\t\tconsole.error('获取麦克风权限失败:', error)\n\t\tshowToast('获取麦克风权限失败', 'error')\n\t\treturn false\n\t}\n}\n\n// 切换录制状态\nconst toggleRecording = async (flag?: boolean) => {\n\tconst colserecord = () => {\n\t\tmediaRecorder?.stop()\n\t\tisRecording.value = false\n\t}\n\tif (flag) {\n\t\tcolserecord()\n\t\treturn\n\t}\n\tif (!isRecording.value) {\n\t\tconst initSuccess = await initMediaRecorder()\n\t\tif (initSuccess) {\n\t\t\tmediaRecorder?.start()\n\t\t\tisRecording.value = true\n\t\t\tisMediaStreamError.value = false\n\t\t\tmediaStreamErrorMsg.value = ''\n\t\t}\n\t} else {\n\t\tcolserecord()\n\t}\n}\n\nconst resetFile = () => {\n\tfileList.value = []\n}\ndefineExpose({\n\tresetFile,\n\ttoggleRecording\n})\n</script>\n"],"names":["ref","showToast","_createElementBlock","_createElementVNode"],"mappings":"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"}
1
+ {"version":3,"file":"VoiceView.vue2.js","sources":["../../../../../../packages/components/touchchat/component/VoiceView.vue"],"sourcesContent":["<template>\r\n\t<div>\r\n\t\t<button class=\"touchchat-edit-record touchchat-edit-button\" @click=\"toggleRecording()\">\r\n\t\t\t<div v-if=\"!isRecording\" class=\"touchchat-edit-record-icon\"></div>\r\n\t\t\t<svg v-else xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n\t\t\t\t<path class=\"touchchat-voice-bar-1\" d=\"M10 2.57617V17.4247\" stroke=\"#0077FA\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-2\" d=\"M14.167 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-3\" d=\"M1.66699 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-4\" d=\"M18.333 8.40869V11.5905\" stroke=\"#0077FA\" stroke-opacity=\"0.5\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t\t<path class=\"touchchat-voice-bar-5\" d=\"M5.83301 5.90869V14.0905\" stroke=\"#0077FA\" stroke-opacity=\"0.8\" stroke-width=\"1.2\" stroke-linecap=\"square\" />\r\n\t\t\t</svg>\r\n\t\t\t<div class=\"touchchat-edit-tooltip\">{{ isRecording ? '停止录音' : '录音' }}</div>\r\n\t\t</button>\r\n\t</div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from 'vue'\r\nimport { showToast } from '../utils/tools'\r\nimport type { FileItem } from '../src/AiChat/Chat/types'\r\n\r\nconst emit = defineEmits(['complete'])\r\n\r\n// 初始化响应式数据\r\nconst fileList = ref<FileItem[]>([])\r\nconst isRecording = ref(false)\r\nconst isMediaStreamError = ref(false)\r\nconst mediaStreamErrorMsg = ref('')\r\nlet mediaRecorder: MediaRecorder | null = null\r\nlet chunks: Blob[] = []\r\n\r\n// 格式化文件大小\r\nconst formatFileSize = (bytes: number): string => {\r\n\tif (bytes === 0) return '0 Bytes'\r\n\tconst k = 1024\r\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\r\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\r\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n}\r\n\r\n// 处理录制结束逻辑\r\nconst handleRecordingStop = async () => {\r\n\tconst blob = new Blob(chunks, { type: 'audio/mpeg' })\r\n\tconst duration = await getAudioDuration(blob)\r\n\tconst audioFile = new File([blob], `recording_${Date.now()}.mp3`, { type: 'audio/mpeg' })\r\n\t// const duration = Date.now() - recordingStartTime // 计算录音时长(毫秒)\r\n\tconst fileItem: FileItem = {\r\n\t\tfile: audioFile,\r\n\t\tisUploading: false,\r\n\t\tuploadProgress: 0,\r\n\t\tuploadSuccess: false,\r\n\t\tuploadError: false,\r\n\t\tfileSize: formatFileSize(audioFile.size),\r\n\t\tfileType: audioFile.type,\r\n\t\tname: audioFile.name,\r\n\t\tid: Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\r\n\t\tlastModified: Date.now()\r\n\t}\r\n\temit('complete', [fileItem], blob, duration)\r\n\t// 停止并释放媒体流\r\n\tif (mediaRecorder && mediaRecorder.stream) {\r\n\t\tmediaRecorder.stream.getTracks().forEach(track => track.stop())\r\n\t}\r\n\tmediaRecorder = null\r\n\tchunks = []\r\n}\r\n\r\n// 工具函数:获取音频时长\r\nconst getAudioDuration = (blob: Blob) => {\r\n\treturn new Promise(resolve => {\r\n\t\tconst audio = new Audio()\r\n\t\taudio.src = URL.createObjectURL(blob)\r\n\t\taudio.onloadedmetadata = () => {\r\n\t\t\tresolve(Number(audio.duration.toFixed(2))) // 返回 Number 类型的秒数\r\n\t\t}\r\n\t})\r\n}\r\n\r\n// 初始化 MediaRecorder\r\nconst initMediaRecorder = async () => {\r\n\ttry {\r\n\t\tconst stream = await navigator.mediaDevices.getUserMedia({ audio: true })\r\n\t\tmediaRecorder = new MediaRecorder(stream)\r\n\t\tchunks = []\r\n\r\n\t\tmediaRecorder.ondataavailable = event => {\r\n\t\t\tif (event.data.size > 0) {\r\n\t\t\t\tchunks.push(event.data)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tmediaRecorder.onstop = handleRecordingStop\r\n\t\treturn true\r\n\t} catch (error) {\r\n\t\tisMediaStreamError.value = true\r\n\t\tmediaStreamErrorMsg.value = error instanceof Error ? error.message : '获取麦克风权限失败'\r\n\t\tconsole.error('获取麦克风权限失败:', error)\r\n\t\tshowToast('获取麦克风权限失败', 'error')\r\n\t\treturn false\r\n\t}\r\n}\r\n\r\n// 切换录制状态\r\nconst toggleRecording = async (flag?: boolean) => {\r\n\tconst colserecord = () => {\r\n\t\tmediaRecorder?.stop()\r\n\t\tisRecording.value = false\r\n\t}\r\n\tif (flag) {\r\n\t\tcolserecord()\r\n\t\treturn\r\n\t}\r\n\tif (!isRecording.value) {\r\n\t\tconst initSuccess = await initMediaRecorder()\r\n\t\tif (initSuccess) {\r\n\t\t\tmediaRecorder?.start()\r\n\t\t\tisRecording.value = true\r\n\t\t\tisMediaStreamError.value = false\r\n\t\t\tmediaStreamErrorMsg.value = ''\r\n\t\t}\r\n\t} else {\r\n\t\tcolserecord()\r\n\t}\r\n}\r\n\r\nconst resetFile = () => {\r\n\tfileList.value = []\r\n}\r\ndefineExpose({\r\n\tresetFile,\r\n\ttoggleRecording\r\n})\r\n</script>\r\n"],"names":["ref","showToast","_createElementBlock","_createElementVNode"],"mappings":"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"}
@@ -35,7 +35,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
35
35
  vue.renderList(vue.unref(agents), (item) => {
36
36
  return vue.openBlock(), vue.createElementBlock("div", {
37
37
  key: item.name,
38
- class: vue.normalizeClass([item.id === _ctx.activeChat ? "is-on" : "", "touchchat-history-item"]),
38
+ class: vue.normalizeClass([item.id === __props.activeChat ? "is-on" : "", "touchchat-history-item"]),
39
39
  onClick: ($event) => handleSelectChat(item)
40
40
  }, [
41
41
  vue.createElementVNode(
@@ -1 +1 @@
1
- {"version":3,"file":"AgentsView.vue2.js","sources":["../../../../../../../packages/components/touchchat/src/AiChat/AgentsView.vue"],"sourcesContent":["<template>\n\t<div v-if=\"agents.length > 0\" class=\"touchchat-agents\">\n\t\t<div class=\"touchchat-history-title\">\n\t\t\t<div class=\"touchchat-history-title-icon\"></div>\n\t\t\t<div class=\"touchchat-history-title-text\">智能体</div>\n\t\t</div>\n\t\t<div class=\"touchchat-history-content\">\n\t\t\t<div v-for=\"item in agents\" :key=\"item.name\" :class=\"[item.id === activeChat ? 'is-on' : '', 'touchchat-history-item']\" @click=\"handleSelectChat(item)\">\n\t\t\t\t<div class=\"touchchat-history-item-text\" style=\"flex: 1\">\n\t\t\t\t\t{{ item.name || '新对话' }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n<script lang=\"ts\" setup>\nimport { inject } from 'vue'\ndefineProps<{\n\tactiveChat: string\n\t// chatHistory: HistoryItem[]\n}>()\ninterface Agent {\n\tid: string\n\tname: string\n\tintro: string\n}\nconst emit = defineEmits<{\n\t(e: 'select-chat', value: string): void // 添加inputValue更新事件\n}>()\ntype UpdateSharedData = (item: Agent) => void\nconst agents = inject<Agent[]>('agents', [])\n// 记录每个智能体是否已被点击过\n// const agentClickedMap = ref<Record<string, boolean>>({})\nconst updateSharedData = inject<UpdateSharedData>('updateSharedData', () => {})\nconst handleSelectChat = (item: Agent) => {\n\temit('select-chat', item.id)\n\tupdateSharedData(item)\n}\n</script>\n"],"names":["inject","_unref","_createElementBlock","_createElementVNode","_Fragment","_renderList","_normalizeClass","activeChat","_toDisplayString"],"mappings":";;;;;;;;;;;;;AA0BA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAIb,IAAA,MAAM,MAAS,GAAAA,UAAA,CAAgB,QAAU,EAAA,EAAE,CAAA,CAAA;AAG3C,IAAM,MAAA,gBAAA,GAAmBA,UAAyB,CAAA,kBAAA,EAAoB,MAAM;AAAA,KAAE,CAAA,CAAA;AAC9E,IAAM,MAAA,gBAAA,GAAmB,CAAC,IAAgB,KAAA;AACzC,MAAK,IAAA,CAAA,aAAA,EAAe,KAAK,EAAE,CAAA,CAAA;AAC3B,MAAA,gBAAA,CAAiB,IAAI,CAAA,CAAA;AAAA,KACtB,CAAA;;AApCY,MAAA,OAAAC,SAAA,CAAA,MAAA,CAAO,CAAA,MAAA,GAAM,sBAAxBC,uBAYM,KAAA,EAAA;AAAA;QAZwB,KAAM,EAAA,kBAAA;AAAA;QACnCC,sBAGM,CAAA,KAAA,EAAA,EAHD,KAAA,EAAM,2BAAyB,EAAA;AAAA,UACnCA,sBAAgD,CAAA,KAAA,EAAA,EAA3C,KAAA,EAAM,gCAA8B,CAAA;AAAA,UACzCA,uBAAmD,KAA9C,EAAA,EAAA,KAAM,EAAA,8BAAA,IAA+B,oBAAG,CAAA;AAAA;QAE9CA,sBAMM,CAAA,KAAA,EAAA,EAND,KAAA,EAAM,6BAA2B,EAAA;AAAA,8BACrC,EAAAD,sBAAA;AAAA,YAIME,YAAA;AAAA,YAAA,IAAA;AAAA,YAAAC,cAJc,CAAAJ,SAAA,CAAM,MAAA,CAAA,EAAA,CAAd,IAAI,KAAA;oCAAhB,EAAAC,sBAAA,CAIM,KAAA,EAAA;AAAA,gBAJuB,KAAK,IAAK,CAAA,IAAA;AAAA,gBAAO,KAAA,EAAQI,kBAAA,CAAA,CAAA,IAAK,CAAA,EAAA,KAAOC,KAAU,UAAA,GAAA,OAAA,GAAA,EAAA,EAAA,wBAAA,CAAA,CAAA;AAAA,gBAA6C,OAAK,EAAA,CAAA,MAAE,KAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA;gBACpJJ,sBAAA;AAAA,kBAEM,KAAA;AAAA,kBAAA;AAAA,oBAFD,KAAM,EAAA,6BAAA;AAAA,oBAA8B,KAAA,EAAA,EAAe,MAAA,EAAA,GAAA,EAAA;AAAA,mBACpD;AAAA,kBAAAK,mBAAA,CAAA,IAAK,CAAA,IAAA,IAAI,oBAAA,CAAA;AAAA,kBAAA,CAAA;AAAA;AAAA,iBAAA;AAAA;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"AgentsView.vue2.js","sources":["../../../../../../../packages/components/touchchat/src/AiChat/AgentsView.vue"],"sourcesContent":["<template>\r\n\t<div v-if=\"agents.length > 0\" class=\"touchchat-agents\">\r\n\t\t<div class=\"touchchat-history-title\">\r\n\t\t\t<div class=\"touchchat-history-title-icon\"></div>\r\n\t\t\t<div class=\"touchchat-history-title-text\">智能体</div>\r\n\t\t</div>\r\n\t\t<div class=\"touchchat-history-content\">\r\n\t\t\t<div v-for=\"item in agents\" :key=\"item.name\" :class=\"[item.id === activeChat ? 'is-on' : '', 'touchchat-history-item']\" @click=\"handleSelectChat(item)\">\r\n\t\t\t\t<div class=\"touchchat-history-item-text\" style=\"flex: 1\">\r\n\t\t\t\t\t{{ item.name || '新对话' }}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n<script lang=\"ts\" setup>\r\nimport { inject } from 'vue'\r\ndefineProps<{\r\n\tactiveChat: string\r\n\t// chatHistory: HistoryItem[]\r\n}>()\r\ninterface Agent {\r\n\tid: string\r\n\tname: string\r\n\tintro: string\r\n}\r\nconst emit = defineEmits<{\r\n\t(e: 'select-chat', value: string): void // 添加inputValue更新事件\r\n}>()\r\ntype UpdateSharedData = (item: Agent) => void\r\nconst agents = inject<Agent[]>('agents', [])\r\n// 记录每个智能体是否已被点击过\r\n// const agentClickedMap = ref<Record<string, boolean>>({})\r\nconst updateSharedData = inject<UpdateSharedData>('updateSharedData', () => {})\r\nconst handleSelectChat = (item: Agent) => {\r\n\temit('select-chat', item.id)\r\n\tupdateSharedData(item)\r\n}\r\n</script>\r\n"],"names":["inject","_unref","_createElementBlock","_createElementVNode","_Fragment","_renderList","_normalizeClass","_toDisplayString"],"mappings":";;;;;;;;;;;;;AA0BA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAIb,IAAA,MAAM,MAAS,GAAAA,UAAA,CAAgB,QAAU,EAAA,EAAE,CAAA,CAAA;AAG3C,IAAM,MAAA,gBAAA,GAAmBA,UAAyB,CAAA,kBAAA,EAAoB,MAAM;AAAA,KAAE,CAAA,CAAA;AAC9E,IAAM,MAAA,gBAAA,GAAmB,CAAC,IAAgB,KAAA;AACzC,MAAK,IAAA,CAAA,aAAA,EAAe,KAAK,EAAE,CAAA,CAAA;AAC3B,MAAA,gBAAA,CAAiB,IAAI,CAAA,CAAA;AAAA,KACtB,CAAA;;AApCY,MAAA,OAAAC,SAAA,CAAA,MAAA,CAAO,CAAA,MAAA,GAAM,sBAAxBC,uBAYM,KAAA,EAAA;AAAA;QAZwB,KAAM,EAAA,kBAAA;AAAA;QACnCC,sBAGM,CAAA,KAAA,EAAA,EAHD,KAAA,EAAM,2BAAyB,EAAA;AAAA,UACnCA,sBAAgD,CAAA,KAAA,EAAA,EAA3C,KAAA,EAAM,gCAA8B,CAAA;AAAA,UACzCA,uBAAmD,KAA9C,EAAA,EAAA,KAAM,EAAA,8BAAA,IAA+B,oBAAG,CAAA;AAAA;QAE9CA,sBAMM,CAAA,KAAA,EAAA,EAND,KAAA,EAAM,6BAA2B,EAAA;AAAA,8BACrC,EAAAD,sBAAA;AAAA,YAIME,YAAA;AAAA,YAAA,IAAA;AAAA,YAAAC,cAJc,CAAAJ,SAAA,CAAM,MAAA,CAAA,EAAA,CAAd,IAAI,KAAA;oCAAhB,EAAAC,sBAAA,CAIM,KAAA,EAAA;AAAA,gBAJuB,KAAK,IAAK,CAAA,IAAA;AAAA,gBAAO,KAAA,EAAQI,kBAAA,CAAA,CAAA,IAAK,CAAA,EAAA,KAAO,QAAU,UAAA,GAAA,OAAA,GAAA,EAAA,EAAA,wBAAA,CAAA,CAAA;AAAA,gBAA6C,OAAK,EAAA,CAAA,MAAE,KAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA;gBACpJH,sBAAA;AAAA,kBAEM,KAAA;AAAA,kBAAA;AAAA,oBAFD,KAAM,EAAA,6BAAA;AAAA,oBAA8B,KAAA,EAAA,EAAe,MAAA,EAAA,GAAA,EAAA;AAAA,mBACpD;AAAA,kBAAAI,mBAAA,CAAA,IAAK,CAAA,IAAA,IAAI,oBAAA,CAAA;AAAA,kBAAA,CAAA;AAAA;AAAA,iBAAA;AAAA;;;;;;;;;;;;;"}