diff --git a/app/javascript/widget/components/UserMessage.vue b/app/javascript/widget/components/UserMessage.vue
index 8dea5f14b..a07f9b05b 100755
--- a/app/javascript/widget/components/UserMessage.vue
+++ b/app/javascript/widget/components/UserMessage.vue
@@ -6,8 +6,14 @@
:message="message.content"
:status="message.status"
/>
-
+
+
import UserMessageBubble from 'widget/components/UserMessageBubble';
import ImageBubble from 'widget/components/ImageBubble';
+import FileBubble from 'widget/components/FileBubble';
import timeMixin from 'dashboard/mixins/time';
export default {
@@ -27,6 +34,7 @@ export default {
components: {
UserMessageBubble,
ImageBubble,
+ FileBubble,
},
mixins: [timeMixin],
props: {
@@ -40,11 +48,8 @@ export default {
const { status = '' } = this.message;
return status === 'in_progress';
},
- hasImage() {
- const { attachment = {} } = this.message;
- const { file_type: fileType } = attachment;
-
- return fileType === 'image';
+ hasAttachment() {
+ return !!this.message.attachment;
},
showTextBubble() {
const { message } = this;
@@ -94,5 +99,14 @@ export default {
padding: 0;
overflow: hidden;
}
+ .user.has-attachment {
+ .icon-wrap {
+ color: $color-white;
+ }
+
+ .download {
+ opacity: 0.8;
+ }
+ }
}
diff --git a/app/javascript/widget/components/UserMessageBubble.vue b/app/javascript/widget/components/UserMessageBubble.vue
index bcaca86f9..a6a07135f 100755
--- a/app/javascript/widget/components/UserMessageBubble.vue
+++ b/app/javascript/widget/components/UserMessageBubble.vue
@@ -45,7 +45,6 @@ export default {
display: inline-block;
font-size: $font-size-default;
line-height: 1.5;
- max-width: 80%;
padding: $space-small $space-normal;
text-align: left;
diff --git a/app/javascript/widget/i18n/en.js b/app/javascript/widget/i18n/en.js
new file mode 100644
index 000000000..c8aadd8da
--- /dev/null
+++ b/app/javascript/widget/i18n/en.js
@@ -0,0 +1,8 @@
+export default {
+ COMPONENTS: {
+ FILE_BUBBLE: {
+ DOWNLOAD: 'Download',
+ UPLOADING: 'Uploading...',
+ },
+ },
+};
diff --git a/app/javascript/widget/i18n/index.js b/app/javascript/widget/i18n/index.js
new file mode 100644
index 000000000..f74d0b793
--- /dev/null
+++ b/app/javascript/widget/i18n/index.js
@@ -0,0 +1,5 @@
+import en from './en';
+
+export default {
+ en,
+};
diff --git a/app/javascript/widget/store/modules/conversation.js b/app/javascript/widget/store/modules/conversation.js
index 09d172ab9..4388f6052 100755
--- a/app/javascript/widget/store/modules/conversation.js
+++ b/app/javascript/widget/store/modules/conversation.js
@@ -88,15 +88,16 @@ export const actions = {
},
sendAttachment: async ({ commit }, params) => {
- const { attachment } = params;
- const { thumbUrl } = attachment;
- const attachmentBlob = {
+ const {
+ attachment: { thumbUrl, fileType },
+ } = params;
+ const attachment = {
thumb_url: thumbUrl,
data_url: thumbUrl,
- file_type: 'image',
+ file_type: fileType,
status: 'in_progress',
};
- const tempMessage = createTemporaryMessage({ attachment: attachmentBlob });
+ const tempMessage = createTemporaryMessage({ attachment });
commit('pushMessageToConversation', tempMessage);
try {
const { data } = await sendAttachmentAPI(params);
@@ -158,8 +159,16 @@ export const mutations = {
if (messageInConversation) {
Vue.delete(messagesInbox, tempId);
- const newMessage = { ...messageInConversation };
- Vue.set(messagesInbox, id, { ...newMessage, id, status });
+ const { attachment } = messageInConversation;
+ if (attachment.file_type === 'file') {
+ attachment.data_url = message.attachment.data_url;
+ }
+ Vue.set(messagesInbox, id, {
+ ...messageInConversation,
+ attachment,
+ id,
+ status,
+ });
}
},
diff --git a/app/javascript/widget/store/modules/specs/conversation/actions.spec.js b/app/javascript/widget/store/modules/specs/conversation/actions.spec.js
index c2f8c9a90..1cf371e89 100644
--- a/app/javascript/widget/store/modules/specs/conversation/actions.spec.js
+++ b/app/javascript/widget/store/modules/specs/conversation/actions.spec.js
@@ -49,7 +49,7 @@ describe('#actions', () => {
getUuid.mockImplementationOnce(() => '1111');
const spy = jest.spyOn(global, 'Date').mockImplementation(() => mockDate);
const thumbUrl = '';
- const attachment = { thumbUrl };
+ const attachment = { thumbUrl, fileType: 'file' };
actions.sendAttachment({ commit }, { attachment });
spy.mockRestore();
@@ -62,7 +62,7 @@ describe('#actions', () => {
attachment: {
thumb_url: '',
data_url: '',
- file_type: 'image',
+ file_type: 'file',
status: 'in_progress',
},
});
diff --git a/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js b/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js
index 4c3c7ae18..3a99b509f 100644
--- a/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js
+++ b/app/javascript/widget/store/modules/specs/conversation/mutations.spec.js
@@ -102,6 +102,10 @@ describe('#mutations', () => {
id: 'rand_id_123',
message_type: 0,
status: 'in_progress',
+ attachment: {
+ file: '',
+ file_type: 'image',
+ },
},
},
};
@@ -109,11 +113,24 @@ describe('#mutations', () => {
id: '1',
content: '',
status: 'sent',
+ attachment: {
+ file: '',
+ file_type: 'image',
+ },
};
mutations.setMessageStatus(state, { message, tempId: 'rand_id_123' });
expect(state.conversations).toEqual({
- 1: { id: '1', content: '', message_type: 0, status: 'sent' },
+ 1: {
+ id: '1',
+ content: '',
+ message_type: 0,
+ status: 'sent',
+ attachment: {
+ file: '',
+ file_type: 'image',
+ },
+ },
});
});
});
diff --git a/app/views/api/v1/widget/messages/create.json.jbuilder b/app/views/api/v1/widget/messages/create.json.jbuilder
new file mode 100644
index 000000000..051a911e7
--- /dev/null
+++ b/app/views/api/v1/widget/messages/create.json.jbuilder
@@ -0,0 +1,10 @@
+json.id @message.id
+json.content @message.content
+json.inbox_id @message.inbox_id
+json.conversation_id @message.conversation.display_id
+json.message_type @message.message_type_before_type_cast
+json.created_at @message.created_at.to_i
+json.private @message.private
+json.source_id @message.source_id
+json.attachment @message.attachment.push_event_data if @message.attachment
+json.sender @message.user.push_event_data if @message.user
diff --git a/app/views/api/v1/widget/messages/index.json.jbuilder b/app/views/api/v1/widget/messages/index.json.jbuilder
index 1f423beb1..c39ed54b8 100644
--- a/app/views/api/v1/widget/messages/index.json.jbuilder
+++ b/app/views/api/v1/widget/messages/index.json.jbuilder
@@ -5,7 +5,7 @@ json.array! @messages do |message|
json.content_type message.content_type
json.content_attributes message.content_attributes
json.created_at message.created_at.to_i
- json.conversation_id message. conversation_id
+ json.conversation_id message.conversation.display_id
json.attachment message.attachment.push_event_data if message.attachment
json.sender message.user.push_event_data if message.user
end
diff --git a/spec/controllers/api/v1/accounts/conversations/messages_controller_spec.rb b/spec/controllers/api/v1/accounts/conversations/messages_controller_spec.rb
index 226f4b14c..9f21f1fae 100644
--- a/spec/controllers/api/v1/accounts/conversations/messages_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/conversations/messages_controller_spec.rb
@@ -41,6 +41,7 @@ RSpec.describe 'Conversation Messages API', type: :request do
expect(response).to have_http_status(:success)
expect(conversation.messages.last.attachment.file.present?).to eq(true)
+ expect(conversation.messages.last.attachment.file_type).to eq('image')
end
end
diff --git a/spec/controllers/api/v1/widget/messages_controller_spec.rb b/spec/controllers/api/v1/widget/messages_controller_spec.rb
index 109bc2ccc..764705fa4 100644
--- a/spec/controllers/api/v1/widget/messages_controller_spec.rb
+++ b/spec/controllers/api/v1/widget/messages_controller_spec.rb
@@ -57,6 +57,7 @@ RSpec.describe '/api/v1/widget/messages', type: :request do
expect(json_response['content']).to eq(message_params[:content])
expect(conversation.messages.last.attachment.file.present?).to eq(true)
+ expect(conversation.messages.last.attachment.file_type).to eq('image')
end
end
end