新增消息已读状态
复用 chat_participants.last_read_at 推导已读,无需新表/迁移。 - 后端:MessageDTO 增加 is_read,toMessageDTOs 按「全部已读」语义计算 (所有其他参与者均已读才算已读,1对1 即对方已读);MarkRead 成功后 推送 conversation_read 事件(含 reader 与 read_at),NotifyConversation 与 NotifyAllAdmins 双通道通知,使发送方/客服实时刷新已读 - 前端:ChatMessage 增加 is_read,ChatView/AdminChatsView/MobileChatView 在自己的消息下渲染「已读/未读」;收到 conversation_read 且本端仍有 未获回执的自己消息时才重载,避免无谓请求 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
cc1c0d33de
commit
e75a39b03a
@@ -16,9 +16,12 @@ export interface SSEMessage {
|
||||
}
|
||||
|
||||
export interface ChatEvent {
|
||||
type: 'new_message' | 'conversation_updated'
|
||||
type: 'new_message' | 'conversation_updated' | 'conversation_read'
|
||||
conversation_id: number
|
||||
message?: SSEMessage
|
||||
reader_type?: string
|
||||
reader_id?: number
|
||||
read_at?: string
|
||||
}
|
||||
|
||||
type EventHandler = (event: ChatEvent) => void
|
||||
@@ -69,6 +72,15 @@ export function useChatSSE(scope: AuthScope, endpoint: string) {
|
||||
}
|
||||
})
|
||||
|
||||
source.addEventListener('conversation_read', e => {
|
||||
try {
|
||||
const data = JSON.parse((e as MessageEvent).data) as ChatEvent
|
||||
handlers.forEach(h => h(data))
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
})
|
||||
|
||||
source.onerror = async () => {
|
||||
connected.value = false
|
||||
source?.close()
|
||||
|
||||
Reference in New Issue
Block a user