@botonic/plugin-flow-builder
Version:
Use Flow Builder to show your contents
133 lines • 6.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlowBuilderMultichannelAction = exports.FlowBuilderAction = void 0;
const tslib_1 = require("tslib");
const jsx_runtime_1 = require("react/jsx-runtime");
const core_1 = require("@botonic/core");
const react_1 = require("@botonic/react");
const react_2 = tslib_1.__importDefault(require("react"));
const content_fields_1 = require("../content-fields");
const flow_bot_action_1 = require("../content-fields/flow-bot-action");
const filters_1 = require("../filters");
const helpers_1 = require("../helpers");
const tracking_1 = require("../tracking");
const utils_1 = require("../utils");
const ai_agent_1 = require("./ai-agent");
const fallback_1 = require("./fallback");
const first_interaction_1 = require("./first-interaction");
const knowledge_bases_1 = require("./knowledge-bases");
const payload_1 = require("./payload");
class FlowBuilderAction extends react_2.default.Component {
static executeConversationStart(request) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const context = getContext(request);
const contents = yield (0, first_interaction_1.getContentsByFirstInteraction)(context);
const filteredContents = yield filterContents(request, contents);
yield (0, tracking_1.trackFlowContent)(request, filteredContents);
yield FlowBuilderAction.doHandoffAndBotActions(request, filteredContents);
return { contents: filteredContents };
});
}
static botonicInit(request, contentID) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const contents = yield getContents(request, contentID);
const filteredContents = yield filterContents(request, contents);
yield (0, tracking_1.trackFlowContent)(request, filteredContents);
yield FlowBuilderAction.doHandoffAndBotActions(request, filteredContents);
return { contents: filteredContents };
});
}
static doHandoffAndBotActions(request, contents) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const handoffContent = contents.find(content => content instanceof content_fields_1.FlowHandoff);
if (handoffContent) {
yield handoffContent.doHandoff(request);
}
const botActionContent = contents.find(content => content instanceof flow_bot_action_1.FlowBotAction);
if (botActionContent) {
botActionContent.doBotAction(request);
}
});
}
render() {
const { contents, webchatSettingsParams } = this.props;
const request = this.context;
const shouldSendWebchatSettings = ((0, core_1.isWebchat)(request.session) || (0, core_1.isDev)(request.session)) &&
!!webchatSettingsParams;
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [shouldSendWebchatSettings && ((0, jsx_runtime_1.jsx)(react_1.WebchatSettings, Object.assign({}, webchatSettingsParams))), contents.map(content => content.toBotonic(content.id, request))] }));
}
}
exports.FlowBuilderAction = FlowBuilderAction;
FlowBuilderAction.contextType = react_1.RequestContext;
class FlowBuilderMultichannelAction extends FlowBuilderAction {
render() {
const { contents, webchatSettingsParams } = this.props;
const request = this.context;
const shouldSendWebchatSettings = ((0, core_1.isWebchat)(request.session) || (0, core_1.isDev)(request.session)) &&
!!webchatSettingsParams;
return ((0, jsx_runtime_1.jsxs)(react_1.Multichannel, Object.assign({ text: { buttonsAsText: false } }, { children: [shouldSendWebchatSettings && ((0, jsx_runtime_1.jsx)(react_1.WebchatSettings, Object.assign({}, webchatSettingsParams))), contents.map(content => content.toBotonic(content.id, request))] })));
}
}
exports.FlowBuilderMultichannelAction = FlowBuilderMultichannelAction;
function getContents(request, contentID) {
var _a;
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const context = getContext(request, contentID);
if (request.session.is_first_interaction) {
return yield (0, first_interaction_1.getContentsByFirstInteraction)(context);
}
// TODO: Add needed logic when we can define contents for multi locale queue position message
if (request.input.type === core_1.INPUT.EVENT_QUEUE_POSITION_CHANGED) {
return [];
}
if ((_a = request.input.payload) === null || _a === void 0 ? void 0 : _a.startsWith('do-nothing')) {
request.input.payload = undefined;
}
if (request.input.payload || contentID) {
const contentsByPayload = yield (0, payload_1.getContentsByPayload)(context);
if (contentsByPayload.length > 0) {
return contentsByPayload;
}
return yield (0, fallback_1.getContentsByFallback)(context);
}
if ((0, utils_1.inputHasTextData)(request.input)) {
const aiAgentContents = yield (0, ai_agent_1.getContentsByAiAgent)(context);
if (aiAgentContents.length > 0) {
return aiAgentContents;
}
const knowledgeBaseContents = yield (0, knowledge_bases_1.getContentsByKnowledgeBase)(context);
if (knowledgeBaseContents.length > 0) {
return knowledgeBaseContents;
}
}
return yield (0, fallback_1.getContentsByFallback)(context);
});
}
function filterContents(request, contents) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const flowBuilderPlugin = (0, helpers_1.getFlowBuilderPlugin)(request.plugins);
const contentFilters = flowBuilderPlugin.contentFilters;
const contentFilterExecutor = new filters_1.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 = (0, helpers_1.getFlowBuilderPlugin)(request.plugins);
const cmsApi = flowBuilderPlugin.cmsApi;
const resolvedLocale = flowBuilderPlugin.cmsApi.getResolvedLocale();
return {
cmsApi,
flowBuilderPlugin,
request,
resolvedLocale,
contentID,
};
}
//# sourceMappingURL=index.js.map