App templates
Explore a library of common app use cases that can be copied and customized, or referenced as inspiration for your specific project. Or
start with an idea.
Loading...
Error -- too many buttons
").appendTo($elementView);
}
else if (element.buttons) {
for (var i = 0; i < element.buttons.length; i++) {
var thisButton = element.buttons[i];
renderButton(thisButton, $elementView);
}
}
$elementView.appendTo($container);
}
var renderGenericPayload = function (payload, $container) {
var $payloadView = $('').addClass("Payload GenericPayload ThinScrollBar");
$payloadView.append($('').addClass("PayloadTitle").text(payload.text));
if (payload.elements.length > MAX_GENERIC_ELEMENTS) {
$("Error -- too many elements
").appendTo($payloadView);
}
else {
for (var i = 0; i < payload.elements.length; i++) {
var thisElement = payload.elements[i];
renderPayloadElement(thisElement, $payloadView);
}
$payloadView.appendTo($container);
}
}
var renderListPayload = function (payload, $container) {
var $payloadView = $('').addClass("Payload ListPayload ThinScrollBar");
$payloadView.append($('').addClass("PayloadTitle").text(payload.text));
if (payload.elements.length > MAX_LIST_ELEMENTS) {
$("Error -- too many elements
").appendTo($payloadView);
}
else {
for (var i = 0; i < payload.elements.length; i++) {
var thisElement = payload.elements[i];
renderPayloadElement(thisElement, $payloadView);
}
$payloadView.appendTo($container);
}
}
var renderAttachment = function (attachment, $container) {
switch (attachment.payload.template_type) {
case "generic":
renderGenericPayload(attachment.payload, $container);
break;
case "list":
renderListPayload(attachment.payload, $container);
break;
case "button":
renderButtonPayload(attachment.payload, $container);
break;
}
}
var scrollAndShow = function () {
var height = $msgWrapper[0].scrollHeight;
$msgWrapper.scrollTop(height);
}
var showWaitingIndicator = function () {
$(".MessengerWindow .WaitingGif").first().clone().attr('id', "WaitingGif1").show().appendTo($msgWrapper);
}
var hideWaitingIndicator = function () {
$msgWrapper.find("#WaitingGif1").remove();
}
var pad2 = function(n) {
return ((n < 10) && (n >=0 )) ? ("0" + n) : n;
}
var makeTimestamp = function () {
var now = new Date();
var hours = now.getHours();
var ampm = 'am';
if (hours >= 12) {
ampm = 'pm';
}
if (hours > 12) {
hours = hours - 12;
}
var minutes = pad2(now.getMinutes());
return $('').addClass("Timestamp").text(hours + ":" + minutes + ampm);
}
var showTextResponse = function (textResponse, showTimestamp) {
var $newMessage = $('').addClass("ReceivedMessage ThinScrollBar").text(textResponse);
if (showTimestamp) {
$newMessage = $newMessage.prepend(makeTimestamp());
}
$msgWrapper.append($newMessage);
}
var showAttachmentResponse = function (attachmentResponse, showTimestamp) {
var $recvdMessage = $('').addClass("ReceivedMessage ThinScrollBar");
renderAttachment(attachmentResponse, $recvdMessage);
if (showTimestamp) {
$recvdMessage = $recvdMessage.prepend(makeTimestamp());
}
$msgWrapper.append($recvdMessage);
}
var showResponse = function (responses, i, callback) {
if (null == responses || responses.length <= i) {
showTextResponse('', (i == 0))
scrollAndShow();
}
else {
var response = JSON.parse(responses[i]).message;
if (response.text) {
showTextResponse(response.text, (i == 0))
}
else if (response.attachment) {
showAttachmentResponse(response.attachment, (i == 0))
}
setTimeout(function () {
scrollAndShow();
callback(i + 1)
}, 200);
}
}
var sendPayload = function (payload) {
showWaitingIndicator();
verifiedAjaxPost({
url: "/api/chatbot/facebook",
data: JSON.stringify(payload),
contentType: "application/json",
success: function (data) {
var responses = JSON.parse(data);
var callbackFn = function (i) {
if (i < responses.length) {
showResponse(responses, i, callbackFn)
}
}
showResponse(responses, 0, callbackFn)
},
error: function (errResult) {
showTextResponse(errResult.responseText);
},
complete: function () {
hideWaitingIndicator();
}
});
}
var hideChatbotEmulator = function () {
$(".MessengerWindow").hide();
}
var showChatbotEmulator = function () {
$(".MessengerWindow .Messages .MessageWrapper").children().remove();
$(".MessengerWindow").show();
$('#MessageInput').val('#start');
document.getElementById('SendButton').click();
}
var initChatbotPartial = function (appId, pageId, doNotShow) {
$msgWrapper = $(".MessengerWindow .Messages .MessageWrapper")
$('#MessageInput')
.off('keyup')
.on('keyup', function (e) {
if (e.keyCode == 13) {
document.getElementById('SendButton').click();
}
});
$('#ImageInput')
.off('change')
.on('change', function () {
var fileToLoad = $(this)[0].files[0];
if (null != fileToLoad) {
var fileReader = new FileReader();
fileReader.onloadend = function (e) {
// submit the entry
var payload = {
object: "debugger",
debugAppId: appId,
entry: [
{
id: msgCounter++,
time: 200,
messaging: [
{
sender: { id: thisUserId },
recipient: { id: pageId },
timestamp: 222,
message: {
mid: "foo",
seq: msgCounter,
attachments: [
{
type: 'image',
payload: {
url: e.target.result
}
}
]
}
}
]
}
]
}
sendPayload(payload);
};
fileReader.onerror = function (e) {
alert('error with filereader');
};
fileReader.readAsDataURL(fileToLoad);
}
});
$("#SendImageButton")
.off('click')
.on('click', function () {
document.getElementById('ImageInput').click();
});
$("#SendButton")
.off('click')
.on('click', function () {
var message = $("#MessageInput").val();
$("#MessageInput").val('');
$msgWrapper.append($('').addClass("SentMessage").text(message));
var payload = {
object: "debugger",
debugAppId: appId,
entry: [
{
id: msgCounter++,
time: 200,
messaging: [
{
sender: { id: thisUserId },
recipient: { id: pageId },
timestamp: 222,
message: {
mid: "foo",
seq: 1,
text: message
}
}
]
}
]
}
sendPayload(payload);
});
$(document)
.off('click', '.PostbackActionLink')
.on('click', '.PostbackActionLink', function (e) {
var payload = $(this).data('payload');
if (null != payload) {
e.preventDefault();
e.stopImmediatePropagation();
var postbackPayload = {
object: "debugger",
debugAppId: appId,
entry: [
{
id: msgCounter++,
time: 200,
messaging: [
{
sender: { id: thisUserId },
recipient: { id: pageId },
timestamp: 222,
postback: {
payload: decodeURIComponent(payload)
}
}
]
}
]
}
sendPayload(postbackPayload);
}
else {
// it is a url click -- let it go thru
}
})
.off('click', '.LoginActionLink')
.on('click', '.LoginActionLink', function (e) {
// open the window with javascript --- this will let us close it subsequently with Javascript
var url = $(this).attr('href')
console.log('Opening url:' + url)
window.open(url, '_blank')
e.preventDefault()
})
;
if (doNotShow) {
hideChatbotEmulator();
}
else {
showChatbotEmulator();
}
}