@touchvue/chat 1.0.0-beta.40 → 1.0.0-beta.42
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/es/package.json.css +1 -1
- package/es/package.json.mjs +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 +15 -3
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
- 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 +2 -2
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +8 -8
- package/es/packages/components/touchchat/component/PDFFile.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/Screenshot.vue2.mjs +11 -2
- package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs +10 -7
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +1 -1
- 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 +22 -22
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs +145 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs +18 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +672 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs +55 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +155 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +352 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs +74 -0
- package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -0
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +8 -7
- 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/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 +51 -56
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +179 -1332
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs +18 -9
- package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +14 -14
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +15 -29
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/a2aService.mjs +3 -2
- package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/fetchStream.mjs +2 -1
- package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/markdown.mjs +30 -12
- package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
- package/lib/package.json.css +1 -1
- package/lib/package.json.js +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 +15 -3
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
- 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 +2 -2
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js +8 -8
- package/lib/packages/components/touchchat/component/PDFFile.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/Screenshot.vue2.js +11 -2
- package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/UploadView.vue2.js +10 -7
- package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/VoiceView.vue2.js +1 -1
- 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 +22 -22
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js +147 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js +21 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +674 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js +57 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +157 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +354 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js +76 -0
- package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -0
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +8 -7
- 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/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 +66 -71
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +179 -1332
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js +18 -9
- package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +14 -14
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +15 -29
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/utils/a2aService.js +3 -2
- package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
- package/lib/packages/components/touchchat/utils/fetchStream.js +2 -1
- package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
- package/lib/packages/components/touchchat/utils/markdown.js +30 -12
- package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
- package/package.json +1 -1
|
@@ -100,10 +100,10 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
100
100
|
(vue.openBlock(true), vue.createElementBlock(
|
|
101
101
|
vue.Fragment,
|
|
102
102
|
null,
|
|
103
|
-
vue.renderList(
|
|
103
|
+
vue.renderList(_ctx.modules, (item) => {
|
|
104
104
|
return vue.openBlock(), vue.createElementBlock("div", {
|
|
105
105
|
key: item.name,
|
|
106
|
-
class: vue.normalizeClass(["touchchat-select-option", { "is-selected": item.name ===
|
|
106
|
+
class: vue.normalizeClass(["touchchat-select-option", { "is-selected": item.name === _ctx.modelValue }]),
|
|
107
107
|
onClick: ($event) => selectOption(item)
|
|
108
108
|
}, vue.toDisplayString(item.name), 11, ["onClick"]);
|
|
109
109
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModuleSelect.vue2.js","sources":["../../../../../../packages/components/touchchat/component/ModuleSelect.vue"],"sourcesContent":["<template>\
|
|
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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"}
|
|
@@ -102,7 +102,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
102
102
|
vue.createElementVNode(
|
|
103
103
|
"div",
|
|
104
104
|
{
|
|
105
|
-
class: vue.normalizeClass(["pdf-file",
|
|
105
|
+
class: vue.normalizeClass(["pdf-file", _ctx.item.uploadError ? "pdf-error" : "pdf-success"])
|
|
106
106
|
},
|
|
107
107
|
[
|
|
108
108
|
vue.createCommentVNode(" <span>{{imgType}}</span> "),
|
|
@@ -125,12 +125,12 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
125
125
|
class: "pdf-file-title",
|
|
126
126
|
onMouseenter: handleMouseEnter,
|
|
127
127
|
onMouseleave: ($event) => showTooltip.value = false
|
|
128
|
-
}, vue.toDisplayString(
|
|
129
|
-
|
|
128
|
+
}, vue.toDisplayString(_ctx.item.name), 41, ["onMouseleave"]),
|
|
129
|
+
_ctx.item.uploadError ? (vue.openBlock(), vue.createElementBlock("p", {
|
|
130
130
|
key: 0,
|
|
131
131
|
class: "pdf-file-info"
|
|
132
132
|
}, "\u9519\u8BEF")) : vue.createCommentVNode("v-if", true),
|
|
133
|
-
progress.value !== 100 && !
|
|
133
|
+
progress.value !== 100 && !_ctx.item.uploadError ? (vue.openBlock(), vue.createElementBlock(
|
|
134
134
|
"p",
|
|
135
135
|
{
|
|
136
136
|
key: 1,
|
|
@@ -140,13 +140,13 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
140
140
|
1
|
|
141
141
|
/* TEXT */
|
|
142
142
|
)) : vue.createCommentVNode("v-if", true),
|
|
143
|
-
progress.value === 100 && !
|
|
143
|
+
progress.value === 100 && !_ctx.item.uploadError ? (vue.openBlock(), vue.createElementBlock(
|
|
144
144
|
"p",
|
|
145
145
|
{
|
|
146
146
|
key: 2,
|
|
147
147
|
class: "pdf-file-info"
|
|
148
148
|
},
|
|
149
|
-
vue.toDisplayString(
|
|
149
|
+
vue.toDisplayString(_ctx.item.fileSize),
|
|
150
150
|
1
|
|
151
151
|
/* TEXT */
|
|
152
152
|
)) : vue.createCommentVNode("v-if", true),
|
|
@@ -176,7 +176,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
176
176
|
)) : vue.createCommentVNode("v-if", true),
|
|
177
177
|
vue.withDirectives(vue.createElementVNode("div", {
|
|
178
178
|
class: "pdf-file-colse",
|
|
179
|
-
onClick: ($event) => emits("colse",
|
|
179
|
+
onClick: ($event) => emits("colse", _ctx.item.id)
|
|
180
180
|
}, [
|
|
181
181
|
(vue.openBlock(), vue.createElementBlock("svg", {
|
|
182
182
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -191,7 +191,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
191
191
|
})
|
|
192
192
|
]))
|
|
193
193
|
], 8, ["onClick"]), [
|
|
194
|
-
[vue.vShow,
|
|
194
|
+
[vue.vShow, _ctx.hasColse]
|
|
195
195
|
])
|
|
196
196
|
],
|
|
197
197
|
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'\">\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,
|
|
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'\">\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})\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,IAAA,MAAM,WAAuC,GAAA;AAAA,MAC5C,GAAK,EAAAA,WAAA;AAAA,MACL,IAAM,EAAAC,YAAA;AAAA,MACN,IAAM,EAAAC,YAAA;AAAA,MACN,GAAK,EAAAC,WAAA;AAAA,MACL,GAAK,EAAAC,WAAA;AAAA,MACL,GAAK,EAAAC,WAAA;AAAA,MACL,KAAO,EAAAC,aAAA;AAAA,MACP,GAAK,EAAAC,WAAA;AAAA,MACL,GAAK,EAAAC,WAAA;AAAA,MACL,GAAK,EAAAC,WAAA;AAAA,MACL,GAAK,EAAAC,WAAA;AAAA,MACL,GAAK,EAAAC,WAAA;AAAA,MACL,GAAK,EAAAC,WAAA;AAAA,MACL,IAAM,EAAAC,YAAA;AAAA,MACN,IAAM,EAAAC,YAAA;AAAA,MACN,EAAI,EAAA,EAAA;AAAA,KACL,CAAA;AACA,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAMd,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAA;AAEd,IAAM,MAAA,WAAA,GAAcC,QAAI,KAAK,CAAA,CAAA;AAC7B,IAAM,MAAA,YAAA,GAAeA,QAAwB,IAAI,CAAA,CAAA;AACjD,IAAM,MAAA,cAAA,GAAiBA,QAAwB,IAAI,CAAA,CAAA;AACnD,IAAM,MAAA,eAAA,GAAkBA,QAAwB,IAAI,CAAA,CAAA;AACpD,IAAM,MAAA,UAAA,GAAaA,QAAI,CAAC,CAAA,CAAA;AACxB,IAAM,MAAA,QAAA,GAAWC,aAAS,MAAM;;AAC/B,MAAO,OAAA,CAAA,EAAA,GAAA,KAAA,CAAM,IAAK,CAAA,cAAA,KAAX,IAA6B,GAAA,EAAA,GAAA,CAAA,CAAA;AAAA,KACpC,CAAA,CAAA;AAED,IAAM,MAAA,OAAA,GAAUA,aAAkB,MAAM;AACvC,MAAA,MAAM,GAAM,GAAA,KAAA,CAAM,IAAK,CAAA,IAAA,CAAK,MAAM,GAAG,CAAA,CAAA;AACrC,MAAA,MAAM,OAAO,GAAI,CAAA,GAAA,CAAI,MAAS,GAAA,CAAC,EAAE,WAAY,EAAA,CAAA;AAE7C,MAAA,OAAQ,OAAO,IAAK,CAAA,WAAW,EAAgB,QAAS,CAAA,IAAI,IAAI,IAAO,GAAA,EAAA,CAAA;AAAA,KACvE,CAAA,CAAA;AAED,IAAA,MAAM,wBAAwB,MAAM;AACnC,MAAA,IAAI,YAAa,CAAA,KAAA,IAAS,cAAe,CAAA,KAAA,IAAS,gBAAgB,KAAO,EAAA;AACxE,QAAM,MAAA,SAAA,GAAY,YAAa,CAAA,KAAA,CAAM,qBAAsB,EAAA,CAAA;AAC3D,QAAM,MAAA,aAAA,GAAgB,eAAgB,CAAA,KAAA,CAAM,qBAAsB,EAAA,CAAA;AAElE,QAAM,MAAA,WAAA,GAAc,SAAU,CAAA,GAAA,GAAM,aAAc,CAAA,GAAA,CAAA;AAClD,QAAA,UAAA,CAAW,KAAQ,GAAA,WAAA,GAAc,cAAe,CAAA,KAAA,CAAM,YAAe,GAAA,CAAA,CAAA;AAAA,OACtE;AAAA,KACD,CAAA;AAEA,IAAA,MAAM,mBAAmB,YAAY;AACpC,MAAA,WAAA,CAAY,KAAQ,GAAA,IAAA,CAAA;AAEpB,MAAA,MAAMC,YAAS,EAAA,CAAA;AACf,MAAsB,qBAAA,EAAA,CAAA;AAAA,KACvB,CAAA;AAEA,IAAA,MAAM,eAAe,MAAM;AAC1B,MAAA,IAAI,YAAY,KAAO,EAAA;AACtB,QAAsB,qBAAA,EAAA,CAAA;AAAA,OACvB;AAAA,KACD,CAAA;AAEA,IAAM,MAAA,UAAA,GAAaC,UAA+C,CAAA,YAAA,EAAc,MAAM;AACrF,MAAA,OAAA,CAAQ,KAAK,sCAAa,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAED,IAAA,MAAM,cAAc,MAAM;AACzB,MAAW,UAAA,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA,CAAA;AAAA,KAC9B,CAAA;AACA,IAAAC,aAAA,CAAU,MAAM;AACf,MAAO,MAAA,CAAA,gBAAA,CAAiB,UAAU,YAAY,CAAA,CAAA;AAAA,KAC9C,CAAA,CAAA;AACD,IAAAC,eAAA,CAAY,MAAM;AACjB,MAAO,MAAA,CAAA,mBAAA,CAAoB,UAAU,YAAY,CAAA,CAAA;AAAA,KACjD,CAAA,CAAA;;;;;;UAzHAC,uBAAS,IAAA,CAAA;AAAA,UACTC,sBAAA;AAAA,YAqBM,KAAA;AAAA,YAAA;AAAA,cArBD,KAAA,EAAMC,mBAAA,CAAA,UAAA,EAAmBC,KAAAA,IAAK,CAAA,WAAA,GAAW,WAAA,GAAA,aAAA,CAAA,CAAA;AAAA;;cAC7CH,uBAAiC,4BAAA,CAAA;AAAA,cACjCC,uBAAuE,KAAA,EAAA;AAAA,gBAAlE,KAAM,EAAA,cAAA;AAAA,gBAAgB,GAAA,EAAK,WAAY,CAAA,OAAA,CAAO,KAAA,CAAA;AAAA,gBAAI,KAAK,OAAO,CAAA,KAAA;AAAA;cACnEA,sBAAA;AAAA,gBAUM,KAAA;AAAA,gBAAA;AAAA,yBAVG,EAAA,iBAAA;AAAA,kBAAJ,GAAI,EAAA,eAAA;AAAA,kBAAkB,KAAM,EAAA,iBAAA;AAAA;;kBAChCA,uBAEI,GAAA,EAAA;AAAA,2BAFG,EAAA,cAAA;AAAA,oBAAJ,GAAI,EAAA,YAAA;AAAA,oBAAe,KAAM,EAAA,gBAAA;AAAA,oBAAkB,YAAY,EAAA,gBAAA;AAAA,oBAAmB,qBAAY,KAAA,WAAA,CAAW,KAAA,GAAA,KAAA;AAAA,mBAChGE,EAAAA,oBAAAA,IAAAA,CAAAA,IAAAA,CAAK,IAAI,CAAA,EAAA,EAAA,EAAA,CAAA,cAAA,CAAA,CAAA;AAAA,kBAEJA,KAAAA,IAAK,CAAA,WAAA,qBAAdC,uBAAuD,GAAA,EAAA;AAAA;oBAA5B,KAAM,EAAA,eAAA;AAAA,mBAAgB,EAAA,cAAE;kBAC1C,QAAA,CAAQ,UAAA,GAAA,IAAA,CAAaD,KAAI,IAAC,CAAA,WAAA,mBAAnC,EAAAC,sBAAA;AAAA,oBAAyF,GAAA;AAAA,oBAAA;AAAA;sBAAzC,KAAM,EAAA,eAAA;AAAA,qBAAmB;AAAA,oBAAAC,mBAAA,CAAA,QAAA,CAAA,KAAQ,CAAG,GAAA,GAAA;AAAA,oBAAC,CAAA;AAAA;AAAA,mBAAA;kBAC5E,QAAA,CAAQ,UAAA,GAAA,IAAA,CAAaF,KAAI,IAAC,CAAA,WAAA,mBAAnC,EAAAC,sBAAA;AAAA,oBAA6F,GAAA;AAAA,oBAAA;AAAA;sBAA7C,KAAM,EAAA,eAAA;AAAA,qBAAmBD;AAAAA,oBAAAA,mBAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAK,QAAQ,CAAA;AAAA,oBAAA,CAAA;AAAA;AAAA,mBAAA;kBACtFH,sBAEQ,CAAA,CAAA;AAAA;AAAA,QAAA,CAAA,CAAA;AAAA;;;;cAETC,uBAA0F,KAAA,EAAA;AAAA,gBAArF,KAAM,EAAA,gBAAA;AAAA,gBAAiB,GAAA,EAAAK,aAAA;AAAA,gBAA2B,GAAI,EAAA,OAAA;AAAA,gBAAS,OAAO,EAAA,WAAA;AAAA;cAChE,QAAQ,CAAA,KAAA,KAAA,sBAAnB,EAAAF,sBAAA;AAAA,gBAA0G,KAAA;AAAA,gBAAA;AAAA;kBAA5E,KAAA,8BAAiB,SAAQ,KAAA,GAAA,CAAA,GAAA,CAAA,GAAA,GAAA,EAAA,CAAA;AAAA,kBAAmB,KAAM,EAAA,mBAAA;AAAA;;;;;iCAChFH,uBAIM,KAAA,EAAA;AAAA,gBAJiB,KAAM,EAAA,gBAAA;AAAA,gBAAkB,SAAO,CAAA,MAAA,KAAA,MAAeE,OAAAA,EAAAA,IAAAA,CAAAA,KAAK,EAAE,CAAA;AAAA;gCAC3E,EAAAC,sBAAA,CAEM,KAAA,EAAA;AAAA,kBAFD,KAAM,EAAA,4BAAA;AAAA,kBAA6B,KAAM,EAAA,GAAA;AAAA,kBAAI,MAAO,EAAA,GAAA;AAAA,kBAAI,OAAQ,EAAA,SAAA;AAAA,kBAAU,IAAK,EAAA,MAAA;AAAA;kBACnFH,uBAAmP,MAAA,EAAA;AAAA,oBAA7O,CAAE,EAAA,2NAAA;AAAA,oBAA4N,IAAK,EAAA,OAAA;AAAA;;;0BAF9NM,EAAAA,IAAAA,CAAQ,QAAA,CAAA;AAAA;;;;;;;;;;;;;;;"}
|
|
@@ -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">\
|
|
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> ')
|
|
158
158
|
]);
|
|
159
159
|
};
|
|
160
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RealtimeVoice.vue2.js","sources":["../../../../../../packages/components/touchchat/component/RealtimeVoice.vue"],"sourcesContent":["<template>\
|
|
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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"}
|
|
@@ -24,6 +24,14 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
24
24
|
}
|
|
25
25
|
);
|
|
26
26
|
const generateId = () => Date.now().toString(36) + Math.random().toString(36).substr(2);
|
|
27
|
+
const formatFileSize = (bytes) => {
|
|
28
|
+
if (bytes === 0)
|
|
29
|
+
return "0 Bytes";
|
|
30
|
+
const k = 1024;
|
|
31
|
+
const sizes = ["Bytes", "KB", "MB", "GB"];
|
|
32
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
33
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
|
|
34
|
+
};
|
|
27
35
|
const startScreenshot = () => {
|
|
28
36
|
isScreenshotting.value = true;
|
|
29
37
|
document.body.style.overflow = "hidden";
|
|
@@ -109,11 +117,12 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
109
117
|
uploadProgress: 0,
|
|
110
118
|
uploadSuccess: false,
|
|
111
119
|
uploadError: false,
|
|
112
|
-
fileSize:
|
|
120
|
+
fileSize: formatFileSize(file.size),
|
|
113
121
|
fileType: file.type,
|
|
114
122
|
name: file.name,
|
|
115
123
|
id: generateId(),
|
|
116
|
-
base64
|
|
124
|
+
base64,
|
|
125
|
+
lastModified: Date.now()
|
|
117
126
|
};
|
|
118
127
|
fileList.value = [fileItem];
|
|
119
128
|
emits("upFileList", fileList.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Screenshot.vue2.js","sources":["../../../../../../packages/components/touchchat/component/Screenshot.vue"],"sourcesContent":["<template>\r\n\t<button class=\"touchchat-edit-screenshot touchchat-edit-button\" @click=\"startScreenshot\">\r\n\t\t<div class=\"touchchat-edit-screenshot-icon\"></div>\r\n\t\t<div class=\"touchchat-edit-tooltip\">截图</div>\r\n\t</button>\r\n\t<!-- 截图遮罩层 -->\r\n\t<div v-if=\"isScreenshotting\" class=\"screenshot-mask\" @mousedown=\"handleMouseDown\" @mousemove=\"selectArea\" @mouseup=\"endSelect\">\r\n\t\t<!-- 截图区域 -->\r\n\t\t<div\r\n\t\t\tv-if=\"selectionArea\"\r\n\t\t\tclass=\"selection-area\"\r\n\t\t\t:style=\"{\r\n\t\t\t\tleft: selectionArea.x + 'px',\r\n\t\t\t\ttop: selectionArea.y + 'px',\r\n\t\t\t\tright: 0,\r\n\t\t\t\tbottom: 0,\r\n\t\t\t\twidth: selectionArea.width + 'px',\r\n\t\t\t\theight: selectionArea.height + 'px',\r\n\t\t\t\t'--selection-left': selectionArea.x + 'px',\r\n\t\t\t\t'--selection-top': selectionArea.y + 'px',\r\n\t\t\t\t'--selection-width': selectionArea.width + 'px',\r\n\t\t\t\t'--selection-height': selectionArea.height + 'px'\r\n\t\t\t}\"\r\n\t\t></div>\r\n\t\t<!-- 确认和取消按钮 -->\r\n\t\t<div class=\"screenshot-actions\">\r\n\t\t\t<button @click.stop=\"confirmScreenshot\">确认</button>\r\n\t\t\t<button @click.stop=\"cancelScreenshot\">取消</button>\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, watch } from 'vue'\r\nimport html2canvas from 'html2canvas'\r\n\r\ninterface FileItem {\r\n\tfile: File\r\n\tisUploading: boolean\r\n\tuploadProgress: number\r\n\tuploadSuccess: boolean\r\n\tuploadError: boolean\r\n\tfileSize: string\r\n\tfileType: string\r\n\tname: string\r\n\tid: string\r\n\tbase64: string | null\r\n}\r\n\r\n// 是否正在截图\r\nconst isScreenshotting = ref(false)\r\n// 截图区域信息\r\nconst selectionArea = ref<{ x: number; y: number; width: number; height: number } | null>(null)\r\nconst finallySelectArea = ref<{ x: number; y: number; width: number; height: number } | null>(null)\r\n// 鼠标按下时的起始坐标\r\nconst startX = ref(0)\r\nconst startY = ref(0)\r\n// 区域是否已固定\r\nconst isAreaFixed = ref(false)\r\nconst fileList = ref<FileItem[]>([])\r\n\r\nconst emits = defineEmits<{\r\n\t(e: 'upFileList', list: FileItem[]): void\r\n}>()\r\n\r\nwatch(\r\n\t() => isScreenshotting.value,\r\n\t() => {\r\n\t\tfinallySelectArea.value = null\r\n\t}\r\n)\r\n\r\n// 生成唯一 ID\r\nconst generateId = () => Date.now().toString(36) + Math.random().toString(36).substr(2)\r\n\r\n// 开始截图\r\nconst startScreenshot = () => {\r\n\tisScreenshotting.value = true\r\n\t// 隐藏滚动条\r\n\tdocument.body.style.overflow = 'hidden'\r\n\tisAreaFixed.value = true\r\n\t// 获取 body 的宽高\r\n\tconst bodyWidth = document.body.clientWidth\r\n\tconst bodyHeight = document.body.clientHeight\r\n\t// 默认设置 selectionArea 为整个 body 区域\r\n\tselectionArea.value = { x: 0, y: 0, width: bodyWidth, height: bodyHeight }\r\n}\r\n\r\n// 处理鼠标按下事件\r\nconst handleMouseDown = (e: MouseEvent) => {\r\n\te.stopPropagation()\r\n\tif (isAreaFixed.value) {\r\n\t\t// 若区域固定,取消固定并开始选择新区域\r\n\t\tisAreaFixed.value = false\r\n\t\tstartSelect(e)\r\n\t\treturn\r\n\t}\r\n\tstartSelect(e)\r\n}\r\n\r\n// 结束选择区域\r\nconst endSelect = (e: MouseEvent) => {\r\n\te.stopPropagation()\r\n\tif (!isAreaFixed.value) {\r\n\t\t// 可添加额外逻辑\r\n\t\tisAreaFixed.value = true\r\n\t}\r\n}\r\n\r\n// 开始选择区域\r\nconst startSelect = (e: MouseEvent) => {\r\n\tstartX.value = e.clientX\r\n\tstartY.value = e.clientY\r\n\tselectionArea.value = { x: startX.value, y: startY.value, width: 0, height: 0 }\r\n}\r\n\r\n// 选择区域\r\nconst selectArea = (e: MouseEvent) => {\r\n\tif (isAreaFixed.value || !selectionArea.value) return\r\n\tconst endX = e.clientX\r\n\tconst endY = e.clientY\r\n\tselectionArea.value.x = Math.min(startX.value, endX)\r\n\tselectionArea.value.y = Math.min(startY.value, endY)\r\n\tselectionArea.value.width = Math.abs(endX - startX.value)\r\n\tselectionArea.value.height = Math.abs(endY - startY.value)\r\n\tfinallySelectArea.value = JSON.parse(JSON.stringify(selectionArea.value))\r\n}\r\n\r\n// 确认截图\r\nconst confirmScreenshot = async (e: MouseEvent) => {\r\n\te.stopPropagation()\r\n\ttry {\r\n\t\tlet canvas\r\n\t\tconst commonOptions = {\r\n\t\t\tuseCORS: true,\r\n\t\t\tlogging: false,\r\n\t\t\tscale: window.devicePixelRatio || 1, // 设置缩放比例,解决模糊问题\r\n\t\t\tbackgroundColor: null, // 不设置背景色,保持原有背景\r\n\t\t\tignoreElements: (element: any) => {\r\n\t\t\t\t// 忽略截图遮罩层,避免影响截图效果\r\n\t\t\t\treturn element.classList.contains('screenshot-mask')\r\n\t\t\t},\r\n\t\t\tuseOverflowScrolling: false, // 禁用 overflow-scrolling 以避免样式问题\r\n\t\t\tremoveContainer: true, // 截图完成后移除临时创建的元素\r\n\t\t\tallowTaint: false\r\n\t\t}\r\n\r\n\t\t// 获取页面滚动偏移量\r\n\t\tconst scrollX = window.pageXOffset || document.documentElement.scrollLeft\r\n\t\tconst scrollY = window.pageYOffset || document.documentElement.scrollTop\r\n\t\tif (finallySelectArea.value && finallySelectArea.value.width > 0 && finallySelectArea.value.height > 0) {\r\n\t\t\tconst { x, y, width, height } = finallySelectArea.value\r\n\t\t\t// 区域截图\r\n\t\t\tcanvas = await html2canvas(document.body, {\r\n\t\t\t\t...commonOptions,\r\n\t\t\t\twidth: width * commonOptions.scale,\r\n\t\t\t\theight: height * commonOptions.scale,\r\n\t\t\t\t// 加上滚动偏移量\r\n\t\t\t\tx: x + scrollX,\r\n\t\t\t\ty: y + scrollY\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\t// 全屏截图\r\n\t\t\tcanvas = await html2canvas(document.body, commonOptions)\r\n\t\t}\r\n\r\n\t\t// 将 canvas 转换为 Blob 对象\r\n\t\tawait new Promise<void>(resolve => {\r\n\t\t\tcanvas.toBlob(blob => {\r\n\t\t\t\tif (blob) {\r\n\t\t\t\t\tconst file = new File([blob], `screenshot_${generateId()}.png`, { type: 'image/png' })\r\n\t\t\t\t\tconst base64 = canvas.toDataURL('image/png')\r\n\t\t\t\t\tconst fileItem: FileItem = {\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: `${(file.size / 1024).toFixed(2)} KB`,\r\n\t\t\t\t\t\tfileType: file.type,\r\n\t\t\t\t\t\tname: file.name,\r\n\t\t\t\t\t\tid: generateId(),\r\n\t\t\t\t\t\tbase64\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfileList.value = [fileItem]\r\n\t\t\t\t\temits('upFileList', fileList.value)\r\n\t\t\t\t}\r\n\t\t\t\tresolve()\r\n\t\t\t}, 'image/png')\r\n\t\t})\r\n\t} catch (error) {\r\n\t\tconsole.error('截图失败:', error)\r\n\t}\r\n\tcancelScreenshot()\r\n}\r\n\r\n// 取消截图\r\nconst cancelScreenshot = () => {\r\n\tisScreenshotting.value = false\r\n\tselectionArea.value = null\r\n\tisAreaFixed.value = false\r\n\t// 恢复滚动条\r\n\tdocument.body.style.overflow = ''\r\n}\r\n</script>\r\n"],"names":["ref","watch","html2canvas","_createElementVNode","_createCommentVNode","_createElementBlock","_normalizeStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Screenshot.vue2.js","sources":["../../../../../../packages/components/touchchat/component/Screenshot.vue"],"sourcesContent":["<template>\n\t<button class=\"touchchat-edit-screenshot touchchat-edit-button\" @click=\"startScreenshot\">\n\t\t<div class=\"touchchat-edit-screenshot-icon\"></div>\n\t\t<div class=\"touchchat-edit-tooltip\">截图</div>\n\t</button>\n\t<!-- 截图遮罩层 -->\n\t<div v-if=\"isScreenshotting\" class=\"screenshot-mask\" @mousedown=\"handleMouseDown\" @mousemove=\"selectArea\" @mouseup=\"endSelect\">\n\t\t<!-- 截图区域 -->\n\t\t<div\n\t\t\tv-if=\"selectionArea\"\n\t\t\tclass=\"selection-area\"\n\t\t\t:style=\"{\n\t\t\t\tleft: selectionArea.x + 'px',\n\t\t\t\ttop: selectionArea.y + 'px',\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\twidth: selectionArea.width + 'px',\n\t\t\t\theight: selectionArea.height + 'px',\n\t\t\t\t'--selection-left': selectionArea.x + 'px',\n\t\t\t\t'--selection-top': selectionArea.y + 'px',\n\t\t\t\t'--selection-width': selectionArea.width + 'px',\n\t\t\t\t'--selection-height': selectionArea.height + 'px'\n\t\t\t}\"\n\t\t></div>\n\t\t<!-- 确认和取消按钮 -->\n\t\t<div class=\"screenshot-actions\">\n\t\t\t<button @click.stop=\"confirmScreenshot\">确认</button>\n\t\t\t<button @click.stop=\"cancelScreenshot\">取消</button>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue'\nimport html2canvas from 'html2canvas'\nimport type { FileItem } from '../src/AiChat/Chat/types'\n\n// 是否正在截图\nconst isScreenshotting = ref(false)\n// 截图区域信息\nconst selectionArea = ref<{ x: number; y: number; width: number; height: number } | null>(null)\nconst finallySelectArea = ref<{ x: number; y: number; width: number; height: number } | null>(null)\n// 鼠标按下时的起始坐标\nconst startX = ref(0)\nconst startY = ref(0)\n// 区域是否已固定\nconst isAreaFixed = ref(false)\nconst fileList = ref<FileItem[]>([])\n\nconst emits = defineEmits<{\n\t(e: 'upFileList', list: FileItem[]): void\n}>()\n\nwatch(\n\t() => isScreenshotting.value,\n\t() => {\n\t\tfinallySelectArea.value = null\n\t}\n)\n\n// 生成唯一 ID\nconst generateId = () => Date.now().toString(36) + Math.random().toString(36).substr(2)\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 startScreenshot = () => {\n\tisScreenshotting.value = true\n\t// 隐藏滚动条\n\tdocument.body.style.overflow = 'hidden'\n\tisAreaFixed.value = true\n\t// 获取 body 的宽高\n\tconst bodyWidth = document.body.clientWidth\n\tconst bodyHeight = document.body.clientHeight\n\t// 默认设置 selectionArea 为整个 body 区域\n\tselectionArea.value = { x: 0, y: 0, width: bodyWidth, height: bodyHeight }\n}\n\n// 处理鼠标按下事件\nconst handleMouseDown = (e: MouseEvent) => {\n\te.stopPropagation()\n\tif (isAreaFixed.value) {\n\t\t// 若区域固定,取消固定并开始选择新区域\n\t\tisAreaFixed.value = false\n\t\tstartSelect(e)\n\t\treturn\n\t}\n\tstartSelect(e)\n}\n\n// 结束选择区域\nconst endSelect = (e: MouseEvent) => {\n\te.stopPropagation()\n\tif (!isAreaFixed.value) {\n\t\t// 可添加额外逻辑\n\t\tisAreaFixed.value = true\n\t}\n}\n\n// 开始选择区域\nconst startSelect = (e: MouseEvent) => {\n\tstartX.value = e.clientX\n\tstartY.value = e.clientY\n\tselectionArea.value = { x: startX.value, y: startY.value, width: 0, height: 0 }\n}\n\n// 选择区域\nconst selectArea = (e: MouseEvent) => {\n\tif (isAreaFixed.value || !selectionArea.value) return\n\tconst endX = e.clientX\n\tconst endY = e.clientY\n\tselectionArea.value.x = Math.min(startX.value, endX)\n\tselectionArea.value.y = Math.min(startY.value, endY)\n\tselectionArea.value.width = Math.abs(endX - startX.value)\n\tselectionArea.value.height = Math.abs(endY - startY.value)\n\tfinallySelectArea.value = JSON.parse(JSON.stringify(selectionArea.value))\n}\n\n// 确认截图\nconst confirmScreenshot = async (e: MouseEvent) => {\n\te.stopPropagation()\n\ttry {\n\t\tlet canvas\n\t\tconst commonOptions = {\n\t\t\tuseCORS: true,\n\t\t\tlogging: false,\n\t\t\tscale: window.devicePixelRatio || 1, // 设置缩放比例,解决模糊问题\n\t\t\tbackgroundColor: null, // 不设置背景色,保持原有背景\n\t\t\tignoreElements: (element: any) => {\n\t\t\t\t// 忽略截图遮罩层,避免影响截图效果\n\t\t\t\treturn element.classList.contains('screenshot-mask')\n\t\t\t},\n\t\t\tuseOverflowScrolling: false, // 禁用 overflow-scrolling 以避免样式问题\n\t\t\tremoveContainer: true, // 截图完成后移除临时创建的元素\n\t\t\tallowTaint: false\n\t\t}\n\n\t\t// 获取页面滚动偏移量\n\t\tconst scrollX = window.pageXOffset || document.documentElement.scrollLeft\n\t\tconst scrollY = window.pageYOffset || document.documentElement.scrollTop\n\t\tif (finallySelectArea.value && finallySelectArea.value.width > 0 && finallySelectArea.value.height > 0) {\n\t\t\tconst { x, y, width, height } = finallySelectArea.value\n\t\t\t// 区域截图\n\t\t\tcanvas = await html2canvas(document.body, {\n\t\t\t\t...commonOptions,\n\t\t\t\twidth: width * commonOptions.scale,\n\t\t\t\theight: height * commonOptions.scale,\n\t\t\t\t// 加上滚动偏移量\n\t\t\t\tx: x + scrollX,\n\t\t\t\ty: y + scrollY\n\t\t\t})\n\t\t} else {\n\t\t\t// 全屏截图\n\t\t\tcanvas = await html2canvas(document.body, commonOptions)\n\t\t}\n\n\t\t// 将 canvas 转换为 Blob 对象\n\t\tawait new Promise<void>(resolve => {\n\t\t\tcanvas.toBlob(blob => {\n\t\t\t\tif (blob) {\n\t\t\t\t\tconst file = new File([blob], `screenshot_${generateId()}.png`, { type: 'image/png' })\n\t\t\t\t\tconst base64 = canvas.toDataURL('image/png')\n\t\t\t\t\tconst fileItem: FileItem = {\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\tname: file.name,\n\t\t\t\t\t\tid: generateId(),\n\t\t\t\t\t\tbase64,\n\t\t\t\t\t\tlastModified: Date.now()\n\t\t\t\t\t}\n\t\t\t\t\tfileList.value = [fileItem]\n\t\t\t\t\temits('upFileList', fileList.value)\n\t\t\t\t}\n\t\t\t\tresolve()\n\t\t\t}, 'image/png')\n\t\t})\n\t} catch (error) {\n\t\tconsole.error('截图失败:', error)\n\t}\n\tcancelScreenshot()\n}\n\n// 取消截图\nconst cancelScreenshot = () => {\n\tisScreenshotting.value = false\n\tselectionArea.value = null\n\tisAreaFixed.value = false\n\t// 恢复滚动条\n\tdocument.body.style.overflow = ''\n}\n</script>\n"],"names":["ref","watch","html2canvas","_createElementVNode","_createCommentVNode","_createElementBlock","_normalizeStyle"],"mappings":"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"}
|
|
@@ -43,12 +43,13 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
43
43
|
uploadProgress: 0,
|
|
44
44
|
uploadSuccess: false,
|
|
45
45
|
uploadError: false,
|
|
46
|
-
fileSize:
|
|
46
|
+
fileSize: formatFileSize(file.size),
|
|
47
47
|
fileType: file.type,
|
|
48
48
|
id: file.lastModified.toString(),
|
|
49
49
|
name: file.name,
|
|
50
|
-
base64
|
|
50
|
+
base64,
|
|
51
51
|
// 存储 Base64 数据
|
|
52
|
+
lastModified: file.lastModified
|
|
52
53
|
});
|
|
53
54
|
uploadFile(fileInfos.value.length - 1);
|
|
54
55
|
};
|
|
@@ -60,11 +61,11 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
60
61
|
uploadProgress: 0,
|
|
61
62
|
uploadSuccess: false,
|
|
62
63
|
uploadError: false,
|
|
63
|
-
fileSize:
|
|
64
|
+
fileSize: formatFileSize(file.size),
|
|
64
65
|
fileType: file.type,
|
|
65
66
|
id: file.lastModified.toString(),
|
|
66
67
|
name: file.name,
|
|
67
|
-
|
|
68
|
+
lastModified: file.lastModified
|
|
68
69
|
});
|
|
69
70
|
uploadFile(fileInfos.value.length - 1);
|
|
70
71
|
}
|
|
@@ -79,7 +80,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
79
80
|
};
|
|
80
81
|
const uploadFile = (index, type) => {
|
|
81
82
|
const fileInfo = fileInfos.value[index];
|
|
82
|
-
if (!fileInfo)
|
|
83
|
+
if (!fileInfo || !fileInfo.file)
|
|
83
84
|
return;
|
|
84
85
|
fileInfo.isUploading = true;
|
|
85
86
|
fileInfo.uploadSuccess = false;
|
|
@@ -90,9 +91,11 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
90
91
|
fileInfo.id = fileInfo.file.lastModified.toString();
|
|
91
92
|
fileInfo.name = fileInfo.file.name;
|
|
92
93
|
const interval = setInterval(() => {
|
|
93
|
-
fileInfo.uploadProgress
|
|
94
|
+
if (fileInfo.uploadProgress !== void 0) {
|
|
95
|
+
fileInfo.uploadProgress += 10;
|
|
96
|
+
}
|
|
94
97
|
emit("upload-file", fileInfos.value);
|
|
95
|
-
if (fileInfo.uploadProgress >= 100) {
|
|
98
|
+
if (fileInfo.uploadProgress !== void 0 && fileInfo.uploadProgress >= 100) {
|
|
96
99
|
clearInterval(interval);
|
|
97
100
|
fileInfo.isUploading = false;
|
|
98
101
|
fileInfo.uploadSuccess = true;
|
|
@@ -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'\
|
|
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\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\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}\n\tconsole.log(fileInfos.value, 'fileInfos.value')\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 = (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\tconst interval = setInterval(() => {\n\t\tif (fileInfo.uploadProgress !== undefined) {\n\t\t\tfileInfo.uploadProgress += 10\n\t\t}\n\t\t// emit('progressFn', fileInfo.uploadProgress)\n\t\temit('upload-file', fileInfos.value)\n\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress >= 100) {\n\t\t\tclearInterval(interval)\n\t\t\tfileInfo.isUploading = false\n\t\t\tfileInfo.uploadSuccess = true\n\t\t}\n\t}, 100)\n\n\t// 模拟上传失败的情况,可根据需求修改\n\tif (type) {\n\t\treturn\n\t}\n\t// setTimeout(() => {\n\t// \tclearInterval(interval)\n\t// \tfileInfo.isUploading = false\n\t// \tfileInfo.uploadError = true\n\t// }, 500)\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":["ref","inject","showToast","_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot"],"mappings":";;;;;;;;;;;;;;AAeA,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAId,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAIb,IAAM,MAAA,SAAA,GAAYA,QAA6B,IAAI,CAAA,CAAA;AACnD,IAAA,MAAM,SAAY,GAAAA,OAAA,CAAgB,KAAM,CAAA,QAAA,IAAY,EAAE,CAAA,CAAA;AACtD,IAAA,MAAM,YAAe,GAAAC,UAAA,CAAiB,cAAgB,EAAA,EAAE,CAAA,CAAA;AAExD,IAAA,MAAM,KAAQ,GAAAD,OAAA,CAAc,YAAgB,IAAA,EAAE,CAAA,CAAA;AAG9C,IAAA,MAAM,mBAAmB,MAAM;AAC9B,MAAA,IAAI,UAAU,KAAO,EAAA;AACpB,QAAA,SAAA,CAAU,MAAM,KAAM,EAAA,CAAA;AAAA,OACvB;AAAA,KACD,CAAA;AAGA,IAAM,MAAA,gBAAA,GAAmB,CAAC,KAAiB,KAAA;AAC1C,MAAA,MAAM,QAAQ,KAAM,CAAA,MAAA,CAAA;AACpB,MAAA,IAAI,KAAM,CAAA,KAAA,IAAS,KAAM,CAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AAC1C,QAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,KAAM,CAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AAC5C,UAAM,MAAA,IAAA,GAAO,KAAM,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAE1B,UAAA,IAAI,CAAC,iBAAkB,CAAA,IAAI,KAAK,KAAM,CAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACvD,YAAUE,eAAA,CAAA,CAAA,wBAAA,EAAO,KAAK,IAAgB,CAAA,sDAAA,EAAA,KAAA,CAAM,MAAM,IAAK,CAAA,QAAG,CAAS,CAAA,wBAAA,CAAA,EAAA,MAAA,EAAQ,GAAI,CAAA,CAAA;AAC/E,YAAA,SAAA;AAAA,WACD;AACA,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,UAAW,CAAA,QAAQ,CAAG,EAAA;AACnC,YAAM,MAAA,MAAA,GAAS,IAAI,UAAW,EAAA,CAAA;AAC9B,YAAA,MAAA,CAAO,SAAS,CAAK,CAAA,KAAA;;AACpB,cAAM,MAAA,MAAA,GAAA,CAAS,EAAE,GAAA,CAAA,CAAA,MAAA,KAAF,IAAU,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAA,CAAA;AACzB,cAAA,SAAA,CAAU,MAAM,IAAK,CAAA;AAAA,gBACpB,IAAA;AAAA,gBACA,WAAa,EAAA,KAAA;AAAA,gBACb,cAAgB,EAAA,CAAA;AAAA,gBAChB,aAAe,EAAA,KAAA;AAAA,gBACf,WAAa,EAAA,KAAA;AAAA,gBACb,QAAA,EAAU,cAAe,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,gBAClC,UAAU,IAAK,CAAA,IAAA;AAAA,gBACf,EAAA,EAAI,IAAK,CAAA,YAAA,CAAa,QAAS,EAAA;AAAA,gBAC/B,MAAM,IAAK,CAAA,IAAA;AAAA,gBACX,MAAA;AAAA;AAAA,gBACA,cAAc,IAAK,CAAA,YAAA;AAAA,eACnB,CAAA,CAAA;AACD,cAAW,UAAA,CAAA,SAAA,CAAU,KAAM,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AAAA,aACtC,CAAA;AACA,YAAA,MAAA,CAAO,cAAc,IAAI,CAAA,CAAA;AAAA,WACnB,MAAA;AACN,YAAA,SAAA,CAAU,MAAM,IAAK,CAAA;AAAA,cACpB,IAAA;AAAA,cACA,WAAa,EAAA,KAAA;AAAA,cACb,cAAgB,EAAA,CAAA;AAAA,cAChB,aAAe,EAAA,KAAA;AAAA,cACf,WAAa,EAAA,KAAA;AAAA,cACb,QAAA,EAAU,cAAe,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,cAClC,UAAU,IAAK,CAAA,IAAA;AAAA,cACf,EAAA,EAAI,IAAK,CAAA,YAAA,CAAa,QAAS,EAAA;AAAA,cAC/B,MAAM,IAAK,CAAA,IAAA;AAAA,cACX,cAAc,IAAK,CAAA,YAAA;AAAA,aACnB,CAAA,CAAA;AACD,YAAW,UAAA,CAAA,SAAA,CAAU,KAAM,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AAAA,WACtC;AAAA,SACD;AAAA,OACD;AACA,MAAQ,OAAA,CAAA,GAAA,CAAI,SAAU,CAAA,KAAA,EAAO,iBAAiB,CAAA,CAAA;AAAA,KAC/C,CAAA;AAEA,IAAM,MAAA,iBAAA,GAAoB,CAAC,IAAwB,KAAA;;AAClD,MAAM,MAAA,aAAA,GAAA,CAAgB,UAAK,IAAK,CAAA,KAAA,CAAM,GAAG,CAAE,CAAA,GAAA,OAArB,IAA4B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,EAAA,CAAA;AAClD,MAAA,OAAO,KAAM,CAAA,KAAA,CAAM,QAAS,CAAA,aAAA,IAAiB,EAAE,CAAA,CAAA;AAAA,KAChD,CAAA;AAEA,IAAM,MAAA,UAAA,GAAa,CAAC,KAAA,EAAe,IAAkB,KAAA;AACpD,MAAM,MAAA,QAAA,GAAW,SAAU,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACtC,MAAI,IAAA,CAAC,QAAY,IAAA,CAAC,QAAS,CAAA,IAAA;AAAM,QAAA,OAAA;AAEjC,MAAA,QAAA,CAAS,WAAc,GAAA,IAAA,CAAA;AACvB,MAAA,QAAA,CAAS,aAAgB,GAAA,KAAA,CAAA;AACzB,MAAA,QAAA,CAAS,WAAc,GAAA,KAAA,CAAA;AACvB,MAAA,QAAA,CAAS,cAAiB,GAAA,CAAA,CAAA;AAC1B,MAAA,QAAA,CAAS,QAAW,GAAA,cAAA,CAAe,QAAS,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AACrD,MAAS,QAAA,CAAA,QAAA,GAAW,SAAS,IAAK,CAAA,IAAA,CAAA;AAClC,MAAA,QAAA,CAAS,EAAK,GAAA,QAAA,CAAS,IAAK,CAAA,YAAA,CAAa,QAAS,EAAA,CAAA;AAClD,MAAS,QAAA,CAAA,IAAA,GAAO,SAAS,IAAK,CAAA,IAAA,CAAA;AAE9B,MAAM,MAAA,QAAA,GAAW,YAAY,MAAM;AAClC,QAAI,IAAA,QAAA,CAAS,mBAAmB,KAAW,CAAA,EAAA;AAC1C,UAAA,QAAA,CAAS,cAAkB,IAAA,EAAA,CAAA;AAAA,SAC5B;AAEA,QAAK,IAAA,CAAA,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA;AACnC,QAAA,IAAI,QAAS,CAAA,cAAA,KAAmB,KAAa,CAAA,IAAA,QAAA,CAAS,kBAAkB,GAAK,EAAA;AAC5E,UAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AACtB,UAAA,QAAA,CAAS,WAAc,GAAA,KAAA,CAAA;AACvB,UAAA,QAAA,CAAS,aAAgB,GAAA,IAAA,CAAA;AAAA,SAC1B;AAAA,SACE,GAAG,CAAA,CAAA;AAGN,MAAA,IAAI,IAAM,EAAA;AACT,QAAA,OAAA;AAAA,OACD;AAAA,KAMD,CAAA;AAGA,IAAM,MAAA,cAAA,GAAiB,CAAC,KAAkB,KAAA;AACzC,MAAA,IAAI,KAAU,KAAA,CAAA;AAAG,QAAO,OAAA,SAAA,CAAA;AACxB,MAAA,MAAM,CAAI,GAAA,IAAA,CAAA;AACV,MAAA,MAAM,KAAQ,GAAA,CAAC,OAAS,EAAA,IAAA,EAAM,MAAM,IAAI,CAAA,CAAA;AACxC,MAAM,MAAA,CAAA,GAAI,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,GAAA,CAAI,KAAK,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAC,CAAA,CAAA;AAClD,MAAA,OAAO,UAAY,CAAA,CAAA,KAAA,GAAQ,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,CAAC,CAAG,EAAA,OAAA,CAAQ,CAAC,CAAC,CAAI,GAAA,GAAA,GAAM,MAAM,CAAC,CAAA,CAAA;AAAA,KACvE,CAAA;AAEA,IAAA,MAAM,YAAY,MAAM;AACvB,MAAA,SAAA,CAAU,QAAQ,EAAC,CAAA;AACnB,MAAA,IAAI,UAAU,KAAO,EAAA;AACpB,QAAA,SAAA,CAAU,MAAM,KAAQ,GAAA,EAAA,CAAA;AAAA,OACzB;AAAA,KACD,CAAA;AACA,IAAa,QAAA,CAAA;AAAA,MACZ,SAAA;AAAA,MACA,UAAA;AAAA,KACA,CAAA,CAAA;;4BAlJA,EAAAC,sBAAA,CAMM,OAAA,EAND,KAAA,EAAM,eAAa,EAAA;AAAA,QACvBC,uBAAgF,yGAAA,CAAA;AAAA,QAChFC,sBAEM,CAAA,KAAA,EAAA,EAFA,OAAA,EAAO,kBAAgB,EAAA;AAAA,UAC5BC,cAAA,CAAa,IAAA,CAAA,MAAA,EAAA,SAAA,CAAA;AAAA;QAEdD,sBAAA;AAAA,UAAkH,OAAA;AAAA,UAAA;AAAA,mBAAvG,EAAA,WAAA;AAAA,YAAJ,GAAI,EAAA,SAAA;AAAA,YAAY,IAAK,EAAA,MAAA;AAAA,YAAO,KAAM,EAAA,YAAA;AAAA,YAAa,KAAA,EAAA,EAAqB,SAAA,EAAA,MAAA,EAAA;AAAA,YAAC,QAAA,EAAA,EAAA;AAAA,YAAU,QAAQ,EAAA,gBAAA;AAAA;;;;;;;;;;;;"}
|
|
@@ -38,7 +38,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
38
38
|
name: audioFile.name,
|
|
39
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
43
|
emit("upFileList", [fileItem]);
|
|
44
44
|
if (mediaRecorder && mediaRecorder.stream) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceView.vue2.js","sources":["../../../../../../packages/components/touchchat/component/VoiceView.vue"],"sourcesContent":["<template>\
|
|
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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"}
|
|
@@ -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 ===
|
|
38
|
+
class: vue.normalizeClass([item.id === _ctx.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
|
|
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;;;;;;;;;;;;;"}
|