@botonic/plugin-flow-builder
Version:
Botonic plugin for **Hubtype Flow Builder**: run and bridge flow-driven logic from bots on the **current** line.
166 lines • 8.66 kB
JavaScript
import { __awaiter } from "tslib";
import { BotServerMessageFactory, } from '@botonic/core';
import { WhatsappTemplateComponentBody, WhatsappTemplateComponentButton, WhatsappTemplateComponentHeader, WhatsappTemplateComponentSubType, WhatsappTemplateComponentType, WhatsappTemplateParameterImage, WhatsappTemplateParameterPayload, WhatsappTemplateParameterText, WhatsappTemplateParameterType, WhatsappTemplateParameterVideo, } from '@botonic/shared';
import { trackOneContent } from '../tracking';
import { getFlowBuilderPlugin } from '../utils';
import { ContentFieldsBase } from './content-fields-base';
import { WHATSAPP_TEMPLATE, } from './hubtype-fields';
export class FlowWhatsappTemplate extends ContentFieldsBase {
constructor() {
super(...arguments);
this.htWhatsappTemplate = {};
this.variableValues = {};
}
static fromHubtypeCMS(component, locale) {
const whatsappTemplate = new FlowWhatsappTemplate(component.id);
whatsappTemplate.code = component.code;
whatsappTemplate.buttons = component.content.buttons;
const contentByLocale = FlowWhatsappTemplate.getContentByLocale(component, locale);
whatsappTemplate.htWhatsappTemplate = contentByLocale.template;
whatsappTemplate.headerVariables = contentByLocale.header_variables;
whatsappTemplate.variableValues = contentByLocale.variable_values;
whatsappTemplate.urlVariableValues = contentByLocale.url_variable_values;
whatsappTemplate.followUp = component.follow_up;
return whatsappTemplate;
}
static getContentByLocale(component, currentLocale) {
const content = component.content.by_locale[currentLocale];
if (!content) {
throw new Error(`Whatsapp template content not found for locale: ${currentLocale}`);
}
return content;
}
getHeaderComponent(whatsappTemplate, headerVariables, locale, botonicContext) {
var _a;
const headerComponent = whatsappTemplate.components.find(component => { var _a; return ((_a = component.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === WhatsappTemplateComponentType.Header; });
const format = (_a = headerComponent === null || headerComponent === void 0 ? void 0 : headerComponent.format) === null || _a === void 0 ? void 0 : _a.toLowerCase();
if (format === WhatsappTemplateParameterType.Text) {
return this.createHeaderTextComponent(headerVariables, botonicContext);
}
if (format === WhatsappTemplateParameterType.Image) {
return this.createHeaderImageComponent(headerVariables, locale);
}
if (format === WhatsappTemplateParameterType.Video) {
return this.createHeaderVideoComponent(headerVariables, locale);
}
return undefined;
}
createHeaderTextComponent(headerVariables, botonicContext) {
const parameters = Object.values(headerVariables.text || {}).map(value => {
const valueVariable = this.replaceVariables(value, botonicContext);
return new WhatsappTemplateParameterText(valueVariable);
});
return new WhatsappTemplateComponentHeader({
parameters,
});
}
createHeaderImageComponent(headerVariables, locale) {
var _a, _b;
const parameters = [
new WhatsappTemplateParameterImage({
link: ((_b = (_a = headerVariables.media) === null || _a === void 0 ? void 0 : _a.find(m => m.locale === locale)) === null || _b === void 0 ? void 0 : _b.file) || '',
}),
];
return new WhatsappTemplateComponentHeader({
parameters,
});
}
createHeaderVideoComponent(headerVariables, locale) {
var _a, _b;
const parameters = [
new WhatsappTemplateParameterVideo({
link: ((_b = (_a = headerVariables.media) === null || _a === void 0 ? void 0 : _a.find(m => m.locale === locale)) === null || _b === void 0 ? void 0 : _b.file) || '',
}),
];
return new WhatsappTemplateComponentHeader({
parameters,
});
}
getBodyComponent(variableValues, botonicContext) {
const parameters = Object.entries(variableValues).map(([key, value]) => {
const text = this.replaceVariables(value, botonicContext);
const parameterName = key;
return new WhatsappTemplateParameterText(text, parameterName);
});
return new WhatsappTemplateComponentBody({ parameters });
}
getButtons(whatsappTemplate, buttonNodes, urlVariableValues, botonicContext) {
const htWhatsappTemplateButtons = whatsappTemplate.components.find(component => { var _a; return ((_a = component.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === WHATSAPP_TEMPLATE.Buttons; });
if (htWhatsappTemplateButtons) {
const buttons = htWhatsappTemplateButtons.buttons
.map((button, index) => {
var _a, _b, _c;
if (((_a = button.type) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === WhatsappTemplateComponentSubType.Url) {
const urlParam = urlVariableValues === null || urlVariableValues === void 0 ? void 0 : urlVariableValues[String(index)];
if (!urlParam) {
return null;
}
return this.createUrlButtonComponent(index, urlParam, botonicContext);
}
if (((_b = button.type) === null || _b === void 0 ? void 0 : _b.toLowerCase()) ===
WhatsappTemplateComponentSubType.QuickReply) {
const payload = ((_c = buttonNodes[index].target) === null || _c === void 0 ? void 0 : _c.id) || '';
return this.createQuickReplyButtonComponent(index, payload);
}
return this.createVoiceCallButtonComponent(index);
})
.filter(button => button !== null);
return buttons;
}
return undefined;
}
createUrlButtonComponent(index, urlParam, botonicContext) {
const variableUrlParam = this.replaceVariables(urlParam, botonicContext);
const parameters = urlParam
? [new WhatsappTemplateParameterText(variableUrlParam)]
: [];
return new WhatsappTemplateComponentButton({
subType: WhatsappTemplateComponentSubType.Url,
index: index,
parameters,
});
}
createQuickReplyButtonComponent(index, payload) {
return new WhatsappTemplateComponentButton({
subType: WhatsappTemplateComponentSubType.QuickReply,
index: index,
parameters: [new WhatsappTemplateParameterPayload(payload)],
});
}
createVoiceCallButtonComponent(index) {
return new WhatsappTemplateComponentButton({
subType: WhatsappTemplateComponentSubType.VoiceCall,
index: index,
});
}
trackFlow(botonicContext) {
return __awaiter(this, void 0, void 0, function* () {
yield trackOneContent(botonicContext, this);
});
}
processContent(botonicContext) {
return __awaiter(this, void 0, void 0, function* () {
yield this.trackFlow(botonicContext);
return this.filterContent(botonicContext, this);
});
}
toBotonic(botonicContext) {
return __awaiter(this, void 0, void 0, function* () {
const templateName = this.htWhatsappTemplate.name;
const templateLanguage = this.htWhatsappTemplate.language;
const body = this.getBodyComponent(this.variableValues, botonicContext);
const pluginFlowBuilder = getFlowBuilderPlugin(botonicContext.plugins);
const resolvedLocale = pluginFlowBuilder.cmsApi.getResolvedLocale();
const header = this.getHeaderComponent(this.htWhatsappTemplate, this.headerVariables || {}, resolvedLocale, botonicContext);
const buttons = this.getButtons(this.htWhatsappTemplate, this.buttons || [], this.urlVariableValues || {}, botonicContext);
const components = [header, body, ...(buttons || [])].filter(component => component !== undefined);
return BotServerMessageFactory.createWhatsappTemplate({
name: templateName,
languageCode: templateLanguage,
namespace: this.htWhatsappTemplate.namespace,
components,
});
});
}
}
//# sourceMappingURL=flow-whatsapp-template.js.map