diff --git a/app/javascript/dashboard/api/inbox/message.js b/app/javascript/dashboard/api/inbox/message.js
index 84e77fb8b..98c250e60 100644
--- a/app/javascript/dashboard/api/inbox/message.js
+++ b/app/javascript/dashboard/api/inbox/message.js
@@ -2,6 +2,33 @@
/* global axios */
import ApiClient from '../ApiClient';
+export const buildCreatePayload = ({
+ message,
+ isPrivate,
+ contentAttributes,
+ echoId,
+ file,
+}) => {
+ let payload;
+ if (file) {
+ payload = new FormData();
+ payload.append('attachments[]', file, file.name);
+ if (message) {
+ payload.append('content', message);
+ }
+ payload.append('private', isPrivate);
+ payload.append('echo_id', echoId);
+ } else {
+ payload = {
+ content: message,
+ private: isPrivate,
+ echo_id: echoId,
+ content_attributes: contentAttributes,
+ };
+ }
+ return payload;
+};
+
class MessageApi extends ApiClient {
constructor() {
super('conversations', { accountScoped: true });
@@ -15,18 +42,16 @@ class MessageApi extends ApiClient {
echo_id: echoId,
file,
}) {
- const formData = new FormData();
- if (file) formData.append('attachments[]', file, file.name);
- if (message) formData.append('content', message);
- if (contentAttributes)
- formData.append('content_attributes', JSON.stringify(contentAttributes));
-
- formData.append('private', isPrivate);
- formData.append('echo_id', echoId);
return axios({
method: 'post',
url: `${this.url}/${conversationId}/messages`,
- data: formData,
+ data: buildCreatePayload({
+ message,
+ isPrivate,
+ contentAttributes,
+ echoId,
+ file,
+ }),
});
}
diff --git a/app/javascript/dashboard/api/specs/inbox/message.spec.js b/app/javascript/dashboard/api/specs/inbox/message.spec.js
index dd4814f23..ca8d313b4 100644
--- a/app/javascript/dashboard/api/specs/inbox/message.spec.js
+++ b/app/javascript/dashboard/api/specs/inbox/message.spec.js
@@ -1,4 +1,4 @@
-import messageAPI from '../../inbox/message';
+import messageAPI, { buildCreatePayload } from '../../inbox/message';
import ApiClient from '../../ApiClient';
import describeWithAPIMock from '../apiSpecHelper';
@@ -29,4 +29,34 @@ describe('#ConversationAPI', () => {
);
});
});
+ describe('#buildCreatePayload', () => {
+ it('builds form payload if file is available', () => {
+ const formPayload = buildCreatePayload({
+ message: 'test content',
+ echoId: 12,
+ isPrivate: true,
+ file: new Blob(['test-content'], { type: 'application/pdf' }),
+ });
+ expect(formPayload).toBeInstanceOf(FormData);
+ expect(formPayload.get('content')).toEqual('test content');
+ expect(formPayload.get('echo_id')).toEqual('12');
+ expect(formPayload.get('private')).toEqual('true');
+ });
+
+ it('builds object payload if file is not available', () => {
+ expect(
+ buildCreatePayload({
+ message: 'test content',
+ isPrivate: false,
+ echoId: 12,
+ contentAttributes: { in_reply_to: 12 },
+ })
+ ).toEqual({
+ content: 'test content',
+ private: false,
+ echo_id: 12,
+ content_attributes: { in_reply_to: 12 },
+ });
+ });
+ });
});
diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue
index 440f6e1e5..01c21c53f 100644
--- a/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue
@@ -53,9 +53,7 @@ export default {
},
},
computed: {
- ...mapGetters({
- currentChat: 'getSelectedChat',
- }),
+ ...mapGetters({ currentChat: 'getSelectedChat' }),
showContactPanel() {
return this.isContactPanelOpen && this.currentChat.id;
},
diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue
index 029ab5e6a..c519f99e9 100644
--- a/app/javascript/dashboard/components/widgets/conversation/Message.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue
@@ -46,6 +46,7 @@
:message-type="data.message_type"
:readable-time="readableTime"
:source-id="data.source_id"
+ :inbox-id="data.inbox_id"
/>