UNPKG

botbuilder-formflow

Version:
91 lines (86 loc) 2.71 kB
const matchItem = require('../matchItem'); const formFlowConsts = require('../consts'); const MenuPrompt = require('./MenuPrompt'); const botbuilder = require('botbuilder'); function MenuDialog(config) { this.type = 'dialog'; this.bot = null; this.dialog = []; this.resolvedItems = null; for (var key in config) { if (config.hasOwnProperty(key)) { this[key] = config[key]; } } if (!config.items) { throw ('Failed to instantinate MenuDialog - property "items" undefined!') } } MenuDialog.prototype.initialize = function (bot, dialogId, config) { config = Object.assign({}, config); let promptDialogId = 'MenuPrompt_' + dialogId; bot.dialog(promptDialogId, new MenuPrompt()); this.dialog = [ (session) => { this.resolveItems(config, session) .then((items) => { config.items = items; if (this.isEmptyItems(items)) { session.endDialog(); } if (!config.retryPrompt) { config.retryPrompt = config.prompt; } session.beginDialog(promptDialogId, config); }) .catch((error) => { session.logger.log(session.dialogStack(), error); session.send(botbuilder.Prompt.gettext(session, 'default_error', formFlowConsts.SYSTEM_NAMESPACE)); session.endConversation(); }) }, (session, args) => { session.beginDialog(args.response); }, (session, args) => { session.endDialogWithResult(args); } ]; } MenuDialog.prototype.isEmptyItems = function (items) { for (let key in items) { if (items.hasOwnProperty(key)) { return false; } } return true; } MenuDialog.prototype.resolveItems = function (options, session) { if (this.resolvedItems != null) { return Promise.resolve(this.resolvedItems); } let promise = null; if ("undefined" == typeof options.items) { throw new Error("MenuPrompt.items mandatory attribute") } if ("function" == typeof options.items) { promise = options.items.call(null, session); if (!(promise instanceof Promise)) { throw new Error("MenuPrompt.items callback must return a Promise"); } } else { promise = Promise.resolve(options.items) } return promise; } MenuDialog.factory = function (bot, id, stepConfig, steps) { if (matchItem(stepConfig, 'menu-dialog', () => true)) { let dialog = new MenuDialog(stepConfig); dialog.initialize(bot, id, stepConfig); dialog.dialog.forEach((item)=>steps.push(item)); } else if (stepConfig instanceof MenuDialog) { stepConfig.initialize(bot, id, stepConfig); stepConfig.dialog.forEach((item) => steps.push(item)); } } module.exports = MenuDialog;