wingbot
Version:
Enterprise Messaging Bot Conversation Engine
155 lines (139 loc) • 4.07 kB
JavaScript
/*
* @author David Menger
*/
'use strict';
const ButtonTemplate = require('./ButtonTemplate');
const { makeAbsolute } = require('../utils');
/**
* Generic template utility
*
* @class
* @extends ButtonTemplate
*/
class GenericTemplate extends ButtonTemplate {
constructor (onDone, context = {}, sharable = false, isSquare = false) {
super(onDone, context, null);
this.elements = [];
this._element = null;
this._sharable = sharable;
this._isSquare = isSquare;
}
/**
* Adds element to generic template
*
* @param {string} title
* @param {string} [subtitle=null]
* @param {boolean} [dontTranslate=false]
* @returns {this}
*
* @memberOf GenericTemplate
*/
addElement (title, subtitle = null, dontTranslate = false) {
this._attachAndClearButtons();
const element = {
title: dontTranslate ? title : this._t(title)
};
if (subtitle !== null) {
Object.assign(element, { subtitle: dontTranslate ? subtitle : this._t(subtitle) });
}
this._element = element;
this.elements.push(element);
return this;
}
_attachAndClearButtons () {
if (this._element !== null && this.buttons.length > 0) {
Object.assign(this._element, {
buttons: this.buttons
});
}
this.buttons = [];
}
/**
* Sets url of recently added element
*
* @returns {this}
*
* @memberOf GenericTemplate
*/
setElementActionShare () {
Object.assign(this._element, {
default_action: {
type: 'element_share'
}
});
return this;
}
/**
* Sets url of recently added element
*
* @param {string} action - Button action (can be absolute or relative)
* @param {object} [data={}] - Action data
* @param {object} [setState] - SetState data
* @returns {this}
*
* @memberOf GenericTemplate
*/
setElementActionPostback (action, data = {}, setState = null) {
const hasSetState = setState && Object.keys(setState).length !== 0;
Object.assign(this._element, {
default_action: {
type: 'postback',
payload: JSON.stringify({
action: makeAbsolute(action, this.context.path),
data: {
_ca: this.context.currentAction,
...data
},
...(hasSetState ? { setState } : {})
})
}
});
return this;
}
/**
* Sets image of recently added element
*
* @param {string} image
* @returns {this}
*
* @memberOf GenericTemplate
*/
setElementImage (image) {
Object.assign(this._element, {
image_url: this._imageUrl(image)
});
return this;
}
/**
* Sets default action of recently added element
*
* @param {string} url - button url
* @param {boolean} hasExtension - includes token in url
* @param {string} [webviewHeight=null] - compact|tall|full
*
* @memberOf GenericTemplate
*/
setElementAction (url, hasExtension = false, webviewHeight = null) {
Object.assign(this._element, {
default_action: {
type: 'web_url',
url: this._makeExtensionUrl(url, hasExtension),
webview_height_ratio: webviewHeight || (hasExtension ? 'tall' : 'full'),
messenger_extensions: hasExtension
}
});
return this;
}
// @ts-ignore
getTemplate () {
this._attachAndClearButtons();
const res = {
template_type: 'generic',
elements: this.elements,
sharable: this._sharable,
image_aspect_ratio: this._isSquare ? 'square' : 'horizontal'
};
return res;
}
}
module.exports = GenericTemplate;