UNPKG

asksuite-core

Version:
218 lines (187 loc) 6.63 kB
const _ = require('lodash'); const Mustache = require('mustache'); const moment = require('moment'); module.exports = class DialogParsing { constructor() {} static dateEncoded(date) { try { return encodeURIComponent(moment(date).format('DD/MM/YY')); } catch (e) { return date; } } static dateUSEncoded(date) { try { return encodeURIComponent(moment(date).format('MM/DD/YY')); } catch (e) { return date; } } static currDateEncoded() { return encodeURIComponent(moment().local().format('DD/MM/YY')); } static currDateUSEncoded() { return encodeURIComponent(moment().local().format('MM/DD/YY')); } static currHour24() { return moment().local().format('kk:mm'); } static gid(groupId) { return groupId ? '#' + groupId : ''; } static currHour12() { return moment().local().format('hh:mmA'); } static getLeadName(session) { const name = _.get(session, 'user.name') || _.get(session, 'variables.lead_name'); return name || ''; } // get only first name static getLeadFirstName(session) { const name = this.getLeadName(session); const firstName = name.split(' ')[0]; return firstName || ''; } static resolveDialog(session, outerItem) { Mustache.templateCache = undefined; let item = _.omit(outerItem, 'children'); const itemString = JSON.stringify(item); if (!itemString.includes('{{')) { return outerItem; } if (itemString.includes('#x2F;')) { item = JSON.parse(itemString.replace(///g, '/')); } let result = _.cloneDeep(item); session = _.cloneDeep(session); if (result) { if ( result.iterator && result.iterator.enabled && result.iterator.itemName && result.iterator.variableName ) { result = DialogParsing.resolveIterator(session, result); } else { result = DialogParsing.replaceVariablesDialog(session, result); } } // Clean up remaining mustache variables result = JSON.parse(Mustache.render(JSON.stringify(result), {})); result.children = outerItem.children; return result; } static replaceVariablesDialog(session, item) { let jsonString = null; const mustacheExtensions = { ArrivalDateEncoded: DialogParsing.dateEncoded(session.ArrivalDateString), DepartureDateEncoded: DialogParsing.dateEncoded(session.DepartureDateString), ArrivalDateUSEncoded: DialogParsing.dateUSEncoded(session.ArrivalDateString), DepartureDateUSEncoded: DialogParsing.dateUSEncoded(session.DepartureDateString), currDateEncoded: DialogParsing.currDateEncoded, currDateUSEncoded: DialogParsing.currDateUSEncoded, currHour24: DialogParsing.currHour24, currHour12: DialogParsing.currHour12, gid: DialogParsing.gid(session.groupId), leadName: DialogParsing.getLeadName(session), firstName: DialogParsing.getLeadFirstName(session), isWhatsApp: DialogParsing.isPlatform(session, 'whatsapp'), isFacebook: DialogParsing.isPlatform(session, 'facebook'), isChatWeb: DialogParsing.isPlatform(session, 'chat_web'), isGoogleBusinessMessages: DialogParsing.isPlatform(session, 'google_business_messages'), isInstagram: DialogParsing.isPlatform(session, 'instagram'), isCompanyOfficeHours: session.isCompanyOfficeHours, }; const vars = Object.assign({}, mustacheExtensions, session); if (item) { // Types replacing if (_.includes(['form', 'form-view'], item.type)) { item.value = item.value.map((choice) => this.resolveIteratorFormItems(session, choice)); } jsonString = JSON.stringify(item); jsonString = Mustache.render(jsonString, vars); } try { if (!jsonString) { throw new Error('Empty jsonString'); } return JSON.parse(jsonString); } catch (e) { console.log(e); return item; } } static resolveIteratorFormItems(session, inputfield) { try { const field = _.cloneDeep(inputfield); if ( field.type === 'choice' && field.choices && field.choices.length === 1 && field.iterator && field.iterator.enabled ) { const template = field.choices[0]; field.choices = []; const iterateVariable = _.get(session, field.iterator.variableName, []); const itemVariable = field.iterator.itemName; if (iterateVariable && itemVariable) { if (iterateVariable.length) { for (const newContext of iterateVariable) { const one = _.cloneDeep(template); session[itemVariable] = newContext; const newOne = DialogParsing.replaceVariablesDialog(session, one); if (!newOne.value || !newOne.title) { // eslint-disable-next-line no-throw-literal throw "One or more variables didn't exist"; } field.choices.push(newOne); } return field; } } } } catch (e) { console.error(session.companyId, "Couldn't parse form items"); } return inputfield; } static resolveIterator(session, item) { try { const itemClone = _.cloneDeep(item); if (itemClone.value && itemClone.value.length === 1) { const iterateVariable = _.get(session, itemClone.iterator.variableName); const itemVariable = itemClone.iterator.itemName; if (iterateVariable && itemVariable) { const template = itemClone.value[0]; itemClone.value = []; if (iterateVariable.length) { for (const newContext of iterateVariable) { const one = _.cloneDeep(template); session[itemVariable] = newContext; const newOne = DialogParsing.replaceVariablesDialog(session, one); itemClone.value.push(newOne); } } else { throw new Error('Returned array has empty data'); } } else { throw new Error("Input variables don't exist"); } return itemClone; } throw new Error("Item doesn't have value property or value is not unique"); } catch (e) { console.log(e); item.value = []; // Prevent showing result if (item.iterator && item.iterator.onEmptyGoToDialog) { item.goToDialog = item.iterator.onEmptyGoToDialog; } return item; } } static isPlatform(session, platform) { // eslint-disable-next-line eqeqeq return session.source == platform; } };