1
0
Fork 0
mirror of https://akkoma.dev/AkkomaGang/akkoma-fe synced 2025-06-08 17:29:12 +08:00

Merge branch 'fix-chat-message-list-fetch' into 'develop'

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

Closes 

See merge request 
This commit is contained in:
Shpuld Shpludson 2020-09-16 07:13:31 +00:00
commit 38189ee838
4 changed files with 26 additions and 33 deletions
src
components/chat
modules
services/chat_service
test/unit/specs/services/chat_service

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

@ -182,30 +182,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)
}) })
}) })