in lex-web-ui/src/store/actions.js [468:603]
postTextMessage(context, message) {
if (context.state.isSFXOn && !context.state.lex.isPostTextRetry) {
context.dispatch('playSound', context.state.config.ui.messageSentSFX);
}
return context.dispatch('interruptSpeechConversation')
.then(() => {
if (context.state.chatMode === chatMode.BOT) {
return context.dispatch('pushMessage', message);
}
return Promise.resolve();
})
.then(() => {
const liveChatTerms = context.state.config.connect.liveChatTerms ? context.state.config.connect.liveChatTerms.split(',').map(str => str.trim()) : [];
if (context.state.config.ui.enableLiveChat && liveChatTerms.find(el => el === message.text.toLowerCase())) {
return context.dispatch('requestLiveChat');
} else if (context.state.liveChat.status === liveChatStatus.REQUEST_USERNAME) {
context.commit('setLiveChatUserName', message.text);
return context.dispatch('requestLiveChat');
} else if (context.state.chatMode === chatMode.LIVECHAT) {
if (context.state.liveChat.status === liveChatStatus.ESTABLISHED) {
return context.dispatch('sendChatMessage', message.text);
}
}
return Promise.resolve(context.commit('pushUtterance', message.text))
})
.then(() => {
if (context.state.chatMode === chatMode.BOT &&
context.state.liveChat.status != liveChatStatus.REQUEST_USERNAME) {
return context.dispatch('lexPostText', message.text);
}
return Promise.resolve();
})
.then((response) => {
if (context.state.chatMode === chatMode.BOT &&
context.state.liveChat.status != liveChatStatus.REQUEST_USERNAME) {
// check for an array of messages
if (response.sessionState || (response.message && response.message.includes('{"messages":'))) {
if (response.message && response.message.includes('{"messages":')) {
const tmsg = JSON.parse(response.message);
if (tmsg && Array.isArray(tmsg.messages)) {
tmsg.messages.forEach((mes, index) => {
let alts = JSON.parse(response.sessionAttributes.appContext || '{}').altMessages;
if (mes.type === 'CustomPayload' || mes.contentType === 'CustomPayload') {
if (alts === undefined) {
alts = {};
}
alts.markdown = mes.value ? mes.value : mes.content;
}
// Note that Lex V1 only supported a single responseCard. V2 supports multiple response cards.
// This code still supports the V1 mechanism. The code below will check for
// the existence of a single V1 responseCard added to sessionAttributes.appContext by bots
// such as QnABot. This single responseCard will be appended to the last message displayed
// in the array of messages presented.
let responseCardObject = JSON.parse(response.sessionAttributes.appContext || '{}').responseCard;
if (responseCardObject === undefined) { // prefer appContext over lex.responseCard
responseCardObject = context.state.lex.responseCard;
}
context.dispatch(
'pushMessage',
{
text: mes.value ? mes.value : mes.content ? mes.content : "",
type: 'bot',
dialogState: context.state.lex.dialogState,
responseCard: tmsg.messages.length - 1 === index // attach response card only
? responseCardObject : undefined, // for last response message
alts,
},
);
});
}
}
} else {
let alts = JSON.parse(response.sessionAttributes.appContext || '{}').altMessages;
let responseCardObject = JSON.parse(response.sessionAttributes.appContext || '{}').responseCard;
if (response.messageFormat === 'CustomPayload') {
if (alts === undefined) {
alts = {};
}
alts.markdown = response.message;
}
if (responseCardObject === undefined) {
responseCardObject = context.state.lex.responseCard;
}
context.dispatch(
'pushMessage',
{
text: response.message,
type: 'bot',
dialogState: context.state.lex.dialogState,
responseCard: responseCardObject, // prefering appcontext over lex.responsecard
alts,
},
);
}
}
return Promise.resolve();
})
.then(() => {
if (context.state.isSFXOn) {
context.dispatch('playSound', context.state.config.ui.messageReceivedSFX);
context.dispatch(
'sendMessageToParentWindow',
{ event: 'messageReceived' },
);
}
if (context.state.lex.dialogState === 'Fulfilled') {
context.dispatch('reInitBot');
}
if (context.state.isPostTextRetry) {
context.commit('setPostTextRetry', false);
}
})
.catch((error) => {
if (((error.message.indexOf('permissible time') === -1))
|| context.state.config.lex.retryOnLexPostTextTimeout === false
|| (context.state.lex.isPostTextRetry &&
(context.state.lex.retryCountPostTextTimeout >=
context.state.config.lex.retryCountPostTextTimeout)
)
) {
context.commit('setPostTextRetry', false);
const errorMessage = (context.state.config.ui.showErrorDetails) ?
` ${error}` : '';
console.error('error in postTextMessage', error);
context.dispatch(
'pushErrorMessage',
'Sorry, I was unable to process your message. Try again later.' +
`${errorMessage}`,
);
} else {
context.commit('setPostTextRetry', true);
context.dispatch('postTextMessage', message);
}
});
},