Fix chat messages being missed when the streaming is disabled and the messages are sent by both participants simultaneously
This commit is contained in:
		
							parent
							
								
									679a1f5e1c
								
							
						
					
					
						commit
						8c4514013d
					
				
					 4 changed files with 26 additions and 33 deletions
				
			
		| 
						 | 
				
			
			@ -204,9 +204,9 @@ const Chat = {
 | 
			
		|||
      }
 | 
			
		||||
    },
 | 
			
		||||
    readChat () {
 | 
			
		||||
      if (!(this.currentChatMessageService && this.currentChatMessageService.lastMessage)) { return }
 | 
			
		||||
      if (!(this.currentChatMessageService && this.currentChatMessageService.maxId)) { 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 })
 | 
			
		||||
    },
 | 
			
		||||
    bottomedOut (offset) {
 | 
			
		||||
| 
						 | 
				
			
			@ -244,7 +244,7 @@ const Chat = {
 | 
			
		|||
 | 
			
		||||
      const chatId = chatMessageService.chatId
 | 
			
		||||
      const fetchOlderMessages = !!maxId
 | 
			
		||||
      const sinceId = fetchLatest && chatMessageService.lastMessage && chatMessageService.lastMessage.id
 | 
			
		||||
      const sinceId = fetchLatest && chatMessageService.maxId
 | 
			
		||||
 | 
			
		||||
      this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId })
 | 
			
		||||
        .then((messages) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +303,11 @@ const Chat = {
 | 
			
		|||
 | 
			
		||||
      return this.backendInteractor.sendChatMessage(params)
 | 
			
		||||
        .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.handleResize()
 | 
			
		||||
              // When the posting form size changes because of a media attachment, we need an extra resize
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -181,30 +181,16 @@ const chats = {
 | 
			
		|||
    setChatsLoading (state, { value }) {
 | 
			
		||||
      state.chats.loading = value
 | 
			
		||||
    },
 | 
			
		||||
    addChatMessages (state, { commit, chatId, messages }) {
 | 
			
		||||
    addChatMessages (state, { chatId, messages, updateMaxId }) {
 | 
			
		||||
      const chatMessageService = state.openedChatMessageServices[chatId]
 | 
			
		||||
      if (chatMessageService) {
 | 
			
		||||
        chatService.add(chatMessageService, { messages: messages.map(parseChatMessage) })
 | 
			
		||||
        commit('refreshLastMessage', { chatId })
 | 
			
		||||
        chatService.add(chatMessageService, { messages: messages.map(parseChatMessage), updateMaxId })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    refreshLastMessage (state, { chatId }) {
 | 
			
		||||
      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 }) {
 | 
			
		||||
    deleteChatMessage (state, { chatId, messageId }) {
 | 
			
		||||
      const chatMessageService = state.openedChatMessageServices[chatId]
 | 
			
		||||
      if (chatMessageService) {
 | 
			
		||||
        chatService.deleteMessage(chatMessageService, messageId)
 | 
			
		||||
        commit('refreshLastMessage', { chatId })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    resetChatNewMessageCount (state, _value) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ const empty = (chatId) => {
 | 
			
		|||
    lastSeenTimestamp: 0,
 | 
			
		||||
    chatId: chatId,
 | 
			
		||||
    minId: undefined,
 | 
			
		||||
    lastMessage: undefined
 | 
			
		||||
    maxId: undefined
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ const clear = (storage) => {
 | 
			
		|||
  storage.newMessageCount = 0
 | 
			
		||||
  storage.lastSeenTimestamp = 0
 | 
			
		||||
  storage.minId = undefined
 | 
			
		||||
  storage.lastMessage = undefined
 | 
			
		||||
  storage.maxId = undefined
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const deleteMessage = (storage, messageId) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -26,8 +26,9 @@ const deleteMessage = (storage, messageId) => {
 | 
			
		|||
  storage.messages = storage.messages.filter(m => m.id !== messageId)
 | 
			
		||||
  delete storage.idIndex[messageId]
 | 
			
		||||
 | 
			
		||||
  if (storage.lastMessage && (storage.lastMessage.id === messageId)) {
 | 
			
		||||
    storage.lastMessage = _.maxBy(storage.messages, 'id')
 | 
			
		||||
  if (storage.maxId === messageId) {
 | 
			
		||||
    const lastMessage = _.maxBy(storage.messages, 'id')
 | 
			
		||||
    storage.maxId = lastMessage.id
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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 }
 | 
			
		||||
  for (let i = 0; i < newMessages.length; i++) {
 | 
			
		||||
    const message = newMessages[i]
 | 
			
		||||
| 
						 | 
				
			
			@ -48,8 +49,10 @@ const add = (storage, { messages: newMessages }) => {
 | 
			
		|||
      storage.minId = message.id
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!storage.lastMessage || message.id > storage.lastMessage.id) {
 | 
			
		||||
      storage.lastMessage = message
 | 
			
		||||
    if (!storage.maxId || message.id > storage.maxId) {
 | 
			
		||||
      if (updateMaxId) {
 | 
			
		||||
        storage.maxId = message.id
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!storage.idIndex[message.id]) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,12 +33,12 @@ describe('chatService', () => {
 | 
			
		|||
      const chat = chatService.empty()
 | 
			
		||||
 | 
			
		||||
      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.newMessageCount).to.eql(1)
 | 
			
		||||
 | 
			
		||||
      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.newMessageCount).to.eql(2)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -60,15 +60,15 @@ describe('chatService', () => {
 | 
			
		|||
      chatService.add(chat, { messages: [ message2 ] })
 | 
			
		||||
      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)
 | 
			
		||||
 | 
			
		||||
      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)
 | 
			
		||||
 | 
			
		||||
      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)
 | 
			
		||||
    })
 | 
			
		||||
  })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue