@botonic/plugin-flow-builder
Version:
Use Flow Builder to show your contents
135 lines • 6.35 kB
JavaScript
import { __awaiter } from "tslib";
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
import { INPUT, isDev, isWebchat } from '@botonic/core';
import { Multichannel, RequestContext, WebchatSettings, } from '@botonic/react';
import React from 'react';
import { EMPTY_PAYLOAD } from '../constants';
import { FlowHandoff } from '../content-fields';
import { FlowBotAction } from '../content-fields/flow-bot-action';
import { ContentFilterExecutor } from '../filters';
import { getFlowBuilderPlugin } from '../helpers';
import { inputHasTextData } from '../utils';
import { getContentsByAiAgent } from './ai-agent';
import { getContentsByFallback } from './fallback';
import { getContentsByFirstInteraction } from './first-interaction';
import { getContentsByKnowledgeBase } from './knowledge-bases';
import { getContentsByPayload } from './payload';
export class FlowBuilderAction extends React.Component {
static executeConversationStart(request) {
return __awaiter(this, void 0, void 0, function* () {
const context = getContext(request);
const contents = yield getContentsByFirstInteraction(context);
const filteredContents = yield filterContents(request, contents);
yield FlowBuilderAction.trackAllContents(request, filteredContents);
yield FlowBuilderAction.doHandoffAndBotActions(request, filteredContents);
return { contents: filteredContents };
});
}
static botonicInit(request, contentID) {
return __awaiter(this, void 0, void 0, function* () {
const contents = yield getContents(request, contentID);
const filteredContents = yield filterContents(request, contents);
yield FlowBuilderAction.trackAllContents(request, filteredContents);
yield FlowBuilderAction.doHandoffAndBotActions(request, filteredContents);
return { contents: filteredContents };
});
}
static trackAllContents(request, contents) {
return __awaiter(this, void 0, void 0, function* () {
for (const content of contents) {
yield content.trackFlow(request);
}
});
}
static doHandoffAndBotActions(request, contents) {
return __awaiter(this, void 0, void 0, function* () {
const handoffContent = contents.find(content => content instanceof FlowHandoff);
if (handoffContent) {
yield handoffContent.doHandoff(request);
}
const botActionContent = contents.find(content => content instanceof FlowBotAction);
if (botActionContent) {
botActionContent.doBotAction(request);
}
});
}
render() {
const { contents, webchatSettingsParams } = this.props;
const request = this.context;
const shouldSendWebchatSettings = (isWebchat(request.session) || isDev(request.session)) &&
!!webchatSettingsParams;
return (_jsxs(_Fragment, { children: [shouldSendWebchatSettings && (_jsx(WebchatSettings, Object.assign({}, webchatSettingsParams))), contents.map(content => content.toBotonic(content.id, request))] }));
}
}
FlowBuilderAction.contextType = RequestContext;
export class FlowBuilderMultichannelAction extends FlowBuilderAction {
render() {
const { contents, webchatSettingsParams } = this.props;
const request = this.context;
const shouldSendWebchatSettings = (isWebchat(request.session) || isDev(request.session)) &&
!!webchatSettingsParams;
return (_jsxs(Multichannel, Object.assign({ text: { buttonsAsText: false } }, { children: [shouldSendWebchatSettings && (_jsx(WebchatSettings, Object.assign({}, webchatSettingsParams))), contents.map(content => content.toBotonic(content.id, request))] })));
}
}
function getContents(request, contentID) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const context = getContext(request, contentID);
if (request.session.is_first_interaction) {
return yield getContentsByFirstInteraction(context);
}
// TODO: Add needed logic when we can define contents for multi locale queue position message
if (request.input.type === INPUT.EVENT_QUEUE_POSITION_CHANGED) {
return [];
}
if ((_a = request.input.payload) === null || _a === void 0 ? void 0 : _a.startsWith(EMPTY_PAYLOAD)) {
request.input.payload = undefined;
}
if (request.input.payload || contentID) {
const contentsByPayload = yield getContentsByPayload(context);
if (contentsByPayload.length > 0) {
return contentsByPayload;
}
return yield getContentsByFallback(context);
}
if (inputHasTextData(request.input)) {
const aiAgentContents = yield getContentsByAiAgent(context);
if (aiAgentContents.length > 0) {
return aiAgentContents;
}
const knowledgeBaseContents = yield getContentsByKnowledgeBase(context);
if (knowledgeBaseContents.length > 0) {
return knowledgeBaseContents;
}
}
return yield getContentsByFallback(context);
});
}
function filterContents(request, contents) {
return __awaiter(this, void 0, void 0, function* () {
const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins);
const contentFilters = flowBuilderPlugin.contentFilters;
const contentFilterExecutor = new ContentFilterExecutor({
filters: contentFilters,
});
const filteredContents = [];
for (const content of contents) {
const filteredContent = yield contentFilterExecutor.filter(request, content);
filteredContents.push(filteredContent);
}
return filteredContents;
});
}
function getContext(request, contentID) {
const flowBuilderPlugin = getFlowBuilderPlugin(request.plugins);
const cmsApi = flowBuilderPlugin.cmsApi;
const resolvedLocale = flowBuilderPlugin.cmsApi.getResolvedLocale();
return {
cmsApi,
flowBuilderPlugin,
request,
resolvedLocale,
contentID,
};
}
//# sourceMappingURL=index.js.map