283 lines
7.4 KiB
JavaScript
283 lines
7.4 KiB
JavaScript
import Vue from 'vue';
|
|
import * as types from '../../mutation-types';
|
|
import ConversationApi from '../../../api/inbox/conversation';
|
|
import MessageApi from '../../../api/inbox/message';
|
|
import { MESSAGE_STATUS, MESSAGE_TYPE } from 'shared/constants/messages';
|
|
import { createPendingMessage } from 'dashboard/helper/commons';
|
|
|
|
// actions
|
|
const actions = {
|
|
getConversation: async ({ commit }, conversationId) => {
|
|
try {
|
|
const response = await ConversationApi.show(conversationId);
|
|
commit(types.default.UPDATE_CONVERSATION, response.data);
|
|
commit(
|
|
`contacts/${types.default.SET_CONTACT_ITEM}`,
|
|
response.data.meta.sender
|
|
);
|
|
} catch (error) {
|
|
// Ignore error
|
|
}
|
|
},
|
|
|
|
fetchAllConversations: async ({ commit, dispatch }, params) => {
|
|
commit(types.default.SET_LIST_LOADING_STATUS);
|
|
try {
|
|
const response = await ConversationApi.get(params);
|
|
const { data } = response.data;
|
|
const { payload: chatList, meta: metaData } = data;
|
|
commit(types.default.SET_ALL_CONVERSATION, chatList);
|
|
dispatch('conversationStats/set', metaData);
|
|
dispatch('conversationLabels/setBulkConversationLabels', chatList);
|
|
commit(types.default.CLEAR_LIST_LOADING_STATUS);
|
|
commit(
|
|
`contacts/${types.default.SET_CONTACTS}`,
|
|
chatList.map(chat => chat.meta.sender)
|
|
);
|
|
dispatch(
|
|
'conversationPage/setCurrentPage',
|
|
{
|
|
filter: params.assigneeType,
|
|
page: params.page,
|
|
},
|
|
{ root: true }
|
|
);
|
|
if (!chatList.length) {
|
|
dispatch(
|
|
'conversationPage/setEndReached',
|
|
{ filter: params.assigneeType },
|
|
{ root: true }
|
|
);
|
|
}
|
|
} catch (error) {
|
|
// Handle error
|
|
}
|
|
},
|
|
|
|
emptyAllConversations({ commit }) {
|
|
commit(types.default.EMPTY_ALL_CONVERSATION);
|
|
},
|
|
|
|
clearSelectedState({ commit }) {
|
|
commit(types.default.CLEAR_CURRENT_CHAT_WINDOW);
|
|
},
|
|
|
|
fetchPreviousMessages: async ({ commit }, data) => {
|
|
try {
|
|
const {
|
|
data: { meta, payload },
|
|
} = await MessageApi.getPreviousMessages(data);
|
|
commit(
|
|
`conversationMetadata/${types.default.SET_CONVERSATION_METADATA}`,
|
|
{
|
|
id: data.conversationId,
|
|
data: meta,
|
|
}
|
|
);
|
|
commit(types.default.SET_PREVIOUS_CONVERSATIONS, {
|
|
id: data.conversationId,
|
|
data: payload,
|
|
});
|
|
if (payload.length < 20) {
|
|
commit(types.default.SET_ALL_MESSAGES_LOADED);
|
|
}
|
|
} catch (error) {
|
|
// Handle error
|
|
}
|
|
},
|
|
|
|
async setActiveChat({ commit, dispatch }, data) {
|
|
commit(types.default.SET_CURRENT_CHAT_WINDOW, data);
|
|
commit(types.default.CLEAR_ALL_MESSAGES_LOADED);
|
|
|
|
if (data.dataFetched === undefined) {
|
|
try {
|
|
await dispatch('fetchPreviousMessages', {
|
|
conversationId: data.id,
|
|
before: data.messages[0].id,
|
|
});
|
|
Vue.set(data, 'dataFetched', true);
|
|
} catch (error) {
|
|
// Ignore error
|
|
}
|
|
}
|
|
},
|
|
|
|
assignAgent: async ({ dispatch }, { conversationId, agentId }) => {
|
|
try {
|
|
const response = await ConversationApi.assignAgent({
|
|
conversationId,
|
|
agentId,
|
|
});
|
|
dispatch('setCurrentChatAssignee', response.data);
|
|
} catch (error) {
|
|
// Handle error
|
|
}
|
|
},
|
|
|
|
setCurrentChatAssignee({ commit }, assignee) {
|
|
commit(types.default.ASSIGN_AGENT, assignee);
|
|
},
|
|
|
|
assignTeam: async ({ dispatch }, { conversationId, teamId }) => {
|
|
try {
|
|
const response = await ConversationApi.assignTeam({
|
|
conversationId,
|
|
teamId,
|
|
});
|
|
dispatch('setCurrentChatTeam', response.data);
|
|
} catch (error) {
|
|
// Handle error
|
|
}
|
|
},
|
|
|
|
setCurrentChatTeam({ commit }, team) {
|
|
commit(types.default.ASSIGN_TEAM, team);
|
|
},
|
|
|
|
toggleStatus: async (
|
|
{ commit },
|
|
{ conversationId, status, snoozedUntil = null }
|
|
) => {
|
|
try {
|
|
const response = await ConversationApi.toggleStatus({
|
|
conversationId,
|
|
status,
|
|
snoozedUntil,
|
|
});
|
|
commit(types.default.RESOLVE_CONVERSATION, {
|
|
conversationId,
|
|
status: response.data.payload.current_status,
|
|
});
|
|
} catch (error) {
|
|
// Handle error
|
|
}
|
|
},
|
|
|
|
sendMessage: async ({ commit }, data) => {
|
|
try {
|
|
const pendingMessage = createPendingMessage(data);
|
|
commit(types.default.ADD_MESSAGE, pendingMessage);
|
|
const response = await MessageApi.create(pendingMessage);
|
|
commit(types.default.ADD_MESSAGE, {
|
|
...response.data,
|
|
status: MESSAGE_STATUS.SENT,
|
|
});
|
|
} catch (error) {
|
|
// Handle error
|
|
}
|
|
},
|
|
|
|
addMessage({ commit }, message) {
|
|
commit(types.default.ADD_MESSAGE, message);
|
|
if (message.message_type === MESSAGE_TYPE.INCOMING) {
|
|
commit(types.default.SET_CONVERSATION_CAN_REPLY, {
|
|
conversationId: message.conversation_id,
|
|
canReply: true,
|
|
});
|
|
}
|
|
},
|
|
|
|
updateMessage({ commit }, message) {
|
|
commit(types.default.ADD_MESSAGE, message);
|
|
},
|
|
|
|
deleteMessage: async function deleteLabels(
|
|
{ commit },
|
|
{ conversationId, messageId }
|
|
) {
|
|
try {
|
|
const response = await MessageApi.delete(conversationId, messageId);
|
|
const { data } = response;
|
|
// The delete message is actually deleting the content.
|
|
commit(types.default.ADD_MESSAGE, data);
|
|
} catch (error) {
|
|
throw new Error(error);
|
|
}
|
|
},
|
|
|
|
addConversation({ commit, state, dispatch }, conversation) {
|
|
const { currentInbox } = state;
|
|
const {
|
|
inbox_id: inboxId,
|
|
meta: { sender },
|
|
} = conversation;
|
|
if (!currentInbox || Number(currentInbox) === inboxId) {
|
|
commit(types.default.ADD_CONVERSATION, conversation);
|
|
dispatch('contacts/setContact', sender);
|
|
}
|
|
},
|
|
|
|
updateConversation({ commit, dispatch }, conversation) {
|
|
const {
|
|
meta: { sender },
|
|
} = conversation;
|
|
commit(types.default.UPDATE_CONVERSATION, conversation);
|
|
dispatch('contacts/setContact', sender);
|
|
},
|
|
|
|
markMessagesRead: async ({ commit }, data) => {
|
|
try {
|
|
const {
|
|
data: { id, agent_last_seen_at: lastSeen },
|
|
} = await ConversationApi.markMessageRead(data);
|
|
setTimeout(
|
|
() =>
|
|
commit(types.default.MARK_MESSAGE_READ, {
|
|
id,
|
|
lastSeen,
|
|
}),
|
|
4000
|
|
);
|
|
} catch (error) {
|
|
// Handle error
|
|
}
|
|
},
|
|
|
|
setChatFilter({ commit }, data) {
|
|
commit(types.default.CHANGE_CHAT_STATUS_FILTER, data);
|
|
},
|
|
|
|
updateAssignee({ commit }, data) {
|
|
commit(types.default.UPDATE_ASSIGNEE, data);
|
|
},
|
|
|
|
updateConversationContact({ commit }, data) {
|
|
if (data.id) {
|
|
commit(`contacts/${types.default.SET_CONTACT_ITEM}`, data);
|
|
}
|
|
commit(types.default.UPDATE_CONVERSATION_CONTACT, data);
|
|
},
|
|
|
|
setActiveInbox({ commit }, inboxId) {
|
|
commit(types.default.SET_ACTIVE_INBOX, inboxId);
|
|
},
|
|
|
|
muteConversation: async ({ commit }, conversationId) => {
|
|
try {
|
|
await ConversationApi.mute(conversationId);
|
|
commit(types.default.MUTE_CONVERSATION);
|
|
} catch (error) {
|
|
//
|
|
}
|
|
},
|
|
|
|
unmuteConversation: async ({ commit }, conversationId) => {
|
|
try {
|
|
await ConversationApi.unmute(conversationId);
|
|
commit(types.default.UNMUTE_CONVERSATION);
|
|
} catch (error) {
|
|
//
|
|
}
|
|
},
|
|
|
|
sendEmailTranscript: async (_, { conversationId, email }) => {
|
|
try {
|
|
await ConversationApi.sendEmailTranscript({ conversationId, email });
|
|
} catch (error) {
|
|
throw new Error(error);
|
|
}
|
|
},
|
|
};
|
|
|
|
export default actions;
|