Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(messagesStore): avoid usage of message.token #11370

Merged
merged 2 commits into from
Jan 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -631,10 +631,8 @@ describe('Message.vue', () => {
wrapper.findComponent(MessageButtonsBar).vm.$emit('delete')

expect(deleteMessage).toHaveBeenCalledWith(expect.anything(), {
message: {
token: TOKEN,
id: 123,
},
token: TOKEN,
id: 123,
placeholder: expect.anything(),
})

Expand Down
12 changes: 7 additions & 5 deletions src/components/MessagesList/MessagesGroup/Message/Message.vue
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,11 @@ export default {
if (this.sendingErrorCanRetry) {
if (this.sendingFailure === 'failed-upload') {
const caption = this.renderedMessage !== this.message ? this.message : undefined
this.$store.dispatch('retryUploadFiles', { uploadId: this.messageObject.uploadId, caption })
this.$store.dispatch('retryUploadFiles', {
token: this.token,
uploadId: this.messageObject.uploadId,
caption
})
} else {
EventBus.$emit('retry-message', this.id)
EventBus.$emit('focus-chat-input')
Expand Down Expand Up @@ -756,10 +760,8 @@ export default {
this.isDeleting = true
try {
const statusCode = await this.$store.dispatch('deleteMessage', {
message: {
token: this.token,
id: this.id,
},
token: this.token,
id: this.id,
placeholder: t('spreed', 'Deleting message'),
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ describe('Reactions.vue', () => {
test('dispatches store actions upon picking an emoji from the emojipicker', async () => {
// Arrange
jest.spyOn(reactionsStore, 'addReactionToMessage')
vuexStore.dispatch('processMessage', message)
vuexStore.dispatch('processMessage', { token, message })

const wrapper = shallowMount(Reactions, {
propsData: reactionsProps,
Expand Down Expand Up @@ -231,7 +231,7 @@ describe('Reactions.vue', () => {
jest.spyOn(reactionsStore, 'addReactionToMessage')
jest.spyOn(reactionsStore, 'removeReactionFromMessage')

vuexStore.dispatch('processMessage', message)
vuexStore.dispatch('processMessage', { token, message })

const wrapper = shallowMount(Reactions, {
propsData: reactionsProps,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
:key="message.id"
ref="message"
v-bind="message"
:token="token"
:is-temporary="message.timestamp === 0"
:next-message-id="(messages[index + 1] && messages[index + 1].id) || nextMessageId"
:previous-message-id="(index > 0 && messages[index - 1].id) || previousMessageId"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<ul v-if="messagesCollapsed.messages?.length > 1"
class="messages messages--header">
<Message v-bind="createCombinedSystemMessage(messagesCollapsed)"
:token="token"
is-combined-system-message
:is-combined-system-message-collapsed="messagesCollapsed.collapsed"
:next-message-id="getNextMessageId(messagesCollapsed.messages.at(-1))"
Expand All @@ -39,6 +40,7 @@
<Message v-for="message in messagesCollapsed.messages"
:key="message.id"
v-bind="message"
:token="token"
:next-message-id="getNextMessageId(message)"
:previous-message-id="getPrevMessageId(message)" />
</ul>
Expand Down
18 changes: 9 additions & 9 deletions src/components/NewMessage/NewMessage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -557,25 +557,25 @@ export default {
this.chatExtrasStore.removeParentIdToReply(this.token)

this.broadcast
? await this.broadcastMessage(temporaryMessage, options)
: await this.postMessage(temporaryMessage, options)
? await this.broadcastMessage(this.token, temporaryMessage.message)
: await this.postMessage(this.token, temporaryMessage, options)
}
},

// Post message to conversation
async postMessage(temporaryMessage, options) {
async postMessage(token, temporaryMessage, options) {
try {
await this.$store.dispatch('postNewMessage', { temporaryMessage, options })
await this.$store.dispatch('postNewMessage', { token, temporaryMessage, options })
this.$emit('sent')
} catch {
this.$emit('failure')
}
},

// Broadcast message to all breakout rooms
async broadcastMessage(temporaryMessage, options) {
async broadcastMessage(token, message) {
try {
await this.$store.dispatch('broadcastMessageToBreakoutRoomsAction', { temporaryMessage, options })
await this.$store.dispatch('broadcastMessageToBreakoutRoomsAction', { token, message })
this.$emit('sent')
} catch {
this.$emit('failure')
Expand All @@ -599,9 +599,9 @@ export default {
return new Promise(resolve => setTimeout(resolve, ms))
},

handleRetryMessage(temporaryMessageId) {
handleRetryMessage(id) {
if (this.text === '') {
const temporaryMessage = this.$store.getters.message(this.token, temporaryMessageId)
const temporaryMessage = this.$store.getters.message(this.token, id)
if (temporaryMessage) {
this.text = temporaryMessage.message || this.text

Expand All @@ -613,7 +613,7 @@ export default {
})
}

this.$store.dispatch('removeTemporaryMessageFromStore', temporaryMessage)
this.$store.dispatch('removeTemporaryMessageFromStore', { token: this.token, id })
}
}
},
Expand Down
2 changes: 1 addition & 1 deletion src/components/NewMessage/NewMessageUploadEditor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ export default {
},

handleUpload({ caption, options }) {
this.$store.dispatch('uploadFiles', { uploadId: this.currentUploadId, caption, options })
this.$store.dispatch('uploadFiles', { token: this.token, uploadId: this.currentUploadId, caption, options })
},
/**
* Clicks the hidden file input when clicking the correspondent NcActionButton,
Expand Down
5 changes: 2 additions & 3 deletions src/services/breakoutRoomsService.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,11 @@ const stopBreakoutRooms = async function(token) {
}

/**
*
* @param {string} message The message to be posted
* @param {string} token the conversation token
* @param {string} message The message to be posted
* @return {Promise<import('axios').AxiosResponse<any>>} The array of conversations
*/
const broadcastMessageToBreakoutRooms = async function(message, token) {
const broadcastMessageToBreakoutRooms = async function(token, message) {
return await axios.post(generateOcsUrl('/apps/spreed/api/v1/breakout-rooms/{token}/broadcast', {
token,
}), {
Expand Down
4 changes: 2 additions & 2 deletions src/store/breakoutRoomsStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,9 @@ const actions = {
}
},

async broadcastMessageToBreakoutRoomsAction(context, { temporaryMessage }) {
async broadcastMessageToBreakoutRoomsAction(context, { token, message }) {
try {
await broadcastMessageToBreakoutRooms(temporaryMessage.message, temporaryMessage.token)
await broadcastMessageToBreakoutRooms(token, message)
} catch (error) {
console.error(error)
showError(t('spreed', 'An error occurred while sending a message to the breakout rooms'))
Expand Down
4 changes: 2 additions & 2 deletions src/store/conversationsStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ const actions = {
chatExtrasStore.purgeChatExtras(token)
const reactionsStore = useReactionsStore()
reactionsStore.purgeReactionsStore(token)
context.dispatch('deleteMessages', token)
context.dispatch('purgeMessagesStore', token)
context.commit('deleteConversation', token)
context.dispatch('purgeParticipantsStore', token)
context.dispatch('cacheConversations')
Expand Down Expand Up @@ -456,7 +456,7 @@ const actions = {
chatExtrasStore.removeParentIdToReply(token)
const reactionsStore = useReactionsStore()
reactionsStore.purgeReactionsStore(token)
context.dispatch('deleteMessages', token)
context.dispatch('purgeMessagesStore', token)
return response
} catch (error) {
console.debug(
Expand Down
10 changes: 5 additions & 5 deletions src/store/conversationsStore.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,14 @@ describe('conversationsStore', () => {

describe('conversation list', () => {
let talkHashStore
let deleteMessagesAction
let purgeMessagesStoreAction
let checkMaintenanceModeAction
let clearMaintenanceModeAction
let updateTalkVersionHashAction

beforeEach(() => {
deleteMessagesAction = jest.fn()
testStoreConfig.modules.messagesStore.actions.deleteMessages = deleteMessagesAction
purgeMessagesStoreAction = jest.fn()
testStoreConfig.modules.messagesStore.actions.purgeMessagesStore = purgeMessagesStoreAction
talkHashStore = useTalkHashStore()
checkMaintenanceModeAction = jest.spyOn(talkHashStore, 'checkMaintenanceMode')
clearMaintenanceModeAction = jest.spyOn(talkHashStore, 'clearMaintenanceMode')
Expand Down Expand Up @@ -195,7 +195,7 @@ describe('conversationsStore', () => {
store.dispatch('addConversation', testConversation)

store.dispatch('deleteConversation', testToken)
expect(deleteMessagesAction).toHaveBeenCalled()
expect(purgeMessagesStoreAction).toHaveBeenCalled()

expect(store.getters.conversation(testToken)).toBeUndefined()

Expand Down Expand Up @@ -233,7 +233,7 @@ describe('conversationsStore', () => {

await store.dispatch('deleteConversationFromServer', { token: testToken })
expect(deleteConversation).toHaveBeenCalledWith(testToken)
expect(deleteMessagesAction).toHaveBeenCalled()
expect(purgeMessagesStoreAction).toHaveBeenCalled()

expect(store.getters.conversation(testToken)).toBeUndefined()
})
Expand Down
23 changes: 13 additions & 10 deletions src/store/fileUploadStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,12 @@ const actions = {
* @param {object} context.getters the contexts getters object.
* @param {object} context.state the contexts state object.
* @param {object} data the wrapping object
* @param {string} data.token The conversation token
* @param {string} data.uploadId The unique uploadId
* @param {string|null} data.caption The text caption to the media
* @param {object|null} data.options The share options
*/
async uploadFiles({ commit, dispatch, state, getters }, { uploadId, caption, options }) {
async uploadFiles({ commit, dispatch, state, getters }, { token, uploadId, caption, options }) {
if (state.currentUploadId === uploadId) {
commit('setCurrentUploadId', undefined)
}
Expand All @@ -316,12 +317,12 @@ const actions = {
// mark all files as uploading
commit('markFileAsUploading', { uploadId, index })
// Store the previously created temporary message
const temporaryMessage = {
const message = {
...uploadedFile.temporaryMessage,
message: index === lastIndex && caption ? caption : '{file}',
}
// Add temporary messages (files) to the messages list
dispatch('addTemporaryMessage', temporaryMessage)
dispatch('addTemporaryMessage', { token, message })
// Scroll the message list
EventBus.$emit('scroll-chat-to-bottom', { force: true })
}
Expand Down Expand Up @@ -375,7 +376,8 @@ const actions = {

// Mark the upload as failed in the store
commit('markFileAsFailedUpload', { uploadId, index })
dispatch('markTemporaryMessageAsFailed', { message: uploadedFile.temporaryMessage, uploadId, reason })
const { token, id } = uploadedFile.temporaryMessage
dispatch('markTemporaryMessageAsFailed', { token, id, uploadId, reason })
}
}

Expand All @@ -395,18 +397,18 @@ const actions = {
}
const metadata = JSON.stringify(rawMetadata)

const { token, id, referenceId } = temporaryMessage
try {
const token = temporaryMessage.token
dispatch('markFileAsSharing', { uploadId, index })
await shareFile(path, token, temporaryMessage.referenceId, metadata)
await shareFile(path, token, referenceId, metadata)
dispatch('markFileAsShared', { uploadId, index })
} catch (error) {
if (error?.response?.status === 403) {
showError(t('spreed', 'You are not allowed to share files'))
} else {
showError(t('spreed', 'An error happened when trying to share your file'))
}
dispatch('markTemporaryMessageAsFailed', { message: temporaryMessage, uploadId, reason: 'failed-share' })
dispatch('markTemporaryMessageAsFailed', { token, id, uploadId, reason: 'failed-share' })
console.error('An error happened when trying to share your file: ', error)
}
}
Expand Down Expand Up @@ -453,18 +455,19 @@ const actions = {
*
* @param {object} context default store context;
* @param {object} data payload;
* @param {string} data.token the conversation token;
* @param {string} data.uploadId the internal id of the upload;
* @param {string} [data.caption] the message caption;
*/
retryUploadFiles(context, { uploadId, caption }) {
retryUploadFiles(context, { token, uploadId, caption }) {
context.getters.getFailedUploads(uploadId).forEach(([index, file]) => {
context.dispatch('removeTemporaryMessageFromStore', file.temporaryMessage)
context.dispatch('removeTemporaryMessageFromStore', { token, id: file.temporaryMessage.id })
context.commit('markFileAsInitializedUpload', { uploadId, index })
})

if (caption) {
const chatExtrasStore = useChatExtrasStore()
chatExtrasStore.setChatInput({ token: context.getters.getToken(), text: caption })
chatExtrasStore.setChatInput({ token, text: caption })
}

context.commit('setCurrentUploadId', uploadId)
Expand Down
24 changes: 16 additions & 8 deletions src/store/fileUploadStore.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ describe('fileUploadStore', () => {
findUniquePath.mockResolvedValueOnce({ uniquePath: uniqueFileName, suffix: 1 })
shareFile.mockResolvedValue()

await store.dispatch('uploadFiles', { uploadId: 'upload-id1', caption: 'text-caption', options: { silent: true } })
await store.dispatch('uploadFiles', { token: 'XXTOKENXX', uploadId: 'upload-id1', caption: 'text-caption', options: { silent: true } })

expect(findUniquePath).toHaveBeenCalledTimes(1)
expect(findUniquePath).toHaveBeenCalledWith(client, '/files/current-user', '/Talk/' + file.name, undefined)
Expand Down Expand Up @@ -213,7 +213,7 @@ describe('fileUploadStore', () => {
.mockResolvedValueOnce({ data: { ocs: { data: { id: '1' } } } })
.mockResolvedValueOnce({ data: { ocs: { data: { id: '2' } } } })

await store.dispatch('uploadFiles', { uploadId: 'upload-id1', caption: 'text-caption', options: { silent: false } })
await store.dispatch('uploadFiles', { token: 'XXTOKENXX', uploadId: 'upload-id1', caption: 'text-caption', options: { silent: false } })

expect(findUniquePath).toHaveBeenCalledTimes(2)
expect(client.putFileContents).toHaveBeenCalledTimes(2)
Expand Down Expand Up @@ -256,15 +256,19 @@ describe('fileUploadStore', () => {
},
})

await store.dispatch('uploadFiles', { uploadId: 'upload-id1', options: { silent: false } })
await store.dispatch('uploadFiles', { token: 'XXTOKENXX', uploadId: 'upload-id1', options: { silent: false } })

expect(client.putFileContents).toHaveBeenCalledTimes(1)
expect(shareFile).not.toHaveBeenCalled()

expect(mockedActions.addTemporaryMessage).toHaveBeenCalledTimes(1)
expect(mockedActions.markTemporaryMessageAsFailed).toHaveBeenCalledTimes(1)
expect(mockedActions.markTemporaryMessageAsFailed.mock.calls[0][1].message.referenceId).toBe('reference-id-1')
expect(mockedActions.markTemporaryMessageAsFailed.mock.calls[0][1].reason).toBe('failed-upload')
expect(mockedActions.markTemporaryMessageAsFailed).toHaveBeenCalledWith(expect.anything(), {
token: 'XXTOKENXX',
id: 1,
uploadId: 'upload-id1',
reason: 'failed-upload'
})
expect(showError).toHaveBeenCalled()
expect(console.error).toHaveBeenCalled()
})
Expand Down Expand Up @@ -293,15 +297,19 @@ describe('fileUploadStore', () => {
},
})

await store.dispatch('uploadFiles', { uploadId: 'upload-id1', options: { silent: false } })
await store.dispatch('uploadFiles', { token: 'XXTOKENXX', uploadId: 'upload-id1', options: { silent: false } })

expect(client.putFileContents).toHaveBeenCalledTimes(1)
expect(shareFile).toHaveBeenCalledTimes(1)

expect(mockedActions.addTemporaryMessage).toHaveBeenCalledTimes(1)
expect(mockedActions.markTemporaryMessageAsFailed).toHaveBeenCalledTimes(1)
expect(mockedActions.markTemporaryMessageAsFailed.mock.calls[0][1].message.referenceId).toBe('reference-id-1')
expect(mockedActions.markTemporaryMessageAsFailed.mock.calls[0][1].reason).toBe('failed-share')
expect(mockedActions.markTemporaryMessageAsFailed).toHaveBeenCalledWith(expect.anything(), {
token: 'XXTOKENXX',
id: 1,
uploadId: 'upload-id1',
reason: 'failed-share'
})
expect(showError).toHaveBeenCalled()
expect(console.error).toHaveBeenCalled()
})
Expand Down
Loading
Loading