diff options
Diffstat (limited to 'src/store/messagesStore.js')
-rw-r--r-- | src/store/messagesStore.js | 101 |
1 files changed, 100 insertions, 1 deletions
diff --git a/src/store/messagesStore.js b/src/store/messagesStore.js index 3c08544e3..3dd4833d3 100644 --- a/src/store/messagesStore.js +++ b/src/store/messagesStore.js @@ -27,6 +27,8 @@ import { lookForNewMessages, postNewMessage, postRichObjectToConversation, + addReactionToMessage, + removeReactionFromMessage, } from '../services/messagesService' import SHA256 from 'crypto-js/sha256' @@ -138,7 +140,14 @@ const getters = { */ messagesList: (state) => (token) => { if (state.messages[token]) { - return Object.values(state.messages[token]) + return Object.values(state.messages[token]).filter(message => { + // Filter out reaction messages + if (message.systemMessage === 'reaction' || message.systemMessage === 'reaction_deleted' || message.systemMessage === 'reaction_revoked') { + return false + } else { + return true + } + }) } return [] }, @@ -191,6 +200,11 @@ const getters = { // the cancel handler only exists when a message is being sent return Object.keys(state.cancelPostNewMessage).length !== 0 }, + + // Returns true if the message has reactions + hasReactions: (state) => (token, messageId) => { + return Object.keys(state.messages[token][messageId].reactions).length !== 0 + }, } const mutations = { @@ -333,6 +347,24 @@ const mutations = { Vue.delete(state.messages, token) } }, + + // Increases reaction count for a particular reaction on a message + addReactionToMessage(state, { token, messageId, reaction }) { + if (!state.messages[token][messageId].reactions[reaction]) { + Vue.set(state.messages[token][messageId].reactions, reaction, 0) + } + const reactionCount = state.messages[token][messageId].reactions[reaction] + 1 + Vue.set(state.messages[token][messageId].reactions, reaction, reactionCount) + }, + + // Decreases reaction count for a particular reaction on a message + removeReactionFromMessage(state, { token, messageId, reaction }) { + const reactionCount = state.messages[token][messageId].reactions[reaction] - 1 + Vue.set(state.messages[token][messageId].reactions, reaction, reactionCount) + if (state.messages[token][messageId].reactions[reaction] <= 0) { + Vue.delete(state.messages[token][messageId].reactions, reaction) + } + }, } const actions = { @@ -442,6 +474,7 @@ const actions = { token, isReplyable: false, sendingFailure: '', + reactions: {}, referenceId: Hex.stringify(SHA256(tempId)), }) @@ -931,6 +964,72 @@ const actions = { const response = await postRichObjectToConversation(token, richObject) return response }, + + /** + * Adds a single reaction to a message for the current user. + * + * @param {*} context the context object + * @param {*} param1 conversation token, message id and selected emoji (string) + */ + async addReactionToMessage(context, { token, messageId, selectedEmoji }) { + try { + context.commit('addReactionToMessage', { + token, + messageId, + reaction: selectedEmoji, + }) + // The response return an array with the reaction details for this message + const response = await addReactionToMessage(token, messageId, selectedEmoji) + // We replace the reaction details in the reactions store and wipe the old + // values + context.dispatch('updateReactions', { + token, + messageId, + reactionsDetails: response.data.ocs.data, + }) + } catch (error) { + // Restore the previous state if the request fails + context.commit('removeReactionFromMessage', { + token, + messageId, + reaction: selectedEmoji, + }) + console.debug(error) + } + }, + + /** + * Removes a single reaction from a message for the current user. + * + * @param {*} context the context object + * @param {*} param1 conversation token, message id and selected emoji (string) + */ + async removeReactionFromMessage(context, { token, messageId, selectedEmoji }) { + try { + context.commit('removeReactionFromMessage', { + token, + messageId, + reaction: selectedEmoji, + }) + // The response return an array with the reaction details for this message + const response = await removeReactionFromMessage(token, messageId, selectedEmoji) + // We replace the reaction details in the reactions store and wipe the old + // values + context.dispatch('updateReactions', { + token, + messageId, + reactionsDetails: response.data.ocs.data, + }) + } catch (error) { + // Restore the previous state if the request fails + context.commit('addReactionToMessage', { + token, + messageId, + reaction: selectedEmoji, + }) + console.debug(error) + } + }, } export default { state, mutations, getters, actions } |