UNPKG

@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
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