fix: Fix bot message rendering in dashboard (#1743)
This commit is contained in:
parent
88fd2c22d3
commit
bf2b56a988
4 changed files with 111 additions and 2 deletions
|
@ -72,7 +72,7 @@ import Spinner from 'shared/components/Spinner';
|
||||||
import contentTypeMixin from 'shared/mixins/contentTypeMixin';
|
import contentTypeMixin from 'shared/mixins/contentTypeMixin';
|
||||||
import BubbleActions from './bubble/Actions';
|
import BubbleActions from './bubble/Actions';
|
||||||
import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages';
|
import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages';
|
||||||
|
import { generateBotMessageContent } from './helpers/botMessageContentHelper';
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
BubbleActions,
|
BubbleActions,
|
||||||
|
@ -99,7 +99,19 @@ export default {
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
message() {
|
message() {
|
||||||
return this.formatMessage(this.data.content, this.isATweet);
|
const botMessageContent = generateBotMessageContent(
|
||||||
|
this.contentType,
|
||||||
|
this.contentAttributes,
|
||||||
|
this.$t('CONVERSATION.NO_RESPONSE')
|
||||||
|
);
|
||||||
|
let messageContent =
|
||||||
|
this.formatMessage(this.data.content, this.isATweet) +
|
||||||
|
botMessageContent;
|
||||||
|
|
||||||
|
return messageContent;
|
||||||
|
},
|
||||||
|
contentAttributes() {
|
||||||
|
return this.data.content_attributes || {};
|
||||||
},
|
},
|
||||||
sender() {
|
sender() {
|
||||||
return this.data.sender || {};
|
return this.data.sender || {};
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
const generateInputSelectContent = (contentType, contentAttributes) => {
|
||||||
|
const { submitted_values: submittedValues = [] } = contentAttributes;
|
||||||
|
const [selectedOption] = submittedValues;
|
||||||
|
|
||||||
|
if (selectedOption && selectedOption.title) {
|
||||||
|
return `<strong>${selectedOption.title}</strong>`;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
const generateInputEmailContent = (contentType, contentAttributes) => {
|
||||||
|
const { submitted_email: submittedEmail = '' } = contentAttributes;
|
||||||
|
if (submittedEmail) {
|
||||||
|
return `<strong>${submittedEmail}</strong>`;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
const generateFormContent = (
|
||||||
|
contentType,
|
||||||
|
contentAttributes,
|
||||||
|
noResponseText
|
||||||
|
) => {
|
||||||
|
const { items, submitted_values: submittedValues = [] } = contentAttributes;
|
||||||
|
if (submittedValues.length) {
|
||||||
|
const submittedObject = submittedValues.reduce((acc, keyValuePair) => {
|
||||||
|
acc[keyValuePair.name] = keyValuePair.value;
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
let formMessageContent = '';
|
||||||
|
items.forEach(item => {
|
||||||
|
formMessageContent += `<div>${item.label}</div>`;
|
||||||
|
const response = submittedObject[item.name] || noResponseText;
|
||||||
|
formMessageContent += `<strong>${response}</strong><br/><br/>`;
|
||||||
|
});
|
||||||
|
return formMessageContent;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
export const generateBotMessageContent = (
|
||||||
|
contentType,
|
||||||
|
contentAttributes,
|
||||||
|
noResponseText = 'No response'
|
||||||
|
) => {
|
||||||
|
const contentTypeMethods = {
|
||||||
|
input_select: generateInputSelectContent,
|
||||||
|
input_email: generateInputEmailContent,
|
||||||
|
form: generateFormContent,
|
||||||
|
};
|
||||||
|
|
||||||
|
const contentTypeMethod = contentTypeMethods[contentType];
|
||||||
|
if (contentTypeMethod && typeof contentTypeMethod === 'function') {
|
||||||
|
return contentTypeMethod(contentType, contentAttributes, noResponseText);
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
};
|
|
@ -0,0 +1,39 @@
|
||||||
|
import { generateBotMessageContent } from '../botMessageContentHelper';
|
||||||
|
|
||||||
|
describe('#generateBotMessageContent', () => {
|
||||||
|
it('return correct input_select content', () => {
|
||||||
|
expect(
|
||||||
|
generateBotMessageContent('input_select', {
|
||||||
|
submitted_values: [{ value: 'salad', title: 'Salad' }],
|
||||||
|
})
|
||||||
|
).toEqual('<strong>Salad</strong>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('return correct input_email content', () => {
|
||||||
|
expect(
|
||||||
|
generateBotMessageContent('input_email', {
|
||||||
|
submitted_email: 'hello@chatwoot.com',
|
||||||
|
})
|
||||||
|
).toEqual('<strong>hello@chatwoot.com</strong>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('return correct form content', () => {
|
||||||
|
expect(
|
||||||
|
generateBotMessageContent('form', {
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
name: 'large_text',
|
||||||
|
label: 'This a large text',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'email',
|
||||||
|
label: 'Email',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
submitted_values: [{ name: 'large_text', value: 'Large Text Content' }],
|
||||||
|
})
|
||||||
|
).toEqual(
|
||||||
|
'<div>This a large text</div><strong>Large Text Content</strong><br/><br/><div>Email</div><strong>No response</strong><br/><br/>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
|
@ -25,6 +25,7 @@
|
||||||
"REMOVE_SELECTION": "Remove Selection",
|
"REMOVE_SELECTION": "Remove Selection",
|
||||||
"DOWNLOAD": "Download",
|
"DOWNLOAD": "Download",
|
||||||
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
|
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
|
||||||
|
"NO_RESPONSE": "No response",
|
||||||
"HEADER": {
|
"HEADER": {
|
||||||
"RESOLVE_ACTION": "Resolve",
|
"RESOLVE_ACTION": "Resolve",
|
||||||
"REOPEN_ACTION": "Reopen",
|
"REOPEN_ACTION": "Reopen",
|
||||||
|
|
Loading…
Reference in a new issue