218 lines
4.9 KiB
JavaScript
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
|
|
}
|
|
}
|
|
})
|