mi-assessment/uniapp/store/chat.js
2026-02-09 14:45:06 +08:00

218 lines
4.9 KiB
JavaScript

/**
* 聊天状态管理模块
*/
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
}
}
})