(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(["converse"], factory);
} else {
factory(converse);
}
}(this, function (converse) {
let DesignDialog = null, designDialog = null, _converse, dayjs, html, _, __, Strophe, $iq, adaptiveCard, converseConn;
converse.plugins.add("adaptive-cards", {
'dependencies': [],
'initialize': function () {
_converse = this._converse;
Strophe = converse.env.Strophe;
$iq = converse.env.$iq;
html = converse.env.html;
dayjs = converse.env.dayjs;
_ = converse.env._;
__ = _converse.__;
adaptiveCard = new AdaptiveCards.AdaptiveCard();
adaptiveCard.onExecuteAction = function(action) {
console.debug("adaptiveCard.onExecuteAction", action)
if (converseConn && action._propertyBag?.title) {
let data = {};
if (action._processedData && Object.getOwnPropertyNames(action._processedData).length > 0) {
data = action._processedData;
}
sendCardResult(action._propertyBag?.title, JSON.stringify(data)).then(resp => resultsSaved(resp, action._propertyBag?.title)).catch(err => resultsError(err, action._propertyBag?.title));
}
}
class DesignDialog extends _converse.exports.BaseModal {
initialize() {
super.initialize();
this.listenTo(this.model, "change", () => this.requestUpdate());
this.addEventListener('shown.bs.modal', () => {
this.querySelector("#adaptive-card-text").style.display = '';
this.querySelector("#adaptive-card-preview").style.display = 'none';
this.querySelector('.btn-design-card').addEventListener('click', (ev) => {
this.designCard(ev);
});
this.querySelector('.btn-paste-card').addEventListener('click', (ev) => {
this.pasteCard(ev);
});
this.querySelector('.btn-post-card').addEventListener('click', (ev) => {
this.postCard(ev);
});
this.querySelector('.btn-preview-card').addEventListener('click', (ev) => {
this.previewCard(ev);
});
});
}
getModalTitle () {
return __('Adaptice Cards Designer');
}
renderModal() {
return html`
`;
}
designCard() {
openWebAppsWindow("https://adaptivecards.io/designer/");
}
pasteCard() {
navigator.clipboard.readText().then((clipText) => {
this.querySelector("#adaptive-card-text").value = clipText;
}, function(err) {
console.error('adaptive card paste clipboard error', err);
});
}
postCard() {
const model = this.model.get("view").model;
const clipText = JSON.stringify(JSON.parse(this.querySelector("#adaptive-card-text").value.trim()));
console.debug("postClipboard", clipText);
if (clipText && converseConn) {
const type = (model.get('type') == 'chatroom') ? 'groupchat' : 'chat';
const target = model.get('jid');
_converse.api.send($msg({to: target, from: converseConn.jid, type}).c("json", {'xmlns': 'urn:xmpp:json:0'}).t(clipText));
}
}
previewCard() {
const textarea = this.querySelector("#adaptive-card-text");
const button = this.querySelector(".btn-preview-card");
const preview = this.querySelector("#adaptive-card-preview");
if (preview.style.display == 'none') {
const clipText = JSON.stringify(JSON.parse(this.querySelector("#adaptive-card-text").value.trim()));
const adaptiveCard = new AdaptiveCards.AdaptiveCard();
adaptiveCard.parse(JSON.parse(clipText));
const renderedCard = adaptiveCard.render();
textarea.style.display = 'none';
preview.innerHTML = "";
preview.appendChild(renderedCard);
preview.style.display = '';
button.innerHTML = 'Edit';
} else {
preview.innerHTML = '';
preview.style.display = 'none';
textarea.style.display = '';
button.innerHTML = 'Preview';
}
}
}
_converse.api.elements.define('converse-pade-design-dialog', DesignDialog);
_converse.api.listen.on('getToolbarButtons', function(toolbar_el, buttons)
{
let style = "width:18px; height:18px; fill:var(--chat-color);";
if (toolbar_el.model.get("type") === "chatroom") {
style = "width:18px; height:18px; fill:var(--muc-color);";
}
buttons.push(html`
`);
return buttons;
});
_converse.api.listen.on('connected', async function() {
converseConn = await _converse.api.connection.get();
});
_converse.api.listen.on('beforeMessageBodyTransformed', function(text)
{
if (text.startsWith('ADAPTIVE-CARD:') && text.length > 14) {
const json = text.substring(14);
adaptiveCard.parse(JSON.parse(json));
const renderedCard = adaptiveCard.render();
console.debug("Adapative card", text);
text.render_styling = false;
text.references = [{begin: 0, end: text.length, template: renderedCard }];
}
});
_converse.api.listen.on('parseMessage', async (stanza, attrs) => {
return parseStanza(stanza, attrs);
});
_converse.api.listen.on('parseMUCMessage', async (stanza, attrs) => {
return parseStanza(stanza, attrs);
});
console.debug("adaptive-cards plugin is ready");
}
});
function resultsSaved(resp, title) {
console.debug("resultsSaved", title, resp);
const message = 'Saved results OK for ' + title;
getSelectedChatBox().model.createMessage({ message, body: message, 'type': 'info' });
}
function resultsError(err, title) {
console.error("resultsError", title, err);
const message = 'Saved results ERROR for ' + title;
getSelectedChatBox().model.createMessage({ body: message, message, 'type': 'info' });
}
async function parseStanza(stanza, attrs) {
const json = stanza.querySelector('json');
if (json) {
const card = JSON.parse(json.innerHTML);
console.debug("parseStanza", card);
if (card.type == 'AdaptiveCard') {
attrs.message = 'ADAPTIVE-CARD:' + json.innerHTML;
attrs.body = attrs.message;
}
}
return attrs;
}
function designCard(ev) {
ev.stopPropagation();
ev.preventDefault();
const toolbar_el = converse.env.utils.ancestor(ev.target, 'converse-chat-toolbar');
const chatview = _converse.chatboxviews.get(toolbar_el.model.get('jid'));
console.debug("designCard", chatview);
const model = new converse.env.Model();
model.set({ view: chatview});
_converse.api.modal.show('converse-pade-design-dialog', { model });
}
function sendCardResult(id, result) {
const stanza = $iq({
'type': 'set',
'from': converseConn.jid
}).c('pubsub', {
'xmlns': Strophe.NS.PUBSUB
}).c('publish', {
'node': "https://adaptivecards.io"
}).c('item', {
'id': id
}).c('storage', {
'xmlns': "https://adaptivecards.io"
});
stanza.c('result').t(result).up();
stanza.up().up().up();
stanza.c('publish-options').c('x', {
'xmlns': Strophe.NS.XFORM,
'type': 'submit'
}).c('field', {
'var': 'FORM_TYPE',
'type': 'hidden'
}).c('value').t('http://jabber.org/protocol/pubsub#publish-options').up().up().c('field', {
'var': 'pubsub#persist_items'
}).c('value').t('true').up().up().c('field', {
'var': 'pubsub#access_model'
}).c('value').t('whitelist');
return _converse.api.sendIQ(stanza);
}
}));