| 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; |
|
|
| |
| 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 |
| }; |
| } |
|
|