import { ref } from 'vue'; import axios from 'axios'; export function useRecording() { const isRecording = ref(false); const audioChunks = ref([]); const mediaRecorder = ref(null); async function startRecording(onStart?: (label: string) => void) { try { const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); mediaRecorder.value = new MediaRecorder(stream); mediaRecorder.value.ondataavailable = (event) => { audioChunks.value.push(event.data); }; mediaRecorder.value.start(); isRecording.value = true; if (onStart) { onStart('录音中...'); } } catch (error) { console.error('Failed to start recording:', error); } } async function stopRecording(onStop?: (label: string) => void): Promise { return new Promise((resolve, reject) => { if (!mediaRecorder.value) { reject('No media recorder'); return; } isRecording.value = false; if (onStop) { onStop('聊天输入框'); } mediaRecorder.value.stop(); mediaRecorder.value.onstop = async () => { const audioBlob = new Blob(audioChunks.value, { type: 'audio/wav' }); audioChunks.value = []; mediaRecorder.value?.stream.getTracks().forEach(track => track.stop()); const formData = new FormData(); formData.append('file', audioBlob); try { const response = await axios.post('/api/chat/post_file', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); const audio = response.data.data.filename; console.log('Audio uploaded:', audio); resolve(audio); } catch (err) { console.error('Error uploading audio:', err); reject(err); } }; }); } return { isRecording, startRecording, stopRecording }; }