@touchvue/chat 1.0.0-beta.54 → 1.0.0-beta.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -70
- package/es/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.4.3}/node_modules/dompurify/dist/purify.es.mjs +299 -143
- package/es/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.mjs.map +1 -0
- package/es/package.json.css +1 -1
- package/es/package.json.mjs +1 -1
- package/es/packages/components/resolver.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +9 -9
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AudioFile.vue.mjs +7 -0
- package/es/packages/components/touchchat/component/AudioFile.vue.mjs.map +1 -0
- package/es/packages/components/touchchat/component/AudioFile.vue2.mjs +111 -0
- package/es/packages/components/touchchat/component/AudioFile.vue2.mjs.map +1 -0
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +56 -5
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +10 -10
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs +52 -10
- package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/VideoFile.vue.mjs +1 -1
- package/es/packages/components/touchchat/component/VideoFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +13 -4
- package/es/packages/components/touchchat/component/VoiceView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +30 -30
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +10 -44
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +16 -9
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +26 -13
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/MessageViewed.vue.mjs +33 -0
- package/es/packages/components/touchchat/src/AiChat/MessageViewed.vue.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +55 -13
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +36 -0
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +127 -75
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +6 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/a2aService.mjs +58 -15
- package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/markdown.mjs +22 -5
- package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/tools.mjs +4 -4
- package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
- package/lib/node_modules/.pnpm/{dompurify@3.3.0 → dompurify@3.4.3}/node_modules/dompurify/dist/purify.es.js +299 -143
- package/lib/node_modules/.pnpm/dompurify@3.4.3/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/lib/package.json.css +1 -1
- package/lib/package.json.js +1 -1
- package/lib/packages/components/resolver.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +9 -9
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AudioFile.vue.js +11 -0
- package/lib/packages/components/touchchat/component/AudioFile.vue.js.map +1 -0
- package/lib/packages/components/touchchat/component/AudioFile.vue2.js +115 -0
- package/lib/packages/components/touchchat/component/AudioFile.vue2.js.map +1 -0
- package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
- package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
- package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +55 -4
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js +10 -10
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/QuoteContent.vue2.js +51 -9
- package/lib/packages/components/touchchat/component/QuoteContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/UploadView.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/VideoFile.vue.js +1 -1
- package/lib/packages/components/touchchat/component/VideoFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/VoiceView.vue2.js +13 -4
- package/lib/packages/components/touchchat/component/VoiceView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +30 -30
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +10 -44
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +16 -9
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +25 -12
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/MessageViewed.vue.js +37 -0
- package/lib/packages/components/touchchat/src/AiChat/MessageViewed.vue.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +55 -13
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +36 -0
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +126 -74
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +6 -1
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/utils/a2aService.js +58 -15
- package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
- package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
- package/lib/packages/components/touchchat/utils/markdown.js +22 -5
- package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
- package/lib/packages/components/touchchat/utils/tools.js +4 -4
- package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
- package/package.json +1 -1
- package/theme/components/index.css +152 -3
- package/theme/font/iconfont.woff +0 -0
- package/theme/font/iconfont.woff2 +0 -0
- package/theme/index.css +152 -3
- package/theme/skin/default.css +152 -3
- package/es/node_modules/.pnpm/dompurify@3.3.0/node_modules/dompurify/dist/purify.es.mjs.map +0 -1
- 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.mjs","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":["_createElementBlock","_createElementVNode","_normalizeClass","_Fragment","_renderList","
|
|
1
|
+
{"version":3,"file":"ModuleSelect.vue2.mjs","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":["_createElementBlock","_createElementVNode","_normalizeClass","_Fragment","_renderList","_toDisplayString"],"mappings":"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"}
|
|
@@ -103,7 +103,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
103
103
|
createElementVNode(
|
|
104
104
|
"div",
|
|
105
105
|
{
|
|
106
|
-
class: normalizeClass(["pdf-file",
|
|
106
|
+
class: normalizeClass(["pdf-file", __props.item.uploadError ? "pdf-error" : "pdf-success"]),
|
|
107
107
|
onClick: fileClick
|
|
108
108
|
},
|
|
109
109
|
[
|
|
@@ -127,12 +127,12 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
127
127
|
class: "pdf-file-title",
|
|
128
128
|
onMouseenter: handleMouseEnter,
|
|
129
129
|
onMouseleave: ($event) => showTooltip.value = false
|
|
130
|
-
}, toDisplayString(
|
|
131
|
-
|
|
130
|
+
}, toDisplayString(__props.item.name), 41, ["onMouseleave"]),
|
|
131
|
+
__props.item.uploadError ? (openBlock(), createElementBlock("p", {
|
|
132
132
|
key: 0,
|
|
133
133
|
class: "pdf-file-info"
|
|
134
134
|
}, "\u9519\u8BEF")) : createCommentVNode("v-if", true),
|
|
135
|
-
progress.value !== 100 && !
|
|
135
|
+
progress.value !== 100 && !__props.item.uploadError ? (openBlock(), createElementBlock(
|
|
136
136
|
"p",
|
|
137
137
|
{
|
|
138
138
|
key: 1,
|
|
@@ -142,18 +142,18 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
142
142
|
1
|
|
143
143
|
/* TEXT */
|
|
144
144
|
)) : createCommentVNode("v-if", true),
|
|
145
|
-
progress.value === 100 && !
|
|
145
|
+
progress.value === 100 && !__props.item.uploadError ? (openBlock(), createElementBlock(
|
|
146
146
|
"p",
|
|
147
147
|
{
|
|
148
148
|
key: 2,
|
|
149
149
|
class: "pdf-file-info"
|
|
150
150
|
},
|
|
151
|
-
toDisplayString(
|
|
151
|
+
toDisplayString(__props.item.fileSize),
|
|
152
152
|
1
|
|
153
153
|
/* TEXT */
|
|
154
154
|
)) : createCommentVNode("v-if", true),
|
|
155
|
-
createCommentVNode(` <p v-if="showTooltip" ref="tooltipElement" class="pdf-file-tooltip" :style="{ top: tooltipTop + 'px' }"
|
|
156
|
-
{{ item.name }}
|
|
155
|
+
createCommentVNode(` <p v-if="showTooltip" ref="tooltipElement" class="pdf-file-tooltip" :style="{ top: tooltipTop + 'px' }">\r
|
|
156
|
+
{{ item.name }}\r
|
|
157
157
|
</p> `)
|
|
158
158
|
],
|
|
159
159
|
512
|
|
@@ -178,7 +178,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
178
178
|
)) : createCommentVNode("v-if", true),
|
|
179
179
|
withDirectives(createElementVNode("div", {
|
|
180
180
|
class: "pdf-file-colse",
|
|
181
|
-
onClick: ($event) => emits("colse",
|
|
181
|
+
onClick: ($event) => emits("colse", __props.item.id)
|
|
182
182
|
}, [
|
|
183
183
|
(openBlock(), createElementBlock("svg", {
|
|
184
184
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -193,7 +193,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
193
193
|
})
|
|
194
194
|
]))
|
|
195
195
|
], 8, ["onClick"]), [
|
|
196
|
-
[vShow,
|
|
196
|
+
[vShow, __props.hasColse]
|
|
197
197
|
])
|
|
198
198
|
],
|
|
199
199
|
2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PDFFile.vue2.mjs","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":["_createCommentVNode","_createElementVNode","_normalizeClass","
|
|
1
|
+
{"version":3,"file":"PDFFile.vue2.mjs","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":["_createCommentVNode","_createElementVNode","_normalizeClass","_toDisplayString","_createElementBlock"],"mappings":"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"}
|
|
@@ -1,14 +1,52 @@
|
|
|
1
|
-
import { defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, createCommentVNode } from 'vue';
|
|
1
|
+
import { defineComponent, inject, computed, openBlock, createElementBlock, createElementVNode, toDisplayString, createCommentVNode } from 'vue';
|
|
2
2
|
|
|
3
3
|
var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
4
4
|
__name: "QuoteContent",
|
|
5
|
-
props:
|
|
5
|
+
props: {
|
|
6
|
+
quoteObj: {},
|
|
7
|
+
isClose: { type: Boolean, default: false }
|
|
8
|
+
},
|
|
6
9
|
emits: ["close"],
|
|
7
10
|
setup(__props, { emit: __emit }) {
|
|
8
11
|
const props = __props;
|
|
9
12
|
const emits = __emit;
|
|
13
|
+
const scrollToMessage = inject("scrollToMessage", () => {
|
|
14
|
+
console.warn("scrollToMessage \u672A\u63D0\u4F9B");
|
|
15
|
+
});
|
|
16
|
+
const getQuoteContent = computed(() => {
|
|
17
|
+
let content = "";
|
|
18
|
+
if (props.quoteObj.msgList && props.quoteObj.msgList.length) {
|
|
19
|
+
props.quoteObj.msgList.forEach((msg) => {
|
|
20
|
+
if (msg.type === "text" || msg.type === "markdown") {
|
|
21
|
+
content += msg.content;
|
|
22
|
+
} else if (msg.type === "a2ui" || msg.type === "component" && msg.displayMode === "inline") {
|
|
23
|
+
content += "[\u7EC4\u4EF6]";
|
|
24
|
+
} else if (msg.type === "image") {
|
|
25
|
+
content += "[\u56FE\u7247]";
|
|
26
|
+
} else if (msg.type === "file") {
|
|
27
|
+
content += "[\u6587\u4EF6]";
|
|
28
|
+
} else if (msg.type === "voice") {
|
|
29
|
+
content += "[\u8BED\u97F3]";
|
|
30
|
+
} else if (msg.type === "video") {
|
|
31
|
+
content += "[\u89C6\u9891]";
|
|
32
|
+
} else if (msg.type === "link") {
|
|
33
|
+
content += "[\u94FE\u63A5]";
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
} else {
|
|
37
|
+
if (props.quoteObj.content) {
|
|
38
|
+
content = props.quoteObj.content;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return content;
|
|
42
|
+
});
|
|
43
|
+
const handleGoChat = () => {
|
|
44
|
+
var _a;
|
|
45
|
+
if ((_a = props.quoteObj) == null ? void 0 : _a.chatId) {
|
|
46
|
+
scrollToMessage(props.quoteObj.chatId);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
10
49
|
return (_ctx, _cache) => {
|
|
11
|
-
var _a, _b, _c, _d, _e, _f;
|
|
12
50
|
return openBlock(), createElementBlock("div", { class: "quote-content" }, [
|
|
13
51
|
createElementVNode("div", { class: "quote-content-text" }, [
|
|
14
52
|
createElementVNode(
|
|
@@ -18,19 +56,23 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
18
56
|
1
|
|
19
57
|
/* TEXT */
|
|
20
58
|
),
|
|
21
|
-
(
|
|
59
|
+
createElementVNode(
|
|
22
60
|
"span",
|
|
23
|
-
|
|
24
|
-
toDisplayString(
|
|
61
|
+
null,
|
|
62
|
+
toDisplayString(getQuoteContent.value),
|
|
25
63
|
1
|
|
26
64
|
/* TEXT */
|
|
27
|
-
)
|
|
28
|
-
(
|
|
65
|
+
),
|
|
66
|
+
createElementVNode("div", {
|
|
67
|
+
class: "touchchat-action-item value-right-arrow",
|
|
68
|
+
onClick: handleGoChat
|
|
69
|
+
})
|
|
29
70
|
]),
|
|
30
|
-
|
|
71
|
+
props.isClose ? (openBlock(), createElementBlock("div", {
|
|
72
|
+
key: 0,
|
|
31
73
|
class: "touchchat-action-item value-close-fill",
|
|
32
74
|
onClick: ($event) => emits("close")
|
|
33
|
-
}, null, 8, ["onClick"])
|
|
75
|
+
}, null, 8, ["onClick"])) : createCommentVNode("v-if", true)
|
|
34
76
|
]);
|
|
35
77
|
};
|
|
36
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuoteContent.vue2.mjs","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
|
|
1
|
+
{"version":3,"file":"QuoteContent.vue2.mjs","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":["_createElementBlock","_createElementVNode"],"mappings":"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"}
|
|
@@ -150,7 +150,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
150
150
|
])
|
|
151
151
|
])) : createCommentVNode("v-if", true),
|
|
152
152
|
createCommentVNode(" \u663E\u793A\u8BED\u97F3\u8F6C\u6587\u5B57\u7684\u7ED3\u679C "),
|
|
153
|
-
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> ')
|
|
153
|
+
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> ')
|
|
154
154
|
]);
|
|
155
155
|
};
|
|
156
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RealtimeVoice.vue2.mjs","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":["_createElementBlock","_createElementVNode","_createCommentVNode","_Fragment"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"RealtimeVoice.vue2.mjs","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":["_createElementBlock","_createElementVNode","_createCommentVNode","_Fragment"],"mappings":"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"}
|
|
@@ -27,11 +27,11 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
27
27
|
const file = input.files[i];
|
|
28
28
|
const exists = fileInfos.value.some((f) => f.name === file.name && f.fileSize === formatFileSize(file.size));
|
|
29
29
|
if (exists) {
|
|
30
|
-
showToast(`\u6587\u4EF6"${file.name}"\u5DF2\u5B58\u5728`, "
|
|
30
|
+
showToast(`\u6587\u4EF6"${file.name}"\u5DF2\u5B58\u5728`, "warning", 3e3);
|
|
31
31
|
continue;
|
|
32
32
|
}
|
|
33
33
|
if (!isFileTypeAllowed(file) && types.value.length > 0) {
|
|
34
|
-
showToast(`\u6587\u4EF6\u7C7B\u578B${file.type}\u4E0D\u5141\u8BB8\u4E0A\u4F20\uFF0C\u8BF7\u4E0A\u4F20${types.value.join("\u3001")}\u7C7B\u578B\u6587\u4EF6`, "
|
|
34
|
+
showToast(`\u6587\u4EF6\u7C7B\u578B${file.type}\u4E0D\u5141\u8BB8\u4E0A\u4F20\uFF0C\u8BF7\u4E0A\u4F20${types.value.join("\u3001")}\u7C7B\u578B\u6587\u4EF6`, "warning", 3e3);
|
|
35
35
|
continue;
|
|
36
36
|
}
|
|
37
37
|
if (file.type.startsWith("image/")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadView.vue2.mjs","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":["_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UploadView.vue2.mjs","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}\"已存在`, 'warning', 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('、')}类型文件`, 'warning', 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":["_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _sfc_main from './VideoFile.vue2.mjs';
|
|
2
2
|
import _export_sfc from '../../../../_virtual/_plugin-vue_export-helper.mjs';
|
|
3
3
|
|
|
4
|
-
var VideoFile = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
4
|
+
var VideoFile = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1f6d2348"], ["__file", "VideoFile.vue"]]);
|
|
5
5
|
|
|
6
6
|
export { VideoFile as default };
|
|
7
7
|
//# sourceMappingURL=VideoFile.vue.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoFile.vue2.mjs","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,eAAA,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;;wBAvBC,EAAAC,kBAAA,CAEM,OAAA,EAFD,KAAA,EAAM,cAAY,EAAA;AAAA,QACtBC,mBAAqF,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.mjs","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,eAAA,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;;wBAvBC,EAAAC,kBAAA,CAEM,OAAA,EAFD,KAAA,EAAM,cAAY,EAAA;AAAA,QACtBC,mBAAqF,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;;;;;;;;"}
|
|
@@ -3,7 +3,7 @@ import { showToast } from '../utils/tools.mjs';
|
|
|
3
3
|
|
|
4
4
|
var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
5
5
|
__name: "VoiceView",
|
|
6
|
-
emits: ["
|
|
6
|
+
emits: ["complete"],
|
|
7
7
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
8
8
|
const emit = __emit;
|
|
9
9
|
const fileList = ref([]);
|
|
@@ -20,8 +20,9 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
20
20
|
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
21
21
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
|
|
22
22
|
};
|
|
23
|
-
const handleRecordingStop = () => {
|
|
23
|
+
const handleRecordingStop = async () => {
|
|
24
24
|
const blob = new Blob(chunks, { type: "audio/mpeg" });
|
|
25
|
+
const duration = await getAudioDuration(blob);
|
|
25
26
|
const audioFile = new File([blob], `recording_${Date.now()}.mp3`, { type: "audio/mpeg" });
|
|
26
27
|
const fileItem = {
|
|
27
28
|
file: audioFile,
|
|
@@ -32,17 +33,25 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
32
33
|
fileSize: formatFileSize(audioFile.size),
|
|
33
34
|
fileType: audioFile.type,
|
|
34
35
|
name: audioFile.name,
|
|
35
|
-
// id: crypto.randomUUID().replace(/-/gi, ''),
|
|
36
36
|
id: Math.random().toString(36).slice(2).padEnd(10, "0").slice(0, 10),
|
|
37
37
|
lastModified: Date.now()
|
|
38
38
|
};
|
|
39
|
-
emit("
|
|
39
|
+
emit("complete", [fileItem], blob, duration);
|
|
40
40
|
if (mediaRecorder && mediaRecorder.stream) {
|
|
41
41
|
mediaRecorder.stream.getTracks().forEach((track) => track.stop());
|
|
42
42
|
}
|
|
43
43
|
mediaRecorder = null;
|
|
44
44
|
chunks = [];
|
|
45
45
|
};
|
|
46
|
+
const getAudioDuration = (blob) => {
|
|
47
|
+
return new Promise((resolve) => {
|
|
48
|
+
const audio = new Audio();
|
|
49
|
+
audio.src = URL.createObjectURL(blob);
|
|
50
|
+
audio.onloadedmetadata = () => {
|
|
51
|
+
resolve(Number(audio.duration.toFixed(2)));
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
};
|
|
46
55
|
const initMediaRecorder = async () => {
|
|
47
56
|
try {
|
|
48
57
|
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceView.vue2.mjs","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":["_createElementBlock","_createElementVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VoiceView.vue2.mjs","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":["_createElementBlock","_createElementVNode"],"mappings":"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"}
|
|
@@ -31,7 +31,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
31
31
|
renderList(unref(agents), (item) => {
|
|
32
32
|
return openBlock(), createElementBlock("div", {
|
|
33
33
|
key: item.name,
|
|
34
|
-
class: normalizeClass([item.id ===
|
|
34
|
+
class: normalizeClass([item.id === __props.activeChat ? "is-on" : "", "touchchat-history-item"]),
|
|
35
35
|
onClick: ($event) => handleSelectChat(item)
|
|
36
36
|
}, [
|
|
37
37
|
createElementVNode(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentsView.vue2.mjs","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":["_unref","_createElementBlock","_createElementVNode","_Fragment","_renderList","_normalizeClass","
|
|
1
|
+
{"version":3,"file":"AgentsView.vue2.mjs","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":["_unref","_createElementBlock","_createElementVNode","_Fragment","_renderList","_normalizeClass","_toDisplayString"],"mappings":";;;;;;;;;AA0BA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAIb,IAAA,MAAM,MAAS,GAAA,MAAA,CAAgB,QAAU,EAAA,EAAE,CAAA,CAAA;AAG3C,IAAM,MAAA,gBAAA,GAAmB,MAAyB,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,OAAAA,KAAA,CAAA,MAAA,CAAO,CAAA,MAAA,GAAM,kBAAxBC,mBAYM,KAAA,EAAA;AAAA;QAZwB,KAAM,EAAA,kBAAA;AAAA;QACnCC,kBAGM,CAAA,KAAA,EAAA,EAHD,KAAA,EAAM,2BAAyB,EAAA;AAAA,UACnCA,kBAAgD,CAAA,KAAA,EAAA,EAA3C,KAAA,EAAM,gCAA8B,CAAA;AAAA,UACzCA,mBAAmD,KAA9C,EAAA,EAAA,KAAM,EAAA,8BAAA,IAA+B,oBAAG,CAAA;AAAA;QAE9CA,kBAMM,CAAA,KAAA,EAAA,EAND,KAAA,EAAM,6BAA2B,EAAA;AAAA,0BACrC,EAAAD,kBAAA;AAAA,YAIME,QAAA;AAAA,YAAA,IAAA;AAAA,YAAAC,UAJc,CAAAJ,KAAA,CAAM,MAAA,CAAA,EAAA,CAAd,IAAI,KAAA;gCAAhB,EAAAC,kBAAA,CAIM,KAAA,EAAA;AAAA,gBAJuB,KAAK,IAAK,CAAA,IAAA;AAAA,gBAAO,KAAA,EAAQI,cAAA,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,kBAAA;AAAA,kBAEM,KAAA;AAAA,kBAAA;AAAA,oBAFD,KAAM,EAAA,6BAAA;AAAA,oBAA8B,KAAA,EAAA,EAAe,MAAA,EAAA,GAAA,EAAA;AAAA,mBACpD;AAAA,kBAAAI,eAAA,CAAA,IAAK,CAAA,IAAA,IAAI,oBAAA,CAAA;AAAA,kBAAA,CAAA;AAAA;AAAA,iBAAA;AAAA;;;;;;;;;;;;;"}
|