@touchvue/chat 1.0.0-beta.38 → 1.0.0-beta.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/es/package.json.mjs +1 -1
  2. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +3 -5
  3. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
  4. package/es/packages/components/touchchat/component/Screenshot.vue2.mjs +2 -4
  5. package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
  6. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +11 -13
  7. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs.map +1 -1
  8. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +7 -7
  9. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  10. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +60 -5
  11. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  12. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +10 -1
  13. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
  14. package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs +31 -25
  15. package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
  16. package/es/packages/components/touchchat/src/index.vue2.mjs +16 -11
  17. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  18. package/es/packages/components/touchchat/utils/a2aService.mjs +19 -4
  19. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  20. package/lib/package.json.js +1 -1
  21. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +3 -5
  22. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
  23. package/lib/packages/components/touchchat/component/Screenshot.vue2.js +2 -4
  24. package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
  25. package/lib/packages/components/touchchat/component/VoiceView.vue2.js +11 -13
  26. package/lib/packages/components/touchchat/component/VoiceView.vue2.js.map +1 -1
  27. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +6 -6
  28. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  29. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +60 -5
  30. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  31. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +10 -1
  32. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
  33. package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js +31 -25
  34. package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
  35. package/lib/packages/components/touchchat/src/index.vue2.js +16 -11
  36. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  37. package/lib/packages/components/touchchat/utils/a2aService.js +19 -4
  38. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  39. package/package.json +1 -1
  40. package/theme/components/index.css +73 -121
  41. package/theme/font/iconfont.woff +0 -0
  42. package/theme/font/iconfont.woff2 +0 -0
  43. package/theme/index.css +73 -121
  44. package/theme/skin/default.css +73 -121
@@ -1,5 +1,5 @@
1
1
  var name = "@touchvue/chat";
2
- var version = "1.0.0-beta.38";
2
+ var version = "1.0.0-beta.39";
3
3
  var description = "TouchVue UI Component Library";
4
4
  var main = "lib/index.js";
5
5
  var module = "es/index.mjs";
@@ -65,7 +65,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
65
65
  return (_ctx, _cache) => {
66
66
  return openBlock(), createElementBlock("div", null, [
67
67
  createElementVNode("button", {
68
- class: "touchchat-edit-attach",
68
+ class: "touchchat-edit-voice touchchat-edit-button",
69
69
  onClick: startRealtimeVoice
70
70
  }, [
71
71
  createCommentVNode(" \u672A\u5B9E\u65F6\u8BED\u97F3\u524D "),
@@ -128,9 +128,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
128
128
  2112
129
129
  /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
130
130
  )),
131
- createElementVNode("div", { class: "touchchat-edit-attach-tip touchchat-edit-voice-tip" }, [
132
- createElementVNode("p", null, "\u8BED\u97F3\u5F55\u5165")
133
- ])
131
+ createElementVNode("div", { class: "touchchat-edit-tooltip" }, "\u8BED\u97F3\u5F55\u5165")
134
132
  ]),
135
133
  dialogVisible.value ? (openBlock(), createElementBlock("div", {
136
134
  key: 0,
@@ -152,7 +150,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
152
150
  ])
153
151
  ])) : createCommentVNode("v-if", true),
154
152
  createCommentVNode(" \u663E\u793A\u8BED\u97F3\u8F6C\u6587\u5B57\u7684\u7ED3\u679C "),
155
- 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> ')
156
154
  ]);
157
155
  };
158
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-attach\" @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-attach-tip touchchat-edit-voice-tip\">\n\t\t\t\t<p>语音录入</p>\n\t\t\t</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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"}
@@ -134,13 +134,11 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
134
134
  null,
135
135
  [
136
136
  createElementVNode("button", {
137
- class: "touchchat-edit-attach",
137
+ class: "touchchat-edit-screenshot touchchat-edit-button",
138
138
  onClick: startScreenshot
139
139
  }, [
140
140
  createElementVNode("div", { class: "touchchat-edit-screenshot-icon" }),
141
- createElementVNode("div", { class: "touchchat-edit-attach-tip touchchat-edit-voice-tip" }, [
142
- createElementVNode("p", null, "\u622A\u56FE")
143
- ])
141
+ createElementVNode("div", { class: "touchchat-edit-tooltip" }, "\u622A\u56FE")
144
142
  ]),
145
143
  createCommentVNode(" \u622A\u56FE\u906E\u7F69\u5C42 "),
146
144
  isScreenshotting.value ? (openBlock(), createElementBlock(
@@ -1 +1 @@
1
- {"version":3,"file":"Screenshot.vue2.mjs","sources":["../../../../../../packages/components/touchchat/component/Screenshot.vue"],"sourcesContent":["<template>\n\t<button class=\"touchchat-edit-attach\" @click=\"startScreenshot\">\n\t\t<div class=\"touchchat-edit-screenshot-icon\"></div>\n\t\t<div class=\"touchchat-edit-attach-tip touchchat-edit-voice-tip\">\n\t\t\t<p>截图</p>\n\t\t</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'\n\ninterface FileItem {\n\tfile: File\n\tisUploading: boolean\n\tuploadProgress: number\n\tuploadSuccess: boolean\n\tuploadError: boolean\n\tfileSize: string\n\tfileType: string\n\tname: string\n\tid: string\n\tbase64: string | null\n}\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 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: `${(file.size / 1024).toFixed(2)} KB`,\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}\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":["_createElementVNode","_createCommentVNode","_createElementBlock","_normalizeStyle"],"mappings":"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"}
1
+ {"version":3,"file":"Screenshot.vue2.mjs","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":["_createElementVNode","_createCommentVNode","_createElementBlock","_normalizeStyle"],"mappings":"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"}
@@ -64,12 +64,12 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
64
64
  }
65
65
  };
66
66
  const toggleRecording = async (flag) => {
67
- const colseVoice = () => {
67
+ const colserecord = () => {
68
68
  mediaRecorder == null ? void 0 : mediaRecorder.stop();
69
69
  isRecording.value = false;
70
70
  };
71
71
  if (flag) {
72
- colseVoice();
72
+ colserecord();
73
73
  return;
74
74
  }
75
75
  if (!isRecording.value) {
@@ -81,7 +81,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
81
81
  mediaStreamErrorMsg.value = "";
82
82
  }
83
83
  } else {
84
- colseVoice();
84
+ colserecord();
85
85
  }
86
86
  };
87
87
  const resetFile = () => {
@@ -94,7 +94,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
94
94
  return (_ctx, _cache) => {
95
95
  return openBlock(), createElementBlock("div", null, [
96
96
  createElementVNode("button", {
97
- class: "touchchat-edit-attach",
97
+ class: "touchchat-edit-record touchchat-edit-button",
98
98
  onClick: ($event) => toggleRecording()
99
99
  }, [
100
100
  !isRecording.value ? (openBlock(), createElementBlock("div", {
@@ -148,15 +148,13 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
148
148
  "stroke-linecap": "square"
149
149
  })
150
150
  ])),
151
- createElementVNode("div", { class: "touchchat-edit-attach-tip touchchat-edit-voice-tip" }, [
152
- createElementVNode(
153
- "p",
154
- null,
155
- toDisplayString(isRecording.value ? "\u505C\u6B62\u5F55\u97F3" : "\u5F55\u97F3"),
156
- 1
157
- /* TEXT */
158
- )
159
- ])
151
+ createElementVNode(
152
+ "div",
153
+ { class: "touchchat-edit-tooltip" },
154
+ toDisplayString(isRecording.value ? "\u505C\u6B62\u5F55\u97F3" : "\u5F55\u97F3"),
155
+ 1
156
+ /* TEXT */
157
+ )
160
158
  ], 8, ["onClick"])
161
159
  ]);
162
160
  };
@@ -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-attach\" @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-attach-tip touchchat-edit-voice-tip\">\n\t\t\t\t<p>{{ isRecording ? '停止录音' : '录音' }}</p>\n\t\t\t</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'\n\nconst emit = defineEmits(['upFileList'])\n\n// 定义文件项接口\ninterface FileItem {\n\tfile: File\n\tisUploading: boolean\n\tuploadProgress: number\n\tuploadSuccess: boolean\n\tuploadError: boolean\n\tfileSize: string\n\tfileType: string\n\tname: string\n\tid: string\n\tbase64: string | null\n}\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\tbase64: null\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 colseVoice = () => {\n\t\tmediaRecorder?.stop()\n\t\tisRecording.value = false\n\t}\n\tif (flag) {\n\t\tcolseVoice()\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\tcolseVoice()\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\n\r\nconst emit = defineEmits(['upFileList'])\r\n\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 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 = () => {\r\n\tconst blob = new Blob(chunks, { type: 'audio/mpeg' })\r\n\tconst audioFile = new File([blob], `recording_${Date.now()}.mp3`, { type: 'audio/mpeg' })\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\t// id: crypto.randomUUID().replace(/-/gi, ''),\r\n\t\tid: Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\r\n\t\tbase64: null\r\n\t}\r\n\temit('upFileList', [fileItem])\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// 初始化 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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"}
@@ -1,4 +1,4 @@
1
- import { defineComponent, inject, ref, watch, provide, computed, onMounted, openBlock, createElementBlock, createCommentVNode, createBlock, createElementVNode, unref, withKeys, normalizeClass, withCtx, toDisplayString, Fragment, createVNode, nextTick } from 'vue';
1
+ import { defineComponent, inject, ref, watch, provide, computed, onMounted, openBlock, createElementBlock, renderSlot, createCommentVNode, createBlock, createElementVNode, unref, withKeys, normalizeClass, withCtx, toDisplayString, Fragment, createVNode, nextTick } from 'vue';
2
2
  import MarkLayer from '../../component/MarkLayer.vue.mjs';
3
3
  import FileContent from '../../component/FileContent.vue.mjs';
4
4
  import UploadView from '../../component/UploadView.vue.mjs';
@@ -317,6 +317,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
317
317
  return (_ctx, _cache) => {
318
318
  var _a;
319
319
  return openBlock(), createElementBlock("div", { class: "touchchat-edit" }, [
320
+ renderSlot(_ctx.$slots, "editTop"),
320
321
  createCommentVNode(' :file-progress="fileProgress" '),
321
322
  fileList.value.length > 0 ? (openBlock(), createBlock(FileContent, {
322
323
  key: 0,
@@ -356,11 +357,11 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
356
357
  "button",
357
358
  {
358
359
  key: 0,
359
- class: normalizeClass(["touchchat-edit-attach", { "is-dis": __props.isChating }])
360
+ class: normalizeClass(["touchchat-edit-attach touchchat-edit-button", { "is-dis": __props.isChating }])
360
361
  },
361
362
  [
362
363
  createElementVNode("div", { class: "touchchat-edit-attach-icon" }),
363
- createElementVNode("div", { class: "touchchat-edit-attach-tip" }, [
364
+ createElementVNode("div", { class: "touchchat-edit-tooltip align-left" }, [
364
365
  createElementVNode("p", null, "\u6587\u4EF6\u6570\u91CF\uFF1A\u6700\u591A10\u4E2A"),
365
366
  createElementVNode(
366
367
  "p",
@@ -380,13 +381,11 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
380
381
  }, 8, ["file-list"])) : createCommentVNode("v-if", true),
381
382
  unref(clearAble) ? (openBlock(), createElementBlock("button", {
382
383
  key: 1,
383
- class: "touchchat-edit-attach",
384
+ class: "touchchat-edit-delete touchchat-edit-button",
384
385
  onClick: handleClearClick
385
386
  }, [
386
387
  createElementVNode("div", { class: "touchchat-edit-delete-icon" }),
387
- createElementVNode("div", { class: "touchchat-edit-attach-tip touchchat-edit-voice-tip" }, [
388
- createElementVNode("p", null, "\u6E05\u7A7A\u6587\u672C")
389
- ])
388
+ createElementVNode("div", { class: "touchchat-edit-tooltip" }, "\u6E05\u7A7A\u6587\u672C")
390
389
  ])) : createCommentVNode("v-if", true),
391
390
  createCommentVNode(" {{ finallyModules.length }} "),
392
391
  finallyModules.value.length > 1 ? (openBlock(), createBlock(ModuleSelect, {
@@ -436,6 +435,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
436
435
  512
437
436
  /* NEED_PATCH */
438
437
  )) : createCommentVNode("v-if", true),
438
+ renderSlot(_ctx.$slots, "editFn"),
439
439
  createCommentVNode(" \u53D1\u9001\u6309\u94AE "),
440
440
  !__props.isChating ? (openBlock(), createElementBlock("button", {
441
441
  key: 3,
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInput.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/ChatInput.vue"],"sourcesContent":["<template>\n\t<div class=\"touchchat-edit\">\n\t\t<!-- :file-progress=\"fileProgress\" -->\n\t\t<FileContent v-if=\"fileList.length > 0\" :file-list=\"fileList\" :has-colse=\"true\" type=\"ChatInput\" @colse=\"handleColse\" />\n\t\t<div class=\"touchchat-edit-input\">\n\t\t\t<!-- @keydown.enter.prevent -->\n\t\t\t<textarea :value=\"inputValue\" :placeholder=\"placeholder ?? '请输入...'\" @paste=\"handlePaste\" @input=\"handleInputChange\" @keydown.enter=\"handleSend\"> </textarea>\n\t\t</div>\n\n\t\t<!-- 按钮与开关容器 -->\n\t\t<div :class=\"thinkAble ? 'touchchat-edit-submit is-thinkable' : 'touchchat-edit-submit'\">\n\t\t\t<div class=\"touchchat-edit-submit-left\">\n\t\t\t\t<!-- 附件 @click=\"showMarkLaryer = true\" @progress-fn=\"progressFn\" -->\n\t\t\t\t<upload-view v-if=\"uploadAble\" ref=\"uploadViewRef\" :file-list=\"fileList\" @upload-file=\"uploadFile\">\n\t\t\t\t\t<button v-if=\"uploadAble\" class=\"touchchat-edit-attach\" :class=\"{ 'is-dis': isChating }\">\n\t\t\t\t\t\t<div class=\"touchchat-edit-attach-icon\"></div>\n\t\t\t\t\t\t<div class=\"touchchat-edit-attach-tip\">\n\t\t\t\t\t\t\t<p>文件数量:最多10个</p>\n\t\t\t\t\t\t\t<p>文件类型:{{ allowedTypes.join('、') || 'pdf,txt,csv,docx,xlsx,xls,pptx,ppt,md,mobi,epub,png,jpeg,jpg' }}</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t</upload-view>\n\n\t\t\t\t<button v-if=\"clearAble\" class=\"touchchat-edit-attach\" @click=\"handleClearClick\">\n\t\t\t\t\t<div class=\"touchchat-edit-delete-icon\"></div>\n\t\t\t\t\t<div class=\"touchchat-edit-attach-tip touchchat-edit-voice-tip\">\n\t\t\t\t\t\t<p>清空文本</p>\n\t\t\t\t\t</div>\n\t\t\t\t</button>\n\t\t\t\t<!-- {{ finallyModules.length }} -->\n\t\t\t\t<ModuleSelect v-if=\"finallyModules.length > 1\" v-model=\"selectVal\" :modules=\"finallyModules\" />\n\n\t\t\t\t<!-- 深度思考开关 - 修改为按钮样式 -->\n\t\t\t\t<button v-if=\"thinkAble\" class=\"touchchat-edit-think\" :class=\"{ 'is-on': enableDeepThinking, 'is-dis': isChating }\" @click=\"handleDeepThinkingClick\">\n\t\t\t\t\t<div class=\"touchchat-edit-think-icon\"></div>\n\t\t\t\t\t<div class=\"touchchat-edit-think-text\">深度思考</div>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div class=\"touchchat-edit-submit-right\">\n\t\t\t\t<!-- 截图 -->\n\t\t\t\t<screenshot v-if=\"screenAble\" @up-file-list=\"upFileList\"></screenshot>\n\t\t\t\t<!-- 实时语音 -->\n\t\t\t\t<realtime-voice v-if=\"realtimeVoiceAble\" @start-realtime-voice=\"startRealtimeVoice\" @transcription=\"transcription\"></realtime-voice>\n\t\t\t\t<!-- 语音 -->\n\t\t\t\t<voice v-if=\"voiceAble\" ref=\"voiceRef\" @up-file-list=\"upFileList\"></voice>\n\t\t\t\t<!-- 发送按钮 -->\n\t\t\t\t<button v-if=\"!isChating\" class=\"touchchat-edit-send\" :disabled=\"!inputValue.trim() && !fileList.length\" @click=\"handleSend\">\n\t\t\t\t\t<div class=\"touchchat-edit-send-icon\"></div>\n\t\t\t\t</button>\n\n\t\t\t\t<!-- 停止按钮 -->\n\t\t\t\t<button v-else class=\"touchchat-edit-stop\" @click=\"handleStop\">\n\t\t\t\t\t<div class=\"touchchat-edit-stop-icon\"></div>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<MarkLayer :show-mark-laryer=\"showMarkLaryer\" @colse-mark-layer=\"showMarkLaryer = false\" />\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\n// todo 要实现默认选中第一个模块\nimport { ref, inject, provide, nextTick, computed, watch, onMounted } from 'vue'\nimport MarkLayer from '../../component/MarkLayer.vue'\nimport FileContent from '../../component/FileContent.vue'\nimport UploadView from '../../component/UploadView.vue'\nimport Screenshot from '../../component/Screenshot.vue'\nimport Voice from '../../component/VoiceView.vue'\nimport RealtimeVoice from '../../component/RealtimeVoice.vue'\nimport ModuleSelect from '../../component/ModuleSelect.vue'\nimport { showToast } from '../../utils/tools'\n\ninterface FileItem {\n\tfile: File\n\tisUploading: boolean\n\tuploadProgress: number\n\tuploadSuccess: boolean\n\tuploadError: boolean\n\tfileSize: string\n\tfileType: string\n\tname: string\n\tid: string\n\tbase64: string | null\n}\n\n// 定义 body 返回值的类型\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}\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\tinputValue: string\n\tisChating: boolean\n\tenableDeepThinking?: boolean\n}>()\n\nconst placeholder = inject('placeholder', '请输入...')\nconst layout = inject<string>('layout', 'side, think, upload, chain, screen,realtime')\nconst modules = inject<(string | ModuleItem)[]>('modules', [])\nconst iModules = ref(modules)\nwatch(\n\t() => modules,\n\tnewVal => {\n\t\tiModules.value = newVal\n\t\tconsole.log('modules === ChatInput.vue === 128', newVal)\n\t}\n\t// { immediate: true }\n)\n\nconst allowedTypes = inject<string[]>('allowedTypes', [])\nprovide('uploadFile', (index: number, type?: string) => {\n\tif (uploadViewRef.value) {\n\t\tuploadViewRef.value.uploadFile(index, type)\n\t}\n})\nconst thinkAble = layout.includes('think')\nconst clearAble = layout.includes('clear')\nconst uploadAble = layout.includes('upload')\nconst screenAble = layout.includes('screen')\nconst voiceAble = layout.includes('voice')\nconst realtimeVoiceAble = layout.includes('realtime')\nconst showMarkLaryer = ref<boolean>(false)\nconst fileList = ref<FileItem[]>([])\n// const fileData = ref<FileItem[]>([])\nconst optionalModules = ref<ModuleItem[]>([\n\t{\n\t\tname: 'deepseek-v3',\n\t\tconfig: {\n\t\t\taction: 'https://api.apiyi.com/v1/chat/completions',\n\t\t\theaders: () => ({\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: 'Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd'\n\t\t\t}),\n\t\t\tbody: () => ({\n\t\t\t\tmodel: 'deepseek-v3',\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\trole: 'user',\n\t\t\t\t\t\t// content: props.inputValue // 使用传入的用户内容参数\n\t\t\t\t\t\tcontent: ''\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tstream: true\n\t\t\t}),\n\t\t\trespoKey: () => ({\n\t\t\t\tcategory: 'category',\n\t\t\t\tcontentCategory: 'task_stream_content',\n\t\t\t\tcontent: 'content',\n\t\t\t\tall: 'message',\n\t\t\t\tallCategory: 'answer'\n\t\t\t})\n\t\t}\n\t}\n])\nconst uploadViewRef = ref<InstanceType<typeof UploadView>>()\nconst selectVal = ref('')\nconst selectInfo = ref<ModuleItem>({} as ModuleItem)\nconst voiceRef = ref<InstanceType<typeof Voice>>()\n// const scripts = inject<any[]>('scripts', [])\n\nconst modelChange = inject<(item: ModuleItem, index: number) => void>('modelChange', () => {\n\tconsole.warn('未提供modelChange函数')\n})\n\nconst emits = defineEmits<{\n\t(e: 'send', val: string, list: FileItem[]): void\n\t(e: 'stop'): void\n\t(e: 'update:enableDeepThinking', value: boolean): void\n\t(e: 'update:inputValue', value: string): void // 添加inputValue更新事件\n\t(e: 'moduleInfo', info: ModuleItem): void\n}>()\n\nwatch(\n\t() => selectVal.value,\n\t() => {\n\t\tconsole.log('selectVal.value === ChatInput.vue === 198', selectVal.value)\n\t\tif (finallyModules.value.length > 0) {\n\t\t\tselectInfo.value = finallyModules.value.find((item: any) => item.name === selectVal.value)\n\t\t\tif (selectInfo.value) {\n\t\t\t\temits('moduleInfo', selectInfo.value)\n\t\t\t\tmodelChange(selectInfo.value, finallyModules.value.indexOf(selectInfo.value))\n\t\t\t}\n\t\t}\n\t},\n\t{ deep: true }\n)\n\nwatch(\n\t() => props.enableDeepThinking,\n\t() => {\n\t\tupdateSelectInfo()\n\t},\n\t{ deep: true }\n)\n\nwatch(\n\t() => props.inputValue,\n\t() => {\n\t\tupdateSelectInfo()\n\t},\n\t{ deep: true }\n)\n\nconst finallyModules = computed(() => {\n\t// console.log('modules === ChatInput.vue === 226', modules, iModules.value)\n\tif (!iModules.value.length) {\n\t\treturn optionalModules.value\n\t}\n\treturn iModules.value.flatMap((module: any) => {\n\t\tif (typeof module === 'string') {\n\t\t\t// 若 module 是字符串,在 optionalModules 中查找 name 匹配的项\n\t\t\tconst matchedModule = optionalModules.value.find((optModule: any) => optModule.name === module)\n\t\t\tif (matchedModule) {\n\t\t\t\t// 对匹配到的模块也更新 content 值\n\t\t\t\tconst updatedModule = { ...matchedModule }\n\t\t\t\tconst body = updatedModule.config.body()\n\t\t\t\tif (thinkAble) {\n\t\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\n\t\t\t\t}\n\t\t\t\tupdatedModule.config.body = () => body\n\t\t\t\treturn [updatedModule]\n\t\t\t}\n\t\t\treturn []\n\t\t} else {\n\t\t\tconst body = module.config.body()\n\t\t\tif (thinkAble) {\n\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\n\t\t\t}\n\t\t\t// 重新定义 body 方法,返回更新后的 body\n\t\t\tmodule.config.body = () => body\n\t\t\treturn [module]\n\t\t}\n\t})\n})\n\nconst updateSelectInfo = () => {\n\tif (!selectInfo.value.name) {\n\t\tselectInfo.value = finallyModules.value[0]\n\t\tselectVal.value = selectInfo.value.name\n\t}\n\tconst body = (selectInfo.value as ModuleItem).config.body()\n\tif (body.messages && body.messages.length > 0 && body.messages[0].content) {\n\t\tbody.messages[0].content = props.inputValue\n\t} else {\n\t\tbody.messages = [{ role: 'user', content: props.inputValue }]\n\t}\n\t;(selectInfo.value as ModuleItem).config.body = () => body\n\tif (finallyModules.value.length > 0 && selectInfo.value) {\n\t\tconst body = selectInfo.value.config.body()\n\t\tif (thinkAble && body.model) {\n\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\n\t\t}\n\t\tselectInfo.value.config.body = () => body\n\t}\n}\n\nconst upFileList = (list: FileItem[]) => {\n\tfileList.value.push(...list)\n\tnextTick(() => {\n\t\tif (uploadViewRef.value) {\n\t\t\t// 只对最新复制的图片进行加载\n\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t}\n\t})\n}\n\nconst handlePaste = (event: any, type?: string) => {\n\t// event.preventDefault();\n\tif (event.clipboardData) {\n\t\tconst clipboardData = event.clipboardData || window.Clipboard\n\t\tconst items = clipboardData.items\n\n\t\tlet isImage = false\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tif (items[i].type.indexOf('image/') !== -1) {\n\t\t\t\tisImage = true\n\t\t\t\t// 获取图片文件\n\t\t\t\tconst blob = items[i].getAsFile()\n\t\t\t\tif (blob) {\n\t\t\t\t\tconst reader = new FileReader()\n\t\t\t\t\treader.onload = e => {\n\t\t\t\t\t\tconst base64 = e.target?.result as string\n\t\t\t\t\t\t// 生成图片属性对象\n\t\t\t\t\t\tconst imageInfo = {\n\t\t\t\t\t\t\tfile: blob,\n\t\t\t\t\t\t\tisUploading: false,\n\t\t\t\t\t\t\tuploadProgress: 0,\n\t\t\t\t\t\t\tuploadSuccess: false,\n\t\t\t\t\t\t\tuploadError: false,\n\t\t\t\t\t\t\tfileSize: `${(blob.size / 1024).toFixed(2)} KB`,\n\t\t\t\t\t\t\tfileType: blob.type,\n\t\t\t\t\t\t\tname: `pasted_image_${Date.now()}`,\n\t\t\t\t\t\t\tid: Date.now().toString(),\n\t\t\t\t\t\t\tbase64\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfileList.value.push(imageInfo)\n\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\tif (uploadViewRef.value) {\n\t\t\t\t\t\t\t\t// 只对最新复制的图片进行加载\n\t\t\t\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treader.readAsDataURL(blob)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (isImage) {\n\t\t\tconsole.log('检测到粘贴的是图片')\n\t\t} else {\n\t\t\tconsole.log('粘贴的不是图片')\n\t\t}\n\t} else {\n\t\tif (type === 'copy') {\n\t\t\tfileList.value = event\n\t\t\tnextTick(() => {\n\t\t\t\tif (uploadViewRef.value) {\n\t\t\t\t\t// 只对最新复制的图片进行加载\n\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\tfileList.value.push(...event)\n\t\tnextTick(() => {\n\t\t\tif (uploadViewRef.value) {\n\t\t\t\t// 只对最新复制的图片进行加载\n\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\n\t\t\t}\n\t\t})\n\t}\n}\n\nconst openMarkLayer = () => {\n\tshowMarkLaryer.value = true\n}\n\nconst colseMarkLayer = () => {\n\tshowMarkLaryer.value = false\n}\n\nconst handleColse = (id: string) => {\n\tconst index = fileList.value.findIndex((item: any) => item.id === id)\n\tif (index !== -1) {\n\t\tfileList.value.splice(index, 1)\n\t}\n}\n\nconst startRealtimeVoice = () => {\n\tif (voiceRef.value) {\n\t\tvoiceRef.value.toggleRecording(true)\n\t}\n}\n\nconst transcription = (text: string) => {\n\temits('update:inputValue', text)\n}\n\nconst handleClearClick = () => {\n\temits('update:inputValue', '')\n}\n\n// 处理输入框变化\nconst handleInputChange = (e: Event) => {\n\tconst value = (e.target as HTMLTextAreaElement).value\n\temits('update:inputValue', value)\n}\n\n// 处理深度思考按钮点击\nconst handleDeepThinkingClick = () => {\n\t// enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3'\n\temits('update:enableDeepThinking', !props.enableDeepThinking)\n}\n\nconst uploadFile = (file: FileItem[]) => {\n\tif (file.length > 0) {\n\t\tfileList.value = file\n\t}\n}\n\nconst handleSend = (e?: Event) => {\n\t// 检测是否为 Shift+Enter,如果是则不发送,执行默认换行行为\n\tif (e instanceof KeyboardEvent && e.shiftKey) {\n\t\treturn\n\t}\n\t// 普通 Enter 时阻止默认行为,执行发送逻辑\n\tif (e instanceof KeyboardEvent) {\n\t\te.preventDefault()\n\t}\n\t// if (!scripts.length && fileList.value.length > 0) {\n\t// \tshowToast('暂不支持文件发送')\n\t// \treturn\n\t// }\n\tif (!props.inputValue.trim() && !fileList.value.length) {\n\t\tshowToast('请输入内容')\n\t\treturn\n\t}\n\tlet uploadError = false\n\tif (fileList.value.length > 0) {\n\t\tfileList.value.forEach((item: any) => {\n\t\t\tif (item.uploadError) {\n\t\t\t\tuploadError = true\n\t\t\t}\n\t\t})\n\t}\n\tif (uploadError) {\n\t\tshowToast('上传失败,请重试')\n\t\treturn\n\t}\n\tif (fileList.value.length > 10) {\n\t\tshowToast('文件数量不能超过10个')\n\t\treturn\n\t}\n\temits('send', props.inputValue, fileList.value)\n\tnextTick(() => {\n\t\tfileList.value = []\n\t\tif (uploadViewRef.value) {\n\t\t\tuploadViewRef.value.resetFile()\n\t\t}\n\t\tif (voiceRef.value) {\n\t\t\tvoiceRef.value.resetFile()\n\t\t}\n\t})\n}\n\nconst itemUploadFile = (index: number, type: string) => {\n\tif (uploadViewRef.value) {\n\t\tuploadViewRef.value.uploadFile(index, type)\n\t}\n}\nconst handleStop = () => emits('stop')\nonMounted(() => {\n\tconsole.log('onMounted')\n\t// if (finallyModules.value.length > 0) {\n\t// \tselectVal.value = finallyModules.value[0].name\n\t// \tselectInfo.value = finallyModules.value[0]\n\t// \tif (selectInfo.value) {\n\t// \t\temits('moduleInfo', selectInfo.value)\n\t// \t}\n\t// }\n})\ndefineExpose({\n\thandlePaste,\n\topenMarkLayer,\n\tcolseMarkLayer,\n\titemUploadFile\n})\n</script>\n"],"names":["body","_createElementBlock","_createCommentVNode","_createBlock","_createElementVNode","_unref","_normalizeClass","_toDisplayString","_Fragment","_createVNode"],"mappings":"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"}
1
+ {"version":3,"file":"ChatInput.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/ChatInput.vue"],"sourcesContent":["<template>\r\n\t<div class=\"touchchat-edit\">\r\n\t\t<slot name=\"editTop\"></slot>\r\n\t\t<!-- :file-progress=\"fileProgress\" -->\r\n\t\t<FileContent v-if=\"fileList.length > 0\" :file-list=\"fileList\" :has-colse=\"true\" type=\"ChatInput\" @colse=\"handleColse\" />\r\n\t\t<div class=\"touchchat-edit-input\">\r\n\t\t\t<!-- @keydown.enter.prevent -->\r\n\t\t\t<textarea :value=\"inputValue\" :placeholder=\"placeholder ?? '请输入...'\" @paste=\"handlePaste\" @input=\"handleInputChange\" @keydown.enter=\"handleSend\"> </textarea>\r\n\t\t</div>\r\n\r\n\t\t<!-- 按钮与开关容器 -->\r\n\t\t<div :class=\"thinkAble ? 'touchchat-edit-submit is-thinkable' : 'touchchat-edit-submit'\">\r\n\t\t\t<div class=\"touchchat-edit-submit-left\">\r\n\t\t\t\t<!-- 附件 @click=\"showMarkLaryer = true\" @progress-fn=\"progressFn\" -->\r\n\t\t\t\t<upload-view v-if=\"uploadAble\" ref=\"uploadViewRef\" :file-list=\"fileList\" @upload-file=\"uploadFile\">\r\n\t\t\t\t\t<button v-if=\"uploadAble\" class=\"touchchat-edit-attach touchchat-edit-button\" :class=\"{ 'is-dis': isChating }\">\r\n\t\t\t\t\t\t<div class=\"touchchat-edit-attach-icon\"></div>\r\n\t\t\t\t\t\t<div class=\"touchchat-edit-tooltip align-left\">\r\n\t\t\t\t\t\t\t<p>文件数量:最多10个</p>\r\n\t\t\t\t\t\t\t<p>文件类型:{{ allowedTypes.join('、') || 'pdf,txt,csv,docx,xlsx,xls,pptx,ppt,md,mobi,epub,png,jpeg,jpg' }}</p>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</upload-view>\r\n\r\n\t\t\t\t<button v-if=\"clearAble\" class=\"touchchat-edit-delete touchchat-edit-button\" @click=\"handleClearClick\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-delete-icon\"></div>\r\n\t\t\t\t\t<div class=\"touchchat-edit-tooltip\">清空文本</div>\r\n\t\t\t\t</button>\r\n\t\t\t\t<!-- {{ finallyModules.length }} -->\r\n\t\t\t\t<ModuleSelect v-if=\"finallyModules.length > 1\" v-model=\"selectVal\" :modules=\"finallyModules\" />\r\n\r\n\t\t\t\t<!-- 深度思考开关 - 修改为按钮样式 -->\r\n\t\t\t\t<button v-if=\"thinkAble\" class=\"touchchat-edit-think\" :class=\"{ 'is-on': enableDeepThinking, 'is-dis': isChating }\" @click=\"handleDeepThinkingClick\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-think-icon\"></div>\r\n\t\t\t\t\t<div class=\"touchchat-edit-think-text\">深度思考</div>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"touchchat-edit-submit-right\">\r\n\t\t\t\t<!-- 截图 -->\r\n\t\t\t\t<screenshot v-if=\"screenAble\" @up-file-list=\"upFileList\"></screenshot>\r\n\t\t\t\t<!-- 实时语音 -->\r\n\t\t\t\t<realtime-voice v-if=\"realtimeVoiceAble\" @start-realtime-voice=\"startRealtimeVoice\" @transcription=\"transcription\"></realtime-voice>\r\n\t\t\t\t<!-- 语音 -->\r\n\t\t\t\t<voice v-if=\"voiceAble\" ref=\"voiceRef\" @up-file-list=\"upFileList\"></voice>\r\n\t\t\t\t<slot name=\"editFn\"></slot>\r\n\t\t\t\t<!-- 发送按钮 -->\r\n\t\t\t\t<button v-if=\"!isChating\" class=\"touchchat-edit-send\" :disabled=\"!inputValue.trim() && !fileList.length\" @click=\"handleSend\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-send-icon\"></div>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t\t<!-- 停止按钮 -->\r\n\t\t\t\t<button v-else class=\"touchchat-edit-stop\" @click=\"handleStop\">\r\n\t\t\t\t\t<div class=\"touchchat-edit-stop-icon\"></div>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<MarkLayer :show-mark-laryer=\"showMarkLaryer\" @colse-mark-layer=\"showMarkLaryer = false\" />\r\n\t</div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n// todo 要实现默认选中第一个模块\r\nimport { ref, inject, provide, nextTick, computed, watch, onMounted } from 'vue'\r\nimport MarkLayer from '../../component/MarkLayer.vue'\r\nimport FileContent from '../../component/FileContent.vue'\r\nimport UploadView from '../../component/UploadView.vue'\r\nimport Screenshot from '../../component/Screenshot.vue'\r\nimport Voice from '../../component/VoiceView.vue'\r\nimport RealtimeVoice from '../../component/RealtimeVoice.vue'\r\nimport ModuleSelect from '../../component/ModuleSelect.vue'\r\nimport { showToast } from '../../utils/tools'\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// 定义 body 返回值的类型\r\ninterface BodyConfig {\r\n\tmodel: string\r\n\tmessages: Array<{\r\n\t\trole: string\r\n\t\tcontent: string\r\n\t}>\r\n\tstream: boolean\r\n}\r\n\r\n// 定义 respoKey 返回值的类型\r\ninterface RespoKeyConfig {\r\n\tcategory: string\r\n\tcontentCategory: string\r\n\tcontent: string\r\n\tall: string\r\n\tallCategory: string\r\n}\r\n\r\ninterface ModuleItem {\r\n\tname: string\r\n\tconfig: {\r\n\t\taction: string\r\n\t\theaders: () => object\r\n\t\tbody: () => BodyConfig // 修改为具体类型\r\n\t\trespoKey: () => RespoKeyConfig // 修改为具体类型\r\n\t}\r\n}\r\n\r\nconst props = defineProps<{\r\n\tinputValue: string\r\n\tisChating: boolean\r\n\tenableDeepThinking?: boolean\r\n}>()\r\n\r\nconst placeholder = inject('placeholder', '请输入...')\r\nconst layout = inject<string>('layout', 'side, think, upload, chain, screen,realtime')\r\nconst modules = inject<(string | ModuleItem)[]>('modules', [])\r\nconst iModules = ref(modules)\r\nwatch(\r\n\t() => modules,\r\n\tnewVal => {\r\n\t\tiModules.value = newVal\r\n\t\tconsole.log('modules === ChatInput.vue === 128', newVal)\r\n\t}\r\n\t// { immediate: true }\r\n)\r\n\r\nconst allowedTypes = inject<string[]>('allowedTypes', [])\r\nprovide('uploadFile', (index: number, type?: string) => {\r\n\tif (uploadViewRef.value) {\r\n\t\tuploadViewRef.value.uploadFile(index, type)\r\n\t}\r\n})\r\nconst thinkAble = layout.includes('think')\r\nconst clearAble = layout.includes('clear')\r\nconst uploadAble = layout.includes('upload')\r\nconst screenAble = layout.includes('screen')\r\nconst voiceAble = layout.includes('voice')\r\nconst realtimeVoiceAble = layout.includes('realtime')\r\nconst showMarkLaryer = ref<boolean>(false)\r\nconst fileList = ref<FileItem[]>([])\r\n// const fileData = ref<FileItem[]>([])\r\nconst optionalModules = ref<ModuleItem[]>([\r\n\t{\r\n\t\tname: 'deepseek-v3',\r\n\t\tconfig: {\r\n\t\t\taction: 'https://api.apiyi.com/v1/chat/completions',\r\n\t\t\theaders: () => ({\r\n\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\tAuthorization: 'Bearer sk-fe9MtODvds8wpzz05f3417Fe3e9641C1926e6fC588425dEd'\r\n\t\t\t}),\r\n\t\t\tbody: () => ({\r\n\t\t\t\tmodel: 'deepseek-v3',\r\n\t\t\t\tmessages: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\trole: 'user',\r\n\t\t\t\t\t\t// content: props.inputValue // 使用传入的用户内容参数\r\n\t\t\t\t\t\tcontent: ''\r\n\t\t\t\t\t}\r\n\t\t\t\t],\r\n\t\t\t\tstream: true\r\n\t\t\t}),\r\n\t\t\trespoKey: () => ({\r\n\t\t\t\tcategory: 'category',\r\n\t\t\t\tcontentCategory: 'task_stream_content',\r\n\t\t\t\tcontent: 'content',\r\n\t\t\t\tall: 'message',\r\n\t\t\t\tallCategory: 'answer'\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n])\r\nconst uploadViewRef = ref<InstanceType<typeof UploadView>>()\r\nconst selectVal = ref('')\r\nconst selectInfo = ref<ModuleItem>({} as ModuleItem)\r\nconst voiceRef = ref<InstanceType<typeof Voice>>()\r\n// const scripts = inject<any[]>('scripts', [])\r\n\r\nconst modelChange = inject<(item: ModuleItem, index: number) => void>('modelChange', () => {\r\n\tconsole.warn('未提供modelChange函数')\r\n})\r\n\r\nconst emits = defineEmits<{\r\n\t(e: 'send', val: string, list: FileItem[]): void\r\n\t(e: 'stop'): void\r\n\t(e: 'update:enableDeepThinking', value: boolean): void\r\n\t(e: 'update:inputValue', value: string): void // 添加inputValue更新事件\r\n\t(e: 'moduleInfo', info: ModuleItem): void\r\n}>()\r\n\r\nwatch(\r\n\t() => selectVal.value,\r\n\t() => {\r\n\t\tconsole.log('selectVal.value === ChatInput.vue === 198', selectVal.value)\r\n\t\tif (finallyModules.value.length > 0) {\r\n\t\t\tselectInfo.value = finallyModules.value.find((item: any) => item.name === selectVal.value)\r\n\t\t\tif (selectInfo.value) {\r\n\t\t\t\temits('moduleInfo', selectInfo.value)\r\n\t\t\t\tmodelChange(selectInfo.value, finallyModules.value.indexOf(selectInfo.value))\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t{ deep: true }\r\n)\r\n\r\nwatch(\r\n\t() => props.enableDeepThinking,\r\n\t() => {\r\n\t\tupdateSelectInfo()\r\n\t},\r\n\t{ deep: true }\r\n)\r\n\r\nwatch(\r\n\t() => props.inputValue,\r\n\t() => {\r\n\t\tupdateSelectInfo()\r\n\t},\r\n\t{ deep: true }\r\n)\r\n\r\nconst finallyModules = computed(() => {\r\n\t// console.log('modules === ChatInput.vue === 226', modules, iModules.value)\r\n\tif (!iModules.value.length) {\r\n\t\treturn optionalModules.value\r\n\t}\r\n\treturn iModules.value.flatMap((module: any) => {\r\n\t\tif (typeof module === 'string') {\r\n\t\t\t// 若 module 是字符串,在 optionalModules 中查找 name 匹配的项\r\n\t\t\tconst matchedModule = optionalModules.value.find((optModule: any) => optModule.name === module)\r\n\t\t\tif (matchedModule) {\r\n\t\t\t\t// 对匹配到的模块也更新 content 值\r\n\t\t\t\tconst updatedModule = { ...matchedModule }\r\n\t\t\t\tconst body = updatedModule.config.body()\r\n\t\t\t\tif (thinkAble) {\r\n\t\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\t\t\t\t}\r\n\t\t\t\tupdatedModule.config.body = () => body\r\n\t\t\t\treturn [updatedModule]\r\n\t\t\t}\r\n\t\t\treturn []\r\n\t\t} else {\r\n\t\t\tconst body = module.config.body()\r\n\t\t\tif (thinkAble) {\r\n\t\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\t\t\t}\r\n\t\t\t// 重新定义 body 方法,返回更新后的 body\r\n\t\t\tmodule.config.body = () => body\r\n\t\t\treturn [module]\r\n\t\t}\r\n\t})\r\n})\r\n\r\nconst updateSelectInfo = () => {\r\n\tif (!selectInfo.value.name) {\r\n\t\tselectInfo.value = finallyModules.value[0]\r\n\t\tselectVal.value = selectInfo.value.name\r\n\t}\r\n\tconst body = (selectInfo.value as ModuleItem).config.body()\r\n\tif (body.messages && body.messages.length > 0 && body.messages[0].content) {\r\n\t\tbody.messages[0].content = props.inputValue\r\n\t} else {\r\n\t\tbody.messages = [{ role: 'user', content: props.inputValue }]\r\n\t}\r\n\t;(selectInfo.value as ModuleItem).config.body = () => body\r\n\tif (finallyModules.value.length > 0 && selectInfo.value) {\r\n\t\tconst body = selectInfo.value.config.body()\r\n\t\tif (thinkAble && body.model) {\r\n\t\t\tbody.model = props.enableDeepThinking ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\t\t}\r\n\t\tselectInfo.value.config.body = () => body\r\n\t}\r\n}\r\n\r\nconst upFileList = (list: FileItem[]) => {\r\n\tfileList.value.push(...list)\r\n\tnextTick(() => {\r\n\t\tif (uploadViewRef.value) {\r\n\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t}\r\n\t})\r\n}\r\n\r\nconst handlePaste = (event: any, type?: string) => {\r\n\t// event.preventDefault();\r\n\tif (event.clipboardData) {\r\n\t\tconst clipboardData = event.clipboardData || window.Clipboard\r\n\t\tconst items = clipboardData.items\r\n\r\n\t\tlet isImage = false\r\n\t\tfor (let i = 0; i < items.length; i++) {\r\n\t\t\tif (items[i].type.indexOf('image/') !== -1) {\r\n\t\t\t\tisImage = true\r\n\t\t\t\t// 获取图片文件\r\n\t\t\t\tconst blob = items[i].getAsFile()\r\n\t\t\t\tif (blob) {\r\n\t\t\t\t\tconst reader = new FileReader()\r\n\t\t\t\t\treader.onload = e => {\r\n\t\t\t\t\t\tconst base64 = e.target?.result as string\r\n\t\t\t\t\t\t// 生成图片属性对象\r\n\t\t\t\t\t\tconst imageInfo = {\r\n\t\t\t\t\t\t\tfile: blob,\r\n\t\t\t\t\t\t\tisUploading: false,\r\n\t\t\t\t\t\t\tuploadProgress: 0,\r\n\t\t\t\t\t\t\tuploadSuccess: false,\r\n\t\t\t\t\t\t\tuploadError: false,\r\n\t\t\t\t\t\t\tfileSize: `${(blob.size / 1024).toFixed(2)} KB`,\r\n\t\t\t\t\t\t\tfileType: blob.type,\r\n\t\t\t\t\t\t\tname: `pasted_image_${Date.now()}`,\r\n\t\t\t\t\t\t\tid: Date.now().toString(),\r\n\t\t\t\t\t\t\tbase64\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfileList.value.push(imageInfo)\r\n\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\tif (uploadViewRef.value) {\r\n\t\t\t\t\t\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\t\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\treader.readAsDataURL(blob)\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isImage) {\r\n\t\t\tconsole.log('检测到粘贴的是图片')\r\n\t\t} else {\r\n\t\t\tconsole.log('粘贴的不是图片')\r\n\t\t}\r\n\t} else {\r\n\t\tif (type === 'copy') {\r\n\t\t\tfileList.value = event\r\n\t\t\tnextTick(() => {\r\n\t\t\t\tif (uploadViewRef.value) {\r\n\t\t\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\t\tfileList.value.push(...event)\r\n\t\tnextTick(() => {\r\n\t\t\tif (uploadViewRef.value) {\r\n\t\t\t\t// 只对最新复制的图片进行加载\r\n\t\t\t\tuploadViewRef.value.uploadFile(fileList.value.length - 1)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n}\r\n\r\nconst openMarkLayer = () => {\r\n\tshowMarkLaryer.value = true\r\n}\r\n\r\nconst colseMarkLayer = () => {\r\n\tshowMarkLaryer.value = false\r\n}\r\n\r\nconst handleColse = (id: string) => {\r\n\tconst index = fileList.value.findIndex((item: any) => item.id === id)\r\n\tif (index !== -1) {\r\n\t\tfileList.value.splice(index, 1)\r\n\t}\r\n}\r\n\r\nconst startRealtimeVoice = () => {\r\n\tif (voiceRef.value) {\r\n\t\tvoiceRef.value.toggleRecording(true)\r\n\t}\r\n}\r\n\r\nconst transcription = (text: string) => {\r\n\temits('update:inputValue', text)\r\n}\r\n\r\nconst handleClearClick = () => {\r\n\temits('update:inputValue', '')\r\n}\r\n\r\n// 处理输入框变化\r\nconst handleInputChange = (e: Event) => {\r\n\tconst value = (e.target as HTMLTextAreaElement).value\r\n\temits('update:inputValue', value)\r\n}\r\n\r\n// 处理深度思考按钮点击\r\nconst handleDeepThinkingClick = () => {\r\n\t// enableDeepThinking.value ? 'deepseek-reasoner' : 'deepseek-v3'\r\n\temits('update:enableDeepThinking', !props.enableDeepThinking)\r\n}\r\n\r\nconst uploadFile = (file: FileItem[]) => {\r\n\tif (file.length > 0) {\r\n\t\tfileList.value = file\r\n\t}\r\n}\r\n\r\nconst handleSend = (e?: Event) => {\r\n\t// 检测是否为 Shift+Enter,如果是则不发送,执行默认换行行为\r\n\tif (e instanceof KeyboardEvent && e.shiftKey) {\r\n\t\treturn\r\n\t}\r\n\t// 普通 Enter 时阻止默认行为,执行发送逻辑\r\n\tif (e instanceof KeyboardEvent) {\r\n\t\te.preventDefault()\r\n\t}\r\n\t// if (!scripts.length && fileList.value.length > 0) {\r\n\t// \tshowToast('暂不支持文件发送')\r\n\t// \treturn\r\n\t// }\r\n\tif (!props.inputValue.trim() && !fileList.value.length) {\r\n\t\tshowToast('请输入内容')\r\n\t\treturn\r\n\t}\r\n\tlet uploadError = false\r\n\tif (fileList.value.length > 0) {\r\n\t\tfileList.value.forEach((item: any) => {\r\n\t\t\tif (item.uploadError) {\r\n\t\t\t\tuploadError = true\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\tif (uploadError) {\r\n\t\tshowToast('上传失败,请重试')\r\n\t\treturn\r\n\t}\r\n\tif (fileList.value.length > 10) {\r\n\t\tshowToast('文件数量不能超过10个')\r\n\t\treturn\r\n\t}\r\n\temits('send', props.inputValue, fileList.value)\r\n\tnextTick(() => {\r\n\t\tfileList.value = []\r\n\t\tif (uploadViewRef.value) {\r\n\t\t\tuploadViewRef.value.resetFile()\r\n\t\t}\r\n\t\tif (voiceRef.value) {\r\n\t\t\tvoiceRef.value.resetFile()\r\n\t\t}\r\n\t})\r\n}\r\n\r\nconst itemUploadFile = (index: number, type: string) => {\r\n\tif (uploadViewRef.value) {\r\n\t\tuploadViewRef.value.uploadFile(index, type)\r\n\t}\r\n}\r\nconst handleStop = () => emits('stop')\r\nonMounted(() => {\r\n\tconsole.log('onMounted')\r\n\t// if (finallyModules.value.length > 0) {\r\n\t// \tselectVal.value = finallyModules.value[0].name\r\n\t// \tselectInfo.value = finallyModules.value[0]\r\n\t// \tif (selectInfo.value) {\r\n\t// \t\temits('moduleInfo', selectInfo.value)\r\n\t// \t}\r\n\t// }\r\n})\r\ndefineExpose({\r\n\thandlePaste,\r\n\topenMarkLayer,\r\n\tcolseMarkLayer,\r\n\titemUploadFile\r\n})\r\n</script>\r\n"],"names":["body","_createElementBlock","_renderSlot","_createCommentVNode","_createBlock","_createElementVNode","_unref","_normalizeClass","_toDisplayString","_Fragment","_createVNode"],"mappings":"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"}