164a4226ea
- Introduced `ConversationSidebar.vue` for improved conversation management and sidebar functionality. - Enhanced `MessageList.vue` to handle loading states and improved message rendering. - Created new composables: `useConversations`, `useMessages`, `useMediaHandling`, `useRecording` for better code organization and reusability. - Added loading indicators and improved user experience during message processing. - Ensured backward compatibility and maintained existing functionalities.
146 lines
4.4 KiB
TypeScript
146 lines
4.4 KiB
TypeScript
import { ref, computed } from 'vue';
|
|
import axios from 'axios';
|
|
import { useRouter } from 'vue-router';
|
|
|
|
export interface Conversation {
|
|
cid: string;
|
|
title: string;
|
|
updated_at: number;
|
|
}
|
|
|
|
export function useConversations(chatboxMode: boolean = false) {
|
|
const router = useRouter();
|
|
const conversations = ref<Conversation[]>([]);
|
|
const selectedConversations = ref<string[]>([]);
|
|
const currCid = ref('');
|
|
const pendingCid = ref<string | null>(null);
|
|
|
|
// 编辑标题相关
|
|
const editTitleDialog = ref(false);
|
|
const editingTitle = ref('');
|
|
const editingCid = ref('');
|
|
|
|
const getCurrentConversation = computed(() => {
|
|
if (!currCid.value) return null;
|
|
return conversations.value.find(c => c.cid === currCid.value);
|
|
});
|
|
|
|
async function getConversations() {
|
|
try {
|
|
const response = await axios.get('/api/chat/conversations');
|
|
conversations.value = response.data.data;
|
|
|
|
// 处理待加载的会话
|
|
if (pendingCid.value) {
|
|
const conversation = conversations.value.find(c => c.cid === pendingCid.value);
|
|
if (conversation) {
|
|
selectedConversations.value = [pendingCid.value];
|
|
pendingCid.value = null;
|
|
}
|
|
} else if (!currCid.value && conversations.value.length > 0) {
|
|
// 默认选择第一个会话
|
|
const firstConversation = conversations.value[0];
|
|
selectedConversations.value = [firstConversation.cid];
|
|
}
|
|
} catch (err: any) {
|
|
if (err.response?.status === 401) {
|
|
router.push('/auth/login?redirect=/chatbox');
|
|
}
|
|
console.error(err);
|
|
}
|
|
}
|
|
|
|
async function newConversation() {
|
|
try {
|
|
const response = await axios.get('/api/chat/new_conversation');
|
|
const cid = response.data.data.conversation_id;
|
|
currCid.value = cid;
|
|
|
|
// 更新 URL
|
|
const basePath = chatboxMode ? '/chatbox' : '/chat';
|
|
router.push(`${basePath}/${cid}`);
|
|
|
|
await getConversations();
|
|
return cid;
|
|
} catch (err) {
|
|
console.error(err);
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
async function deleteConversation(cid: string) {
|
|
try {
|
|
await axios.get('/api/chat/delete_conversation?conversation_id=' + cid);
|
|
await getConversations();
|
|
currCid.value = '';
|
|
selectedConversations.value = [];
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
}
|
|
|
|
function showEditTitleDialog(cid: string, title: string) {
|
|
editingCid.value = cid;
|
|
editingTitle.value = title || '';
|
|
editTitleDialog.value = true;
|
|
}
|
|
|
|
async function saveTitle() {
|
|
if (!editingCid.value) return;
|
|
|
|
const trimmedTitle = editingTitle.value.trim();
|
|
try {
|
|
await axios.post('/api/chat/rename_conversation', {
|
|
conversation_id: editingCid.value,
|
|
title: trimmedTitle
|
|
});
|
|
|
|
// 更新本地会话标题
|
|
const conversation = conversations.value.find(c => c.cid === editingCid.value);
|
|
if (conversation) {
|
|
conversation.title = trimmedTitle;
|
|
}
|
|
editTitleDialog.value = false;
|
|
} catch (err) {
|
|
console.error('重命名对话失败:', err);
|
|
}
|
|
}
|
|
|
|
function updateConversationTitle(cid: string, title: string) {
|
|
const conversation = conversations.value.find(c => c.cid === cid);
|
|
if (conversation) {
|
|
conversation.title = title;
|
|
}
|
|
}
|
|
|
|
function newChat(closeMobileSidebar?: () => void) {
|
|
currCid.value = '';
|
|
selectedConversations.value = [];
|
|
|
|
const basePath = chatboxMode ? '/chatbox' : '/chat';
|
|
router.push(basePath);
|
|
|
|
if (closeMobileSidebar) {
|
|
closeMobileSidebar();
|
|
}
|
|
}
|
|
|
|
return {
|
|
conversations,
|
|
selectedConversations,
|
|
currCid,
|
|
pendingCid,
|
|
editTitleDialog,
|
|
editingTitle,
|
|
editingCid,
|
|
getCurrentConversation,
|
|
getConversations,
|
|
newConversation,
|
|
deleteConversation,
|
|
showEditTitleDialog,
|
|
saveTitle,
|
|
updateConversationTitle,
|
|
newChat
|
|
};
|
|
}
|