diff --git a/src/components/message/MessageItem.vue b/src/components/message/MessageItem.vue index 0b80738..b25b833 100644 --- a/src/components/message/MessageItem.vue +++ b/src/components/message/MessageItem.vue @@ -9,6 +9,7 @@ const props = defineProps([ 'msg', 'obj', 'readMsgId', + 'remoteRead', 'lastMsgTime', 'firstMsgId', 'isFirstNew', @@ -26,6 +27,11 @@ const loadMoreTips = computed(() => { const isUnreadMsg = computed(() => { return props.readMsgId < props.msg.msgId && !isSelf.value }) + +const myMsgIsRead = computed(() => { + return isSelf.value && props.msg.msgId <= props.remoteRead +}) + const isShowLoadMore = computed(() => { if (props.msg.msgId === props.firstMsgId && !props.hasNoMoreMsg) { return true @@ -123,7 +129,7 @@ const onShowUserCard = () => { {{ msgTime }} -
+
{{ props.msg.content }}
@@ -154,7 +160,6 @@ const onShowUserCard = () => { {{ msgTime }}
{{ props.msg.content }}
-
@@ -262,10 +267,11 @@ const onShowUserCard = () => { margin-top: 5px; padding: 0; display: flex; + justify-content: right; .div-content { max-width: 500px; - padding: 5px; + padding: 8px; font-size: 14px; background-color: #c6e2ff; border-radius: 10px; @@ -273,8 +279,28 @@ const onShowUserCard = () => { user-select: text; } - .div-blank { - flex: 1; + .remote_read { + margin-right: 5px; + display: flex; + align-items: end; + + &::before { + content: '●'; + font-size: 10px; + color: #95d475; + } + } + + .remote_unread { + margin-right: 5px; + display: flex; + align-items: end; + + &::before { + content: '●'; + font-size: 10px; + color: #eebe77; + } } } } @@ -309,20 +335,17 @@ const onShowUserCard = () => { margin-top: 5px; padding: 0; display: flex; + justify-content: left; .div-content { max-width: 500px; - padding: 5px; + padding: 8px; font-size: 14px; background-color: #dedfe0; border-radius: 10px; border-top-left-radius: 0; user-select: text; } - - .div-blank { - flex: 1; - } } } } diff --git a/src/js/event/index.js b/src/js/event/index.js index 7eeefe1..304d8c4 100644 --- a/src/js/event/index.js +++ b/src/js/event/index.js @@ -1 +1,2 @@ export * from './receiveChatMsg' +export * from './receiveChatReadMsg' diff --git a/src/js/event/receiveChatReadMsg.js b/src/js/event/receiveChatReadMsg.js new file mode 100644 index 0000000..69148bd --- /dev/null +++ b/src/js/event/receiveChatReadMsg.js @@ -0,0 +1,13 @@ +import { combineId } from '@/utils/common' +import { messageStore } from '@/stores' + +export const onReceiveChatReadMsg = () => { + return async (msg) => { + const messageData = messageStore() + const sessionId = combineId(msg.body.fromId, msg.body.toId) + messageData.updateSession({ + sessionId: sessionId, + remoteRead: msg.body.content + }) + } +} diff --git a/src/js/websocket/wsConnect.js b/src/js/websocket/wsConnect.js index b954867..4db3ba7 100644 --- a/src/js/websocket/wsConnect.js +++ b/src/js/websocket/wsConnect.js @@ -159,13 +159,13 @@ class WsConnect { } async onMessage(evt) { - console.log('onMessage', evt) + // console.log('onMessage', evt) const arrayBuffer = await evt.data.arrayBuffer() const frames = this.decode(new Uint8Array(arrayBuffer)) frames.forEach((frame) => { const msg = Msg.decode(frame) - console.log(`receive a ${MsgType[msg.header.msgType]} msg: `, msg) + // console.log(`receive a ${MsgType[msg.header.msgType]} msg: `, msg) if (this.events[msg.header.msgType]) this.events[msg.header.msgType](msg) }) } diff --git a/src/stores/message.js b/src/stores/message.js index 90eb25f..1525ef6 100644 --- a/src/stores/message.js +++ b/src/stores/message.js @@ -45,6 +45,7 @@ export const messageStore = defineStore('anyim-message', () => { if ('lastMsgContent' in obj) mySession.lastMsgContent = obj.lastMsgContent if ('lastMsgTime' in obj) mySession.lastMsgTime = obj.lastMsgTime if ('unreadCount' in obj) mySession.unreadCount = obj.unreadCount + if ('remoteRead' in obj) mySession.remoteRead = obj.remoteRead if ('top' in obj) mySession.top = obj.top if ('muted' in obj) mySession.muted = obj.muted if ('draft' in obj) mySession.draft = obj.draft diff --git a/src/views/message/MessageLayout.vue b/src/views/message/MessageLayout.vue index b2d422d..682b660 100644 --- a/src/views/message/MessageLayout.vue +++ b/src/views/message/MessageLayout.vue @@ -28,7 +28,7 @@ import backgroupImage from '@/assets/messagebx_bg.webp' import { msgChatSessionListService, msgChatPullMsgService } from '@/api/message' import { MsgType } from '@/proto/msg' import wsConnect from '@/js/websocket/wsConnect' -import { onReceiveChatMsg } from '@/js/event' +import { onReceiveChatMsg, onReceiveChatReadMsg } from '@/js/event' const userData = userStore() const settingData = settingStore() @@ -93,6 +93,7 @@ onMounted(async () => { const res = await msgChatSessionListService() messageData.setSessionList(res.data.data) //入缓存 wsConnect.bindEvent(MsgType.CHAT, onReceiveChatMsg(msgListDiv, capacity)) //绑定接收Chat消息的事件 + wsConnect.bindEvent(MsgType.CHAT_READ, onReceiveChatReadMsg()) //绑定接收Chat已读消息的事件 }) onUnmounted(() => { @@ -455,7 +456,7 @@ watch(() => msgRecords.value, (oldValue) => { :key="index" :msg="item" :obj="choosedSession.objectInfo" - :readMsgId="choosedSession.readMsgId" + :remoteRead="choosedSession.remoteRead" :lastMsgTime="getLastMsgTime(index)" :isFirstNew="isFirstNew(index)" :firstMsgId="firstMsgId"