Fix chat messages being missed when the streaming is disabled and the messages are sent by both participants simultaneously

This commit is contained in:
eugenijm 2020-09-16 02:34:19 +03:00
parent 679a1f5e1c
commit 8c4514013d
4 changed files with 26 additions and 33 deletions

View file

@ -204,9 +204,9 @@ const Chat = {
} }
}, },
readChat () { readChat () {
if (!(this.currentChatMessageService && this.currentChatMessageService.lastMessage)) { return } if (!(this.currentChatMessageService && this.currentChatMessageService.maxId)) { return }
if (document.hidden) { return } if (document.hidden) { return }
const lastReadId = this.currentChatMessageService.lastMessage.id const lastReadId = this.currentChatMessageService.maxId
this.$store.dispatch('readChat', { id: this.currentChat.id, lastReadId }) this.$store.dispatch('readChat', { id: this.currentChat.id, lastReadId })
}, },
bottomedOut (offset) { bottomedOut (offset) {
@ -244,7 +244,7 @@ const Chat = {
const chatId = chatMessageService.chatId const chatId = chatMessageService.chatId
const fetchOlderMessages = !!maxId const fetchOlderMessages = !!maxId
const sinceId = fetchLatest && chatMessageService.lastMessage && chatMessageService.lastMessage.id const sinceId = fetchLatest && chatMessageService.maxId
this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId }) this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId })
.then((messages) => { .then((messages) => {
@ -303,7 +303,11 @@ const Chat = {
return this.backendInteractor.sendChatMessage(params) return this.backendInteractor.sendChatMessage(params)
.then(data => { .then(data => {
this.$store.dispatch('addChatMessages', { chatId: this.currentChat.id, messages: [data] }).then(() => { this.$store.dispatch('addChatMessages', {
chatId: this.currentChat.id,
messages: [data],
updateMaxId: false
}).then(() => {
this.$nextTick(() => { this.$nextTick(() => {
this.handleResize() this.handleResize()
// When the posting form size changes because of a media attachment, we need an extra resize // When the posting form size changes because of a media attachment, we need an extra resize

View file

@ -181,30 +181,16 @@ const chats = {
setChatsLoading (state, { value }) { setChatsLoading (state, { value }) {
state.chats.loading = value state.chats.loading = value
}, },
addChatMessages (state, { commit, chatId, messages }) { addChatMessages (state, { chatId, messages, updateMaxId }) {
const chatMessageService = state.openedChatMessageServices[chatId] const chatMessageService = state.openedChatMessageServices[chatId]
if (chatMessageService) { if (chatMessageService) {
chatService.add(chatMessageService, { messages: messages.map(parseChatMessage) }) chatService.add(chatMessageService, { messages: messages.map(parseChatMessage), updateMaxId })
commit('refreshLastMessage', { chatId })
} }
}, },
refreshLastMessage (state, { chatId }) { deleteChatMessage (state, { chatId, messageId }) {
const chatMessageService = state.openedChatMessageServices[chatId]
if (chatMessageService) {
const chat = getChatById(state, chatId)
if (chat) {
chat.lastMessage = chatMessageService.lastMessage
if (chatMessageService.lastMessage) {
chat.updated_at = chatMessageService.lastMessage.created_at
}
}
}
},
deleteChatMessage (state, { commit, chatId, messageId }) {
const chatMessageService = state.openedChatMessageServices[chatId] const chatMessageService = state.openedChatMessageServices[chatId]
if (chatMessageService) { if (chatMessageService) {
chatService.deleteMessage(chatMessageService, messageId) chatService.deleteMessage(chatMessageService, messageId)
commit('refreshLastMessage', { chatId })
} }
}, },
resetChatNewMessageCount (state, _value) { resetChatNewMessageCount (state, _value) {

View file

@ -8,7 +8,7 @@ const empty = (chatId) => {
lastSeenTimestamp: 0, lastSeenTimestamp: 0,
chatId: chatId, chatId: chatId,
minId: undefined, minId: undefined,
lastMessage: undefined maxId: undefined
} }
} }
@ -18,7 +18,7 @@ const clear = (storage) => {
storage.newMessageCount = 0 storage.newMessageCount = 0
storage.lastSeenTimestamp = 0 storage.lastSeenTimestamp = 0
storage.minId = undefined storage.minId = undefined
storage.lastMessage = undefined storage.maxId = undefined
} }
const deleteMessage = (storage, messageId) => { const deleteMessage = (storage, messageId) => {
@ -26,8 +26,9 @@ const deleteMessage = (storage, messageId) => {
storage.messages = storage.messages.filter(m => m.id !== messageId) storage.messages = storage.messages.filter(m => m.id !== messageId)
delete storage.idIndex[messageId] delete storage.idIndex[messageId]
if (storage.lastMessage && (storage.lastMessage.id === messageId)) { if (storage.maxId === messageId) {
storage.lastMessage = _.maxBy(storage.messages, 'id') const lastMessage = _.maxBy(storage.messages, 'id')
storage.maxId = lastMessage.id
} }
if (storage.minId === messageId) { if (storage.minId === messageId) {
@ -36,7 +37,7 @@ const deleteMessage = (storage, messageId) => {
} }
} }
const add = (storage, { messages: newMessages }) => { const add = (storage, { messages: newMessages, updateMaxId = true }) => {
if (!storage) { return } if (!storage) { return }
for (let i = 0; i < newMessages.length; i++) { for (let i = 0; i < newMessages.length; i++) {
const message = newMessages[i] const message = newMessages[i]
@ -48,8 +49,10 @@ const add = (storage, { messages: newMessages }) => {
storage.minId = message.id storage.minId = message.id
} }
if (!storage.lastMessage || message.id > storage.lastMessage.id) { if (!storage.maxId || message.id > storage.maxId) {
storage.lastMessage = message if (updateMaxId) {
storage.maxId = message.id
}
} }
if (!storage.idIndex[message.id]) { if (!storage.idIndex[message.id]) {

View file

@ -33,12 +33,12 @@ describe('chatService', () => {
const chat = chatService.empty() const chat = chatService.empty()
chatService.add(chat, { messages: [ message1 ] }) chatService.add(chat, { messages: [ message1 ] })
expect(chat.lastMessage.id).to.eql(message1.id) expect(chat.maxId).to.eql(message1.id)
expect(chat.minId).to.eql(message1.id) expect(chat.minId).to.eql(message1.id)
expect(chat.newMessageCount).to.eql(1) expect(chat.newMessageCount).to.eql(1)
chatService.add(chat, { messages: [ message2 ] }) chatService.add(chat, { messages: [ message2 ] })
expect(chat.lastMessage.id).to.eql(message2.id) expect(chat.maxId).to.eql(message2.id)
expect(chat.minId).to.eql(message1.id) expect(chat.minId).to.eql(message1.id)
expect(chat.newMessageCount).to.eql(2) expect(chat.newMessageCount).to.eql(2)
@ -60,15 +60,15 @@ describe('chatService', () => {
chatService.add(chat, { messages: [ message2 ] }) chatService.add(chat, { messages: [ message2 ] })
chatService.add(chat, { messages: [ message3 ] }) chatService.add(chat, { messages: [ message3 ] })
expect(chat.lastMessage.id).to.eql(message3.id) expect(chat.maxId).to.eql(message3.id)
expect(chat.minId).to.eql(message1.id) expect(chat.minId).to.eql(message1.id)
chatService.deleteMessage(chat, message3.id) chatService.deleteMessage(chat, message3.id)
expect(chat.lastMessage.id).to.eql(message2.id) expect(chat.maxId).to.eql(message2.id)
expect(chat.minId).to.eql(message1.id) expect(chat.minId).to.eql(message1.id)
chatService.deleteMessage(chat, message1.id) chatService.deleteMessage(chat, message1.id)
expect(chat.lastMessage.id).to.eql(message2.id) expect(chat.maxId).to.eql(message2.id)
expect(chat.minId).to.eql(message2.id) expect(chat.minId).to.eql(message2.id)
}) })
}) })