Revert "feat: Updates widget message state to support multiple conversations"
This reverts commit a34bb565af.
This commit is contained in:
60
app/javascript/widget/store/modules/message.js
Normal file
60
app/javascript/widget/store/modules/message.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import MessageAPI from '../../api/message';
|
||||||
|
import { refreshActionCableConnector } from '../../helpers/actionCable';
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
uiFlags: {
|
||||||
|
isUpdating: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getters = {
|
||||||
|
getUIFlags: $state => $state.uiFlags,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const actions = {
|
||||||
|
update: async (
|
||||||
|
{ commit, dispatch },
|
||||||
|
{ email, messageId, submittedValues }
|
||||||
|
) => {
|
||||||
|
commit('toggleUpdateStatus', true);
|
||||||
|
try {
|
||||||
|
const {
|
||||||
|
data: { contact: { pubsub_token: pubsubToken } = {} },
|
||||||
|
} = await MessageAPI.update({
|
||||||
|
email,
|
||||||
|
messageId,
|
||||||
|
values: submittedValues,
|
||||||
|
});
|
||||||
|
commit(
|
||||||
|
'conversation/updateMessage',
|
||||||
|
{
|
||||||
|
id: messageId,
|
||||||
|
content_attributes: {
|
||||||
|
submitted_email: email,
|
||||||
|
submitted_values: email ? null : submittedValues,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ root: true }
|
||||||
|
);
|
||||||
|
dispatch('contacts/get', {}, { root: true });
|
||||||
|
refreshActionCableConnector(pubsubToken);
|
||||||
|
} catch (error) {
|
||||||
|
// Ignore error
|
||||||
|
}
|
||||||
|
commit('toggleUpdateStatus', false);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const mutations = {
|
||||||
|
toggleUpdateStatus($state, status) {
|
||||||
|
$state.uiFlags.isUpdating = status;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
namespaced: true,
|
||||||
|
state,
|
||||||
|
getters,
|
||||||
|
actions,
|
||||||
|
mutations,
|
||||||
|
};
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
import MessagePublicAPI from 'widget/api/messagePublic';
|
|
||||||
import { refreshActionCableConnector } from 'widget/helpers/actionCable';
|
|
||||||
import {
|
|
||||||
createTemporaryMessage,
|
|
||||||
createTemporaryAttachmentMessage,
|
|
||||||
createAttachmentParams,
|
|
||||||
} from './helpers';
|
|
||||||
|
|
||||||
export const actions = {
|
|
||||||
addOrUpdate: async ({ commit, getters }, message) => {
|
|
||||||
const {
|
|
||||||
conversation_id: conversationId,
|
|
||||||
id: messageId,
|
|
||||||
echo_id: echoId,
|
|
||||||
} = message;
|
|
||||||
|
|
||||||
const messageIdInStore = echoId || messageId;
|
|
||||||
const doesMessageExist = getters.messageById(messageIdInStore);
|
|
||||||
|
|
||||||
if (doesMessageExist) {
|
|
||||||
commit(
|
|
||||||
'conversationV2/removeMessageIdFromConversation',
|
|
||||||
{ conversationId, messageId: echoId },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
commit('removeMessageEntry', echoId);
|
|
||||||
commit('removeMessageId', echoId);
|
|
||||||
}
|
|
||||||
const messages = [message];
|
|
||||||
commit('addMessagesEntry', { conversationId, messages });
|
|
||||||
commit('addMessageIds', { messages });
|
|
||||||
commit(
|
|
||||||
'conversationV2/appendMessageIdsToConversation',
|
|
||||||
{ conversationId, messages },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
},
|
|
||||||
sendMessage: async ({ commit, dispatch }, params) => {
|
|
||||||
const { content, conversationId } = params;
|
|
||||||
try {
|
|
||||||
commit(
|
|
||||||
'conversationV2/setConversationUIFlag',
|
|
||||||
{ uiFlags: { isCreating: true }, conversationId },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
|
|
||||||
const message = createTemporaryMessage({ content });
|
|
||||||
const { id: echoId } = message;
|
|
||||||
const messages = [message];
|
|
||||||
commit('addMessagesEntry', { messages });
|
|
||||||
commit('addMessageIds', { messages });
|
|
||||||
commit(
|
|
||||||
'conversationV2/appendMessageIdsToConversation',
|
|
||||||
{ conversationId, messages },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
const { data: newMessage } = await MessagePublicAPI.create(
|
|
||||||
conversationId,
|
|
||||||
content,
|
|
||||||
echoId
|
|
||||||
);
|
|
||||||
|
|
||||||
dispatch('addOrUpdate', {
|
|
||||||
...newMessage,
|
|
||||||
echo_id: echoId,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
throw new Error(error);
|
|
||||||
} finally {
|
|
||||||
commit(
|
|
||||||
'conversationV2/setConversationUIFlag',
|
|
||||||
{ uiFlags: { isCreating: false }, conversationId },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
sendAttachment: async ({ commit, dispatch }, params) => {
|
|
||||||
const {
|
|
||||||
attachment: { thumbUrl, fileType },
|
|
||||||
conversationId,
|
|
||||||
} = params;
|
|
||||||
try {
|
|
||||||
commit(
|
|
||||||
'conversationV2/setConversationUIFlag',
|
|
||||||
{ uiFlags: { isCreating: true }, conversationId },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
|
|
||||||
const tempMessage = createTemporaryAttachmentMessage({
|
|
||||||
thumbUrl,
|
|
||||||
fileType,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { id: echoId } = tempMessage;
|
|
||||||
const messages = [tempMessage];
|
|
||||||
const attachmentParams = createAttachmentParams(params);
|
|
||||||
|
|
||||||
commit('addMessagesEntry', { conversationId, messages });
|
|
||||||
commit('addMessageIds', { conversationId, messages });
|
|
||||||
commit(
|
|
||||||
'conversationV2/appendMessageIdsToConversation',
|
|
||||||
{ conversationId, messages },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
|
|
||||||
const { data } = await MessagePublicAPI.createAttachment(
|
|
||||||
conversationId,
|
|
||||||
attachmentParams
|
|
||||||
);
|
|
||||||
dispatch('addOrUpdate', { ...data, echo_id: echoId });
|
|
||||||
} catch (error) {
|
|
||||||
throw new Error(error);
|
|
||||||
} finally {
|
|
||||||
commit(
|
|
||||||
'conversationV2/setConversationUIFlag',
|
|
||||||
{ uiFlags: { isCreating: false }, conversationId },
|
|
||||||
{ root: true }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
updateMessage: async (
|
|
||||||
{ commit, dispatch },
|
|
||||||
{ email, messageId, submittedValues }
|
|
||||||
) => {
|
|
||||||
try {
|
|
||||||
commit('setMessageUIFlag', {
|
|
||||||
messageId,
|
|
||||||
uiFlags: { isUpdating: true },
|
|
||||||
});
|
|
||||||
const {
|
|
||||||
data: { contact: { pubsub_token: pubsubToken } = {} },
|
|
||||||
} = await MessagePublicAPI.update({
|
|
||||||
email,
|
|
||||||
messageId,
|
|
||||||
values: submittedValues,
|
|
||||||
});
|
|
||||||
commit('updateMessageEntry', {
|
|
||||||
id: messageId,
|
|
||||||
content_attributes: {
|
|
||||||
submitted_email: email,
|
|
||||||
submitted_values: email ? null : submittedValues,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
dispatch('contacts/get', {}, { root: true });
|
|
||||||
refreshActionCableConnector(pubsubToken);
|
|
||||||
} catch (error) {
|
|
||||||
throw new Error(error);
|
|
||||||
} finally {
|
|
||||||
commit('setMessageUIFlag', {
|
|
||||||
messageId,
|
|
||||||
uiFlags: { isUpdating: false },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
export const getters = {
|
|
||||||
uIFlags: $state => $state.uiFlags,
|
|
||||||
messageById: _state => messageId => {
|
|
||||||
const message = _state.messages.byId[messageId];
|
|
||||||
return message;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import { MESSAGE_TYPE } from 'widget/helpers/constants';
|
|
||||||
import getUuid from '../../../helpers/uuid';
|
|
||||||
|
|
||||||
export const createTemporaryMessage = ({ attachments, content }) => {
|
|
||||||
const timestamp = new Date().getTime() / 1000;
|
|
||||||
return {
|
|
||||||
id: getUuid(),
|
|
||||||
content,
|
|
||||||
attachments,
|
|
||||||
status: 'in_progress',
|
|
||||||
created_at: timestamp,
|
|
||||||
message_type: MESSAGE_TYPE.INCOMING,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const createTemporaryAttachmentMessage = ({
|
|
||||||
thumbUrl,
|
|
||||||
fileType,
|
|
||||||
content,
|
|
||||||
}) => {
|
|
||||||
const attachment = {
|
|
||||||
thumb_url: thumbUrl,
|
|
||||||
data_url: thumbUrl,
|
|
||||||
file_type: fileType,
|
|
||||||
status: 'in_progress',
|
|
||||||
};
|
|
||||||
const message = createTemporaryMessage({
|
|
||||||
attachments: [attachment],
|
|
||||||
content,
|
|
||||||
});
|
|
||||||
return message;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const createAttachmentParams = ({ attachment }) => {
|
|
||||||
const { referrerURL = '' } = window;
|
|
||||||
const timestamp = new Date().toString();
|
|
||||||
const { file } = attachment;
|
|
||||||
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('message[attachments][]', file, file.name);
|
|
||||||
formData.append('message[referer_url]', referrerURL);
|
|
||||||
formData.append('message[timestamp]', timestamp);
|
|
||||||
return formData;
|
|
||||||
};
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
import { getters } from './getters';
|
|
||||||
import { actions } from './actions';
|
|
||||||
import { mutations } from './mutations';
|
|
||||||
|
|
||||||
const state = {
|
|
||||||
messages: {
|
|
||||||
byId: {},
|
|
||||||
allIds: [],
|
|
||||||
uiFlags: {
|
|
||||||
byId: {
|
|
||||||
// 1: { isCreating: false, isPending: false, isDeleting: false, isUpdating: false },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default {
|
|
||||||
namespaced: true,
|
|
||||||
state,
|
|
||||||
getters,
|
|
||||||
actions,
|
|
||||||
mutations,
|
|
||||||
};
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
import Vue from 'vue';
|
|
||||||
|
|
||||||
export const mutations = {
|
|
||||||
addMessagesEntry($state, { messages = [] }) {
|
|
||||||
messages.forEach(message => {
|
|
||||||
Vue.set($state.messages.byId, message.id, message);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
addMessageIds($state, { messages }) {
|
|
||||||
const messageIds = messages.map(message => message.id);
|
|
||||||
const allIds = $state.messages.allIds;
|
|
||||||
const newIds = [allIds, messageIds];
|
|
||||||
const uniqIds = Array.from(new Set(newIds));
|
|
||||||
|
|
||||||
Vue.set($state.messages, 'allIds', uniqIds);
|
|
||||||
},
|
|
||||||
|
|
||||||
updateMessageEntry($state, message) {
|
|
||||||
const messageId = message.id;
|
|
||||||
if (!messageId) return;
|
|
||||||
|
|
||||||
const messageById = $state.messages.byId[messageId];
|
|
||||||
if (!messageById) return;
|
|
||||||
if (messageId !== message.id) return;
|
|
||||||
|
|
||||||
Vue.set($state.messages.byId, messageId, { ...message });
|
|
||||||
},
|
|
||||||
|
|
||||||
removeMessageEntry($state, messageId) {
|
|
||||||
if (!messageId) return;
|
|
||||||
|
|
||||||
Vue.delete($state.messages.byId, messageId);
|
|
||||||
},
|
|
||||||
|
|
||||||
removeMessageId($state, messageId) {
|
|
||||||
if (!messageId) return;
|
|
||||||
|
|
||||||
$state.messages.allIds = $state.messages.allIds.filter(
|
|
||||||
id => id !== messageId
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
setMessageUIFlag($state, { messageId, uiFlags }) {
|
|
||||||
const flags = $state.messages.uiFlags.byId[messageId];
|
|
||||||
$state.messages.uiFlags.byId[messageId] = {
|
|
||||||
...flags,
|
|
||||||
...uiFlags,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user