@touchvue/chat 1.0.0-beta.26 → 1.0.0-beta.28
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.mjs +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +47 -145
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/Screenshot.vue2.mjs +1 -23
- package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +4 -29
- package/es/packages/components/touchchat/component/VoiceView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +20 -5
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/lib/package.json.js +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +47 -145
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/Screenshot.vue2.js +1 -23
- package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/VoiceView.vue2.js +4 -29
- package/lib/packages/components/touchchat/component/VoiceView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +19 -4
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/package.json +1 -1
- package/theme/components/index.css +70 -4
- package/theme/font/iconfont.woff +0 -0
- package/theme/font/iconfont.woff2 +0 -0
- package/theme/index.css +70 -4
- package/theme/skin/default.css +70 -4
package/es/package.json.mjs
CHANGED
|
@@ -69,165 +69,67 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
69
69
|
onClick: startRealtimeVoice
|
|
70
70
|
}, [
|
|
71
71
|
createCommentVNode(" \u672A\u5B9E\u65F6\u8BED\u97F3\u524D "),
|
|
72
|
-
!dialogVisible.value ? (openBlock(), createElementBlock("
|
|
72
|
+
!dialogVisible.value ? (openBlock(), createElementBlock("div", {
|
|
73
73
|
key: 0,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
height: "18",
|
|
77
|
-
viewBox: "0 0 24 24",
|
|
78
|
-
fill: "none",
|
|
79
|
-
stroke: "#333",
|
|
80
|
-
"stroke-width": "2",
|
|
81
|
-
"stroke-linecap": "round",
|
|
82
|
-
"stroke-linejoin": "round"
|
|
83
|
-
}, [
|
|
84
|
-
createCommentVNode(" \u9EA6\u514B\u98CE\u4E3B\u4F53 "),
|
|
85
|
-
createElementVNode("path", { d: "M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" }),
|
|
86
|
-
createElementVNode("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
|
|
87
|
-
createElementVNode("line", {
|
|
88
|
-
x1: "12",
|
|
89
|
-
y1: "19",
|
|
90
|
-
x2: "12",
|
|
91
|
-
y2: "23"
|
|
92
|
-
}),
|
|
93
|
-
createElementVNode("line", {
|
|
94
|
-
x1: "8",
|
|
95
|
-
y1: "23",
|
|
96
|
-
x2: "16",
|
|
97
|
-
y2: "23"
|
|
98
|
-
}),
|
|
99
|
-
createCommentVNode(" \u5B9E\u65F6\u8BED\u97F3\u6CE2\u5F62\uFF08\u52A8\u6001\u611F\u4F53\u73B0\uFF09 "),
|
|
100
|
-
createElementVNode("path", {
|
|
101
|
-
d: "M22 16v-2a2 2 0 0 0-2-2",
|
|
102
|
-
opacity: "0.8"
|
|
103
|
-
}),
|
|
104
|
-
createElementVNode("path", {
|
|
105
|
-
d: "M6 16V8a2 2 0 0 1 2-2",
|
|
106
|
-
opacity: "0.8"
|
|
107
|
-
}),
|
|
108
|
-
createElementVNode("rect", {
|
|
109
|
-
x: "20",
|
|
110
|
-
y: "12",
|
|
111
|
-
width: "1",
|
|
112
|
-
height: "4",
|
|
113
|
-
rx: "0.5",
|
|
114
|
-
opacity: "0.9"
|
|
115
|
-
}),
|
|
116
|
-
createElementVNode("rect", {
|
|
117
|
-
x: "4",
|
|
118
|
-
y: "10",
|
|
119
|
-
width: "1",
|
|
120
|
-
height: "6",
|
|
121
|
-
rx: "0.5",
|
|
122
|
-
opacity: "0.9"
|
|
123
|
-
})
|
|
124
|
-
])) : (openBlock(), createElementBlock(
|
|
74
|
+
class: "touchchat-edit-voice-icon"
|
|
75
|
+
})) : (openBlock(), createElementBlock(
|
|
125
76
|
Fragment,
|
|
126
77
|
{ key: 1 },
|
|
127
78
|
[
|
|
128
79
|
createCommentVNode(" \u5B9E\u65F6\u8BED\u97F3\u4E2D "),
|
|
129
80
|
(openBlock(), createElementBlock("svg", {
|
|
130
81
|
xmlns: "http://www.w3.org/2000/svg",
|
|
131
|
-
width: "
|
|
132
|
-
height: "
|
|
133
|
-
viewBox: "0 0
|
|
134
|
-
fill: "
|
|
135
|
-
stroke: "#fff",
|
|
136
|
-
"stroke-width": "1",
|
|
137
|
-
"stroke-linecap": "round"
|
|
82
|
+
width: "20",
|
|
83
|
+
height: "20",
|
|
84
|
+
viewBox: "0 0 20 20",
|
|
85
|
+
fill: "none"
|
|
138
86
|
}, [
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
height: "12",
|
|
179
|
-
rx: "1",
|
|
180
|
-
opacity: "0.9"
|
|
181
|
-
}),
|
|
182
|
-
createElementVNode("rect", {
|
|
183
|
-
class: "touchchat-edit-rlvoice-wave-3",
|
|
184
|
-
x: "8",
|
|
185
|
-
y: "-2",
|
|
186
|
-
width: "2",
|
|
187
|
-
height: "4",
|
|
188
|
-
rx: "1",
|
|
189
|
-
opacity: "0.8"
|
|
190
|
-
})
|
|
191
|
-
]),
|
|
192
|
-
createElementVNode("g", {
|
|
193
|
-
transform: "translate(4, 12)",
|
|
194
|
-
fill: "#409EFF"
|
|
195
|
-
}, [
|
|
196
|
-
createElementVNode("rect", {
|
|
197
|
-
class: "touchchat-edit-rlvoice-wave-4",
|
|
198
|
-
x: "0",
|
|
199
|
-
y: "-3",
|
|
200
|
-
width: "2",
|
|
201
|
-
height: "6",
|
|
202
|
-
rx: "1",
|
|
203
|
-
opacity: "0.7"
|
|
204
|
-
}),
|
|
205
|
-
createElementVNode("rect", {
|
|
206
|
-
class: "touchchat-edit-rlvoice-wave-5",
|
|
207
|
-
x: "4",
|
|
208
|
-
y: "-5",
|
|
209
|
-
width: "2",
|
|
210
|
-
height: "10",
|
|
211
|
-
rx: "1",
|
|
212
|
-
opacity: "0.8"
|
|
213
|
-
}),
|
|
214
|
-
createElementVNode("rect", {
|
|
215
|
-
class: "touchchat-edit-rlvoice-wave-6",
|
|
216
|
-
x: "8",
|
|
217
|
-
y: "-1",
|
|
218
|
-
width: "2",
|
|
219
|
-
height: "2",
|
|
220
|
-
rx: "1",
|
|
221
|
-
opacity: "0.9"
|
|
222
|
-
})
|
|
223
|
-
])
|
|
87
|
+
createElementVNode("path", {
|
|
88
|
+
class: "touchchat-voice-bar-1",
|
|
89
|
+
d: "M10 2.57617V17.4247",
|
|
90
|
+
stroke: "#0077FA",
|
|
91
|
+
"stroke-width": "1.2",
|
|
92
|
+
"stroke-linecap": "square"
|
|
93
|
+
}),
|
|
94
|
+
createElementVNode("path", {
|
|
95
|
+
class: "touchchat-voice-bar-2",
|
|
96
|
+
d: "M14.167 5.90869V14.0905",
|
|
97
|
+
stroke: "#0077FA",
|
|
98
|
+
"stroke-opacity": "0.8",
|
|
99
|
+
"stroke-width": "1.2",
|
|
100
|
+
"stroke-linecap": "square"
|
|
101
|
+
}),
|
|
102
|
+
createElementVNode("path", {
|
|
103
|
+
class: "touchchat-voice-bar-3",
|
|
104
|
+
d: "M1.66699 8.40869V11.5905",
|
|
105
|
+
stroke: "#0077FA",
|
|
106
|
+
"stroke-opacity": "0.5",
|
|
107
|
+
"stroke-width": "1.2",
|
|
108
|
+
"stroke-linecap": "square"
|
|
109
|
+
}),
|
|
110
|
+
createElementVNode("path", {
|
|
111
|
+
class: "touchchat-voice-bar-4",
|
|
112
|
+
d: "M18.333 8.40869V11.5905",
|
|
113
|
+
stroke: "#0077FA",
|
|
114
|
+
"stroke-opacity": "0.5",
|
|
115
|
+
"stroke-width": "1.2",
|
|
116
|
+
"stroke-linecap": "square"
|
|
117
|
+
}),
|
|
118
|
+
createElementVNode("path", {
|
|
119
|
+
class: "touchchat-voice-bar-5",
|
|
120
|
+
d: "M5.83301 5.90869V14.0905",
|
|
121
|
+
stroke: "#0077FA",
|
|
122
|
+
"stroke-opacity": "0.8",
|
|
123
|
+
"stroke-width": "1.2",
|
|
124
|
+
"stroke-linecap": "square"
|
|
125
|
+
})
|
|
224
126
|
]))
|
|
225
127
|
],
|
|
226
128
|
2112
|
|
227
129
|
/* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
|
|
228
130
|
)),
|
|
229
131
|
createElementVNode("div", { class: "touchchat-edit-attach-tip touchchat-edit-voice-tip" }, [
|
|
230
|
-
createElementVNode("p", null, "\
|
|
132
|
+
createElementVNode("p", null, "\u8BED\u97F3\u5F55\u5165")
|
|
231
133
|
])
|
|
232
134
|
]),
|
|
233
135
|
dialogVisible.value ? (openBlock(), createElementBlock("div", {
|
|
@@ -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<svg v-if=\"!dialogVisible\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#333\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<!-- 麦克风主体 -->\n\t\t\t\t<path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\" />\n\t\t\t\t<path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n\t\t\t\t<line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\" />\n\t\t\t\t<line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\" />\n\n\t\t\t\t<!-- 实时语音波形(动态感体现) -->\n\t\t\t\t<path d=\"M22 16v-2a2 2 0 0 0-2-2\" opacity=\"0.8\" />\n\t\t\t\t<path d=\"M6 16V8a2 2 0 0 1 2-2\" opacity=\"0.8\" />\n\t\t\t\t<rect x=\"20\" y=\"12\" width=\"1\" height=\"4\" rx=\"0.5\" opacity=\"0.9\" />\n\t\t\t\t<rect x=\"4\" y=\"10\" width=\"1\" height=\"6\" rx=\"0.5\" opacity=\"0.9\" />\n\t\t\t</svg>\n\t\t\t<!-- 实时语音中 -->\n\t\t\t<svg v-else xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"#409EFF\" stroke=\"#fff\" stroke-width=\"1\" stroke-linecap=\"round\">\n\t\t\t\t<!-- 麦克风主体(带阴影) -->\n\t\t\t\t<g class=\"touchchat-edit-rlvoice-mic-body\" filter=\"drop-shadow(0 2px 2px rgba(0,0,0,0.1))\">\n\t\t\t\t\t<circle cx=\"12\" cy=\"6\" r=\"4\" fill=\"#409EFF\" />\n\t\t\t\t\t<path d=\"M12 10v3a4 4 0 0 1-4 4h-1a1 1 0 0 1-1-1v-1a5 5 0 0 1 5-5z\" fill=\"#409EFF\" />\n\t\t\t\t\t<path d=\"M12 19v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2\" fill=\"none\" />\n\t\t\t\t</g>\n\n\t\t\t\t<!-- 实时波动的语音条(3个不同高度,体现实时感) -->\n\t\t\t\t<g transform=\"translate(18, 12)\" fill=\"#409EFF\">\n\t\t\t\t\t<rect class=\"touchchat-edit-rlvoice-wave-1\" x=\"0\" y=\"-4\" width=\"2\" height=\"8\" rx=\"1\" opacity=\"0.7\" />\n\t\t\t\t\t<rect class=\"touchchat-edit-rlvoice-wave-2\" x=\"4\" y=\"-6\" width=\"2\" height=\"12\" rx=\"1\" opacity=\"0.9\" />\n\t\t\t\t\t<rect class=\"touchchat-edit-rlvoice-wave-3\" x=\"8\" y=\"-2\" width=\"2\" height=\"4\" rx=\"1\" opacity=\"0.8\" />\n\t\t\t\t</g>\n\t\t\t\t<g transform=\"translate(4, 12)\" fill=\"#409EFF\">\n\t\t\t\t\t<rect class=\"touchchat-edit-rlvoice-wave-4\" x=\"0\" y=\"-3\" width=\"2\" height=\"6\" rx=\"1\" opacity=\"0.7\" />\n\t\t\t\t\t<rect class=\"touchchat-edit-rlvoice-wave-5\" x=\"4\" y=\"-5\" width=\"2\" height=\"10\" rx=\"1\" opacity=\"0.8\" />\n\t\t\t\t\t<rect class=\"touchchat-edit-rlvoice-wave-6\" x=\"8\" y=\"-1\" width=\"2\" height=\"2\" rx=\"1\" opacity=\"0.9\" />\n\t\t\t\t</g>\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, defineEmits } 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>\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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"}
|
|
@@ -137,29 +137,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
137
137
|
class: "touchchat-edit-attach",
|
|
138
138
|
onClick: startScreenshot
|
|
139
139
|
}, [
|
|
140
|
-
(
|
|
141
|
-
width: "18",
|
|
142
|
-
height: "18",
|
|
143
|
-
viewBox: "0 0 24 24",
|
|
144
|
-
fill: "none",
|
|
145
|
-
stroke: "currentColor",
|
|
146
|
-
class: "mr-2"
|
|
147
|
-
}, [
|
|
148
|
-
createElementVNode("rect", {
|
|
149
|
-
x: "3",
|
|
150
|
-
y: "3",
|
|
151
|
-
width: "18",
|
|
152
|
-
height: "18",
|
|
153
|
-
rx: "2",
|
|
154
|
-
ry: "2"
|
|
155
|
-
}),
|
|
156
|
-
createElementVNode("circle", {
|
|
157
|
-
cx: "8.5",
|
|
158
|
-
cy: "8.5",
|
|
159
|
-
r: "1.5"
|
|
160
|
-
}),
|
|
161
|
-
createElementVNode("polyline", { points: "21 15 16 10 5 21" })
|
|
162
|
-
])),
|
|
140
|
+
createElementVNode("div", { class: "touchchat-edit-screenshot-icon" }),
|
|
163
141
|
createElementVNode("div", { class: "touchchat-edit-attach-tip touchchat-edit-voice-tip" }, [
|
|
164
142
|
createElementVNode("p", null, "\u622A\u56FE")
|
|
165
143
|
])
|
|
@@ -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<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" class=\"mr-2\">\n\t\t\t<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n\t\t\t<circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n\t\t\t<polyline points=\"21 15 16 10 5 21\" />\n\t\t</svg>\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, defineEmits, 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","_createElementBlock","_createCommentVNode","_normalizeStyle"],"mappings":"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"}
|
|
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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"}
|
|
@@ -97,35 +97,10 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
97
97
|
class: "touchchat-edit-attach",
|
|
98
98
|
onClick: ($event) => toggleRecording()
|
|
99
99
|
}, [
|
|
100
|
-
!isRecording.value ? (openBlock(), createElementBlock("
|
|
100
|
+
!isRecording.value ? (openBlock(), createElementBlock("div", {
|
|
101
101
|
key: 0,
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
height: "21",
|
|
105
|
-
viewBox: "0 0 21 21",
|
|
106
|
-
fill: "none"
|
|
107
|
-
}, [
|
|
108
|
-
createElementVNode("path", {
|
|
109
|
-
d: "M13.4166 5.4257C13.4166 3.81487 12.1108 2.50903 10.5 2.50903C8.88915 2.50903 7.58331 3.81487 7.58331 5.4257V10.8424C7.58331 12.4532 8.88915 13.759 10.5 13.759C12.1108 13.759 13.4166 12.4532 13.4166 10.8424V5.4257Z",
|
|
110
|
-
stroke: "#1D2129",
|
|
111
|
-
"stroke-width": "1.2",
|
|
112
|
-
"stroke-linejoin": "round"
|
|
113
|
-
}),
|
|
114
|
-
createElementVNode("path", {
|
|
115
|
-
d: "M4.25 10.4255C4.25 13.8773 7.04821 16.6755 10.5 16.6755C13.9518 16.6755 16.75 13.8773 16.75 10.4255",
|
|
116
|
-
stroke: "#1D2129",
|
|
117
|
-
"stroke-width": "1.2",
|
|
118
|
-
"stroke-linecap": "square",
|
|
119
|
-
"stroke-linejoin": "round"
|
|
120
|
-
}),
|
|
121
|
-
createElementVNode("path", {
|
|
122
|
-
d: "M10.5 16.6755V19.1755",
|
|
123
|
-
stroke: "#1D2129",
|
|
124
|
-
"stroke-width": "1.2",
|
|
125
|
-
"stroke-linecap": "square",
|
|
126
|
-
"stroke-linejoin": "round"
|
|
127
|
-
})
|
|
128
|
-
])) : (openBlock(), createElementBlock("svg", {
|
|
102
|
+
class: "touchchat-edit-record-icon"
|
|
103
|
+
})) : (openBlock(), createElementBlock("svg", {
|
|
129
104
|
key: 1,
|
|
130
105
|
xmlns: "http://www.w3.org/2000/svg",
|
|
131
106
|
width: "20",
|
|
@@ -177,7 +152,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
177
152
|
createElementVNode(
|
|
178
153
|
"p",
|
|
179
154
|
null,
|
|
180
|
-
toDisplayString(isRecording.value ? "\u505C\u6B62\
|
|
155
|
+
toDisplayString(isRecording.value ? "\u505C\u6B62\u5F55\u97F3" : "\u5F55\u97F3"),
|
|
181
156
|
1
|
|
182
157
|
/* TEXT */
|
|
183
158
|
)
|
|
@@ -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<svg v-if=\"!isRecording\" xmlns=\"http://www.w3.org/2000/svg\" width=\"21\" height=\"21\" viewBox=\"0 0 21 21\" fill=\"none\">\n\t\t\t\t<path d=\"M13.4166 5.4257C13.4166 3.81487 12.1108 2.50903 10.5 2.50903C8.88915 2.50903 7.58331 3.81487 7.58331 5.4257V10.8424C7.58331 12.4532 8.88915 13.759 10.5 13.759C12.1108 13.759 13.4166 12.4532 13.4166 10.8424V5.4257Z\" stroke=\"#1D2129\" stroke-width=\"1.2\" stroke-linejoin=\"round\" />\n\t\t\t\t<path d=\"M4.25 10.4255C4.25 13.8773 7.04821 16.6755 10.5 16.6755C13.9518 16.6755 16.75 13.8773 16.75 10.4255\" stroke=\"#1D2129\" stroke-width=\"1.2\" stroke-linecap=\"square\" stroke-linejoin=\"round\" />\n\t\t\t\t<path d=\"M10.5 16.6755V19.1755\" stroke=\"#1D2129\" stroke-width=\"1.2\" stroke-linecap=\"square\" stroke-linejoin=\"round\" />\n\t\t\t</svg>\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>\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":";;;;;;;AAsBA,IAAA,MAAM,IAAO,GAAA,MAAA,CAAA;AAiBb,IAAM,MAAA,QAAA,GAAW,GAAgB,CAAA,EAAE,CAAA,CAAA;AACnC,IAAM,MAAA,WAAA,GAAc,IAAI,KAAK,CAAA,CAAA;AAC7B,IAAM,MAAA,kBAAA,GAAqB,IAAI,KAAK,CAAA,CAAA;AACpC,IAAM,MAAA,mBAAA,GAAsB,IAAI,EAAE,CAAA,CAAA;AAClC,IAAA,IAAI,aAAsC,GAAA,IAAA,CAAA;AAC1C,IAAA,IAAI,SAAiB,EAAC,CAAA;AAGtB,IAAM,MAAA,cAAA,GAAiB,CAAC,KAA0B,KAAA;AACjD,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;AAGA,IAAA,MAAM,sBAAsB,MAAM;AACjC,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAM,cAAc,CAAA,CAAA;AACpD,MAAA,MAAM,SAAY,GAAA,IAAI,IAAK,CAAA,CAAC,IAAI,CAAA,EAAG,CAAa,UAAA,EAAA,IAAA,CAAK,GAAI,EAAA,CAAA,IAAA,CAAA,EAAS,EAAE,IAAA,EAAM,cAAc,CAAA,CAAA;AACxF,MAAA,MAAM,QAAqB,GAAA;AAAA,QAC1B,IAAM,EAAA,SAAA;AAAA,QACN,WAAa,EAAA,KAAA;AAAA,QACb,cAAgB,EAAA,CAAA;AAAA,QAChB,aAAe,EAAA,KAAA;AAAA,QACf,WAAa,EAAA,KAAA;AAAA,QACb,QAAA,EAAU,cAAe,CAAA,SAAA,CAAU,IAAI,CAAA;AAAA,QACvC,UAAU,SAAU,CAAA,IAAA;AAAA,QACpB,MAAM,SAAU,CAAA,IAAA;AAAA;AAAA,QAEhB,IAAI,IAAK,CAAA,MAAA,EAAS,CAAA,QAAA,CAAS,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,OAAO,EAAI,EAAA,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,QACnE,MAAQ,EAAA,IAAA;AAAA,OACT,CAAA;AACA,MAAK,IAAA,CAAA,YAAA,EAAc,CAAC,QAAQ,CAAC,CAAA,CAAA;AAE7B,MAAI,IAAA,aAAA,IAAiB,cAAc,MAAQ,EAAA;AAC1C,QAAA,aAAA,CAAc,OAAO,SAAU,EAAA,CAAE,QAAQ,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,OAC/D;AACA,MAAgB,aAAA,GAAA,IAAA,CAAA;AAChB,MAAA,MAAA,GAAS,EAAC,CAAA;AAAA,KACX,CAAA;AAGA,IAAA,MAAM,oBAAoB,YAAY;AACrC,MAAI,IAAA;AACH,QAAM,MAAA,MAAA,GAAS,MAAM,SAAU,CAAA,YAAA,CAAa,aAAa,EAAE,KAAA,EAAO,MAAM,CAAA,CAAA;AACxE,QAAgB,aAAA,GAAA,IAAI,cAAc,MAAM,CAAA,CAAA;AACxC,QAAA,MAAA,GAAS,EAAC,CAAA;AAEV,QAAA,aAAA,CAAc,kBAAkB,CAAS,KAAA,KAAA;AACxC,UAAI,IAAA,KAAA,CAAM,IAAK,CAAA,IAAA,GAAO,CAAG,EAAA;AACxB,YAAO,MAAA,CAAA,IAAA,CAAK,MAAM,IAAI,CAAA,CAAA;AAAA,WACvB;AAAA,SACD,CAAA;AAEA,QAAA,aAAA,CAAc,MAAS,GAAA,mBAAA,CAAA;AACvB,QAAO,OAAA,IAAA,CAAA;AAAA,eACC,KAAP,EAAA;AACD,QAAA,kBAAA,CAAmB,KAAQ,GAAA,IAAA,CAAA;AAC3B,QAAA,mBAAA,CAAoB,KAAQ,GAAA,KAAA,YAAiB,KAAQ,GAAA,KAAA,CAAM,OAAU,GAAA,wDAAA,CAAA;AACrE,QAAQ,OAAA,CAAA,KAAA,CAAM,2DAAc,KAAK,CAAA,CAAA;AACjC,QAAA,SAAA,CAAU,0DAAa,OAAO,CAAA,CAAA;AAC9B,QAAO,OAAA,KAAA,CAAA;AAAA,OACR;AAAA,KACD,CAAA;AAGA,IAAM,MAAA,eAAA,GAAkB,OAAO,IAAmB,KAAA;AACjD,MAAA,MAAM,aAAa,MAAM;AACxB,QAAe,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAA,IAAA,EAAA,CAAA;AACf,QAAA,WAAA,CAAY,KAAQ,GAAA,KAAA,CAAA;AAAA,OACrB,CAAA;AACA,MAAA,IAAI,IAAM,EAAA;AACT,QAAW,UAAA,EAAA,CAAA;AACX,QAAA,OAAA;AAAA,OACD;AACA,MAAI,IAAA,CAAC,YAAY,KAAO,EAAA;AACvB,QAAM,MAAA,WAAA,GAAc,MAAM,iBAAkB,EAAA,CAAA;AAC5C,QAAA,IAAI,WAAa,EAAA;AAChB,UAAe,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAA,KAAA,EAAA,CAAA;AACf,UAAA,WAAA,CAAY,KAAQ,GAAA,IAAA,CAAA;AACpB,UAAA,kBAAA,CAAmB,KAAQ,GAAA,KAAA,CAAA;AAC3B,UAAA,mBAAA,CAAoB,KAAQ,GAAA,EAAA,CAAA;AAAA,SAC7B;AAAA,OACM,MAAA;AACN,QAAW,UAAA,EAAA,CAAA;AAAA,OACZ;AAAA,KACD,CAAA;AAEA,IAAA,MAAM,YAAY,MAAM;AACvB,MAAA,QAAA,CAAS,QAAQ,EAAC,CAAA;AAAA,KACnB,CAAA;AACA,IAAa,QAAA,CAAA;AAAA,MACZ,SAAA;AAAA,MACA,eAAA;AAAA,KACA,CAAA,CAAA;;0BArIAA,kBAcM,CAAA,KAAA,EAAA,IAAA,EAAA;AAAA,QAbLC,mBAYS,QAAA,EAAA;AAAA,UAZD,KAAM,EAAA,uBAAA;AAAA,UAAyB,OAAA,cAAO,eAAe,EAAA;AAAA;WAChD,WAAW,CAAA,KAAA,iBAAvBD,mBAAkE,KAAA,EAAA;AAAA;YAAzC,KAAM,EAAA,4BAAA;AAAA,8BAC/BA,mBAMM,KAAA,EAAA;AAAA;YANM,KAAM,EAAA,4BAAA;AAAA,YAA6B,KAAM,EAAA,IAAA;AAAA,YAAK,MAAO,EAAA,IAAA;AAAA,YAAK,OAAQ,EAAA,WAAA;AAAA,YAAY,IAAK,EAAA,MAAA;AAAA;YAC9FC,mBAA0H,MAAA,EAAA;AAAA,cAApH,KAAM,EAAA,uBAAA;AAAA,cAAwB,CAAE,EAAA,qBAAA;AAAA,cAAsB,MAAO,EAAA,SAAA;AAAA,cAAU,cAAa,EAAA,KAAA;AAAA,cAAM,gBAAe,EAAA,QAAA;AAAA;YAC/GA,mBAAmJ,MAAA,EAAA;AAAA,cAA7I,KAAM,EAAA,uBAAA;AAAA,cAAwB,CAAE,EAAA,yBAAA;AAAA,cAA0B,MAAO,EAAA,SAAA;AAAA,cAAU,gBAAe,EAAA,KAAA;AAAA,cAAM,cAAa,EAAA,KAAA;AAAA,cAAM,gBAAe,EAAA,QAAA;AAAA;YACxIA,mBAAoJ,MAAA,EAAA;AAAA,cAA9I,KAAM,EAAA,uBAAA;AAAA,cAAwB,CAAE,EAAA,0BAAA;AAAA,cAA2B,MAAO,EAAA,SAAA;AAAA,cAAU,gBAAe,EAAA,KAAA;AAAA,cAAM,cAAa,EAAA,KAAA;AAAA,cAAM,gBAAe,EAAA,QAAA;AAAA;YACzIA,mBAAmJ,MAAA,EAAA;AAAA,cAA7I,KAAM,EAAA,uBAAA;AAAA,cAAwB,CAAE,EAAA,yBAAA;AAAA,cAA0B,MAAO,EAAA,SAAA;AAAA,cAAU,gBAAe,EAAA,KAAA;AAAA,cAAM,cAAa,EAAA,KAAA;AAAA,cAAM,gBAAe,EAAA,QAAA;AAAA;YACxIA,mBAAoJ,MAAA,EAAA;AAAA,cAA9I,KAAM,EAAA,uBAAA;AAAA,cAAwB,CAAE,EAAA,0BAAA;AAAA,cAA2B,MAAO,EAAA,SAAA;AAAA,cAAU,gBAAe,EAAA,KAAA;AAAA,cAAM,cAAa,EAAA,KAAA;AAAA,cAAM,gBAAe,EAAA,QAAA;AAAA;;UAE1IA,kBAEM,CAAA,KAAA,EAAA,EAFD,KAAA,EAAM,sDAAoD,EAAA;AAAA,YAC9DA,kBAAA;AAAA,cAAwC,GAAA;AAAA;6BAAlC,CAAA,WAAA,CAAW,KAAA,GAAA,0BAAA,GAAA,cAAA,CAAA;AAAA,cAAA,CAAA;AAAA;AAAA,aAAA;AAAA;;;;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, inject, provide, ref, watch, computed, onMounted, openBlock, createElementBlock, createCommentVNode,
|
|
1
|
+
import { defineComponent, inject, provide, ref, watch, computed, onMounted, openBlock, createElementBlock, 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';
|
|
@@ -28,6 +28,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
30
|
const thinkAble = layout.includes("think");
|
|
31
|
+
const clearAble = layout.includes("clear");
|
|
31
32
|
const uploadAble = layout.includes("upload");
|
|
32
33
|
const screenAble = layout.includes("screen");
|
|
33
34
|
const voiceAble = layout.includes("voice");
|
|
@@ -233,6 +234,9 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
233
234
|
const transcription = (text) => {
|
|
234
235
|
emits("update:inputValue", text);
|
|
235
236
|
};
|
|
237
|
+
const handleClearClick = () => {
|
|
238
|
+
emits("update:inputValue", "");
|
|
239
|
+
};
|
|
236
240
|
const handleInputChange = (e) => {
|
|
237
241
|
const value = e.target.value;
|
|
238
242
|
emits("update:inputValue", value);
|
|
@@ -302,12 +306,13 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
302
306
|
var _a;
|
|
303
307
|
return openBlock(), createElementBlock("div", { class: "touchchat-edit" }, [
|
|
304
308
|
createCommentVNode(' :file-progress="fileProgress" '),
|
|
305
|
-
|
|
309
|
+
fileList.value.length > 0 ? (openBlock(), createBlock(FileContent, {
|
|
310
|
+
key: 0,
|
|
306
311
|
"file-list": fileList.value,
|
|
307
312
|
"has-colse": true,
|
|
308
313
|
type: "ChatInput",
|
|
309
314
|
onColse: handleColse
|
|
310
|
-
}, null, 8, ["file-list"]),
|
|
315
|
+
}, null, 8, ["file-list"])) : createCommentVNode("v-if", true),
|
|
311
316
|
createElementVNode("div", { class: "touchchat-edit-input" }, [
|
|
312
317
|
createCommentVNode(" @keydown.enter.prevent "),
|
|
313
318
|
createElementVNode("textarea", {
|
|
@@ -361,8 +366,18 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
361
366
|
_: 1
|
|
362
367
|
/* STABLE */
|
|
363
368
|
}, 8, ["file-list"])) : createCommentVNode("v-if", true),
|
|
364
|
-
|
|
369
|
+
unref(clearAble) ? (openBlock(), createElementBlock("button", {
|
|
365
370
|
key: 1,
|
|
371
|
+
class: "touchchat-edit-attach",
|
|
372
|
+
onClick: handleClearClick
|
|
373
|
+
}, [
|
|
374
|
+
createElementVNode("div", { class: "touchchat-edit-delete-icon" }),
|
|
375
|
+
createElementVNode("div", { class: "touchchat-edit-attach-tip touchchat-edit-voice-tip" }, [
|
|
376
|
+
createElementVNode("p", null, "\u6E05\u7A7A\u6587\u672C")
|
|
377
|
+
])
|
|
378
|
+
])) : createCommentVNode("v-if", true),
|
|
379
|
+
finallyModules.value.length > 1 ? (openBlock(), createBlock(ModuleSelect, {
|
|
380
|
+
key: 2,
|
|
366
381
|
modelValue: selectVal.value,
|
|
367
382
|
"onUpdate:modelValue": ($event) => selectVal.value = $event,
|
|
368
383
|
modules: finallyModules.value
|
|
@@ -371,7 +386,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
371
386
|
unref(thinkAble) ? (openBlock(), createElementBlock(
|
|
372
387
|
"button",
|
|
373
388
|
{
|
|
374
|
-
key:
|
|
389
|
+
key: 3,
|
|
375
390
|
class: normalizeClass(["touchchat-edit-think", { "is-on": __props.enableDeepThinking, "is-dis": __props.isChating }]),
|
|
376
391
|
onClick: handleDeepThinkingClick
|
|
377
392
|
},
|