/** * 聊天状态管理模块 */ import { defineStore } from 'pinia' /** * 消息类型枚举 */ export const MessageType = { TEXT: 1, // 文本消息 VOICE: 2, // 语音消息 IMAGE: 3 // 图片消息 } /** * 消息状态枚举 */ export const MessageStatus = { SENDING: 0, // 发送中 SENT: 1, // 已发送 DELIVERED: 2, // 已送达 READ: 3, // 已读 FAILED: 4 // 发送失败 } export const useChatStore = defineStore('chat', { state: () => ({ // 会话列表 sessions: [], // 当前会话的消息列表 (按sessionId分组) messagesBySession: {}, // 当前活跃的会话ID currentSessionId: null, // 总未读消息数 totalUnreadCount: 0 }), getters: { /** * 获取当前会话的消息列表 */ currentMessages: (state) => { if (!state.currentSessionId) return [] return state.messagesBySession[state.currentSessionId] || [] }, /** * 是否有未读消息 */ hasUnreadMessages: (state) => state.totalUnreadCount > 0, /** * 获取指定会话的未读数 */ getSessionUnreadCount: (state) => (sessionId) => { const session = state.sessions.find(s => s.sessionId === sessionId) return session ? session.unreadCount : 0 } }, actions: { /** * 设置会话列表 */ setSessions(sessions) { this.sessions = sessions this.updateTotalUnreadCount() }, /** * 更新总未读消息数 */ updateTotalUnreadCount() { this.totalUnreadCount = this.sessions.reduce( (total, session) => total + (session.unreadCount || 0), 0 ) }, /** * 设置当前会话 */ setCurrentSession(sessionId) { this.currentSessionId = sessionId }, /** * 设置会话的消息列表 */ setMessages(sessionId, messages) { this.messagesBySession[sessionId] = messages }, /** * 添加新消息到会话 */ addMessage(sessionId, message) { if (!this.messagesBySession[sessionId]) { this.messagesBySession[sessionId] = [] } this.messagesBySession[sessionId].push(message) this.updateSessionLastMessage(sessionId, message) }, /** * 更新会话的最后消息 */ updateSessionLastMessage(sessionId, message) { const session = this.sessions.find(s => s.sessionId === sessionId) if (session) { session.lastMessage = this.getMessagePreview(message) session.lastMessageTime = message.createTime } }, /** * 获取消息预览文本 */ getMessagePreview(message) { switch (message.messageType) { case MessageType.TEXT: return message.content case MessageType.VOICE: return '[语音]' case MessageType.IMAGE: return '[图片]' default: return message.content || '' } }, /** * 接收新消息 */ receiveMessage(message) { const { sessionId } = message this.addMessage(sessionId, message) if (sessionId !== this.currentSessionId) { this.incrementUnreadCount(sessionId) } }, /** * 增加会话未读数 */ incrementUnreadCount(sessionId) { const session = this.sessions.find(s => s.sessionId === sessionId) if (session) { session.unreadCount = (session.unreadCount || 0) + 1 this.updateTotalUnreadCount() } }, /** * 标记会话已读 */ markSessionAsRead(sessionId) { const session = this.sessions.find(s => s.sessionId === sessionId) if (session && session.unreadCount > 0) { session.unreadCount = 0 this.updateTotalUnreadCount() } }, /** * 发送消息(本地状态更新) */ sendMessage(sessionId, messageData) { const message = { id: Date.now(), sessionId, senderId: messageData.senderId, receiverId: messageData.receiverId, messageType: messageData.messageType || MessageType.TEXT, content: messageData.content, status: MessageStatus.SENDING, createTime: new Date().toISOString(), isMine: true } this.addMessage(sessionId, message) return message }, /** * 更新消息状态 */ updateMessageStatus(sessionId, messageId, status) { const messages = this.messagesBySession[sessionId] if (messages) { const message = messages.find(m => m.id === messageId) if (message) { message.status = status } } }, /** * 清空当前会话 */ clearCurrentSession() { this.currentSessionId = null }, /** * 重置聊天状态 */ reset() { this.sessions = [] this.messagesBySession = {} this.currentSessionId = null this.totalUnreadCount = 0 } } })