2018-04-16 17:46:48 +02:00
|
|
|
// Converse.js
|
|
|
|
// https://conversejs.org
|
|
|
|
//
|
|
|
|
// Copyright (c) 2012-2018, the Converse.js developers
|
|
|
|
// Licensed under the Mozilla Public License (MPLv2)
|
|
|
|
//
|
|
|
|
(function (root, factory) {
|
|
|
|
define([
|
|
|
|
"converse-core",
|
|
|
|
"xss",
|
|
|
|
"emojione",
|
|
|
|
"tpl!action",
|
|
|
|
"tpl!message",
|
|
|
|
"tpl!spoiler_message"
|
|
|
|
], factory);
|
|
|
|
}(this, function (
|
|
|
|
converse,
|
|
|
|
xss,
|
|
|
|
emojione,
|
|
|
|
tpl_action,
|
|
|
|
tpl_message,
|
|
|
|
tpl_spoiler_message
|
|
|
|
) {
|
|
|
|
"use strict";
|
|
|
|
const { Backbone, _, moment } = converse.env;
|
|
|
|
const u = converse.env.utils;
|
|
|
|
|
|
|
|
|
|
|
|
converse.plugins.add('converse-message-view', {
|
|
|
|
|
|
|
|
initialize () {
|
|
|
|
/* The initialize function gets called as soon as the plugin is
|
|
|
|
* loaded by converse.js's plugin machinery.
|
|
|
|
*/
|
|
|
|
const { _converse } = this,
|
|
|
|
{ __ } = _converse;
|
|
|
|
|
|
|
|
_converse.MessageView = Backbone.NativeView.extend({
|
|
|
|
|
|
|
|
initialize () {
|
|
|
|
this.model.collection.chatbox.on('change:fullname', this.render, this);
|
|
|
|
this.render();
|
|
|
|
},
|
|
|
|
|
|
|
|
render () {
|
|
|
|
/* Renders a chat message based on the passed in attributes.
|
|
|
|
*
|
|
|
|
* Parameters:
|
|
|
|
* (Object) attrs: An object containing the message attributes.
|
|
|
|
*
|
|
|
|
* Returns:
|
|
|
|
* The DOM element representing the message.
|
|
|
|
*/
|
|
|
|
const chatbox = this.model.collection.chatbox;
|
|
|
|
|
|
|
|
let text = this.model.get('message'),
|
|
|
|
fullname = chatbox.get('fullname') || chatbox.get('jid'),
|
|
|
|
template, username;
|
|
|
|
|
|
|
|
const match = text.match(/^\/(.*?)(?: (.*))?$/);
|
|
|
|
if ((match) && (match[1] === 'me')) {
|
|
|
|
text = text.replace(/^\/me/, '');
|
|
|
|
template = tpl_action;
|
|
|
|
if (this.model.get('sender') === 'me') {
|
|
|
|
fullname = _converse.xmppstatus.get('fullname') || this.model.get('fullname');
|
|
|
|
username = _.isNil(fullname)? _converse.bare_jid: fullname;
|
|
|
|
} else {
|
|
|
|
username = this.model.get('fullname');
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
username = this.model.get('sender') === 'me' && __('me') || fullname;
|
|
|
|
template = this.model.get('is_spoiler') ? tpl_spoiler_message : tpl_message;
|
|
|
|
}
|
|
|
|
text = u.geoUriToHttp(text, _converse);
|
|
|
|
|
|
|
|
const msg_time = moment(this.model.get('time')) || moment;
|
|
|
|
const msg = u.stringToElement(template(
|
|
|
|
_.extend(this.model.toJSON(), {
|
|
|
|
'time': msg_time.format(_converse.time_format),
|
|
|
|
'isodate': msg_time.format(),
|
|
|
|
'username': username,
|
|
|
|
'extra_classes': this.getExtraMessageClasses(),
|
|
|
|
'label_show': __('Show hidden message')
|
|
|
|
})
|
|
|
|
));
|
|
|
|
if (_converse.show_message_load_animation) {
|
|
|
|
window.setTimeout(_.partial(u.removeClass, 'onload', msg), 2000);
|
|
|
|
}
|
|
|
|
const msg_content = msg.querySelector('.chat-msg-content');
|
|
|
|
msg_content.innerHTML = u.addEmoji(
|
|
|
|
_converse, emojione, u.addHyperlinks(xss.filterXSS(text, {'whiteList': {}}))
|
|
|
|
);
|
2018-04-16 18:08:00 +02:00
|
|
|
|
2018-04-16 17:46:48 +02:00
|
|
|
if (msg_content.textContent.endsWith('mp4')) {
|
|
|
|
msg_content.innerHTML = u.renderMovieURLs(msg_content);
|
|
|
|
} else if (msg_content.textContent.endsWith('mp3')) {
|
2018-04-16 18:08:00 +02:00
|
|
|
msg_content.innerHTML = u.renderAudioURLs(msg_content);
|
2018-04-16 17:46:48 +02:00
|
|
|
} else {
|
|
|
|
u.renderImageURLs(msg_content).then(() => {
|
|
|
|
this.model.collection.trigger('rendered');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
if (!_.isNil(this.el.parentElement)) {
|
|
|
|
this.el.parentElement.replaceChild(msg, this.el);
|
|
|
|
}
|
|
|
|
this.setElement(msg);
|
|
|
|
return this.el;
|
|
|
|
},
|
|
|
|
|
|
|
|
getExtraMessageTemplateAttributes () {
|
|
|
|
/* Provides a hook for sending more attributes to the
|
|
|
|
* message template.
|
|
|
|
*
|
|
|
|
* Parameters:
|
|
|
|
* (Object) attrs: An object containing message attributes.
|
|
|
|
*/
|
|
|
|
if (this.model.get('is_spoiler')) {
|
|
|
|
return {};
|
|
|
|
} else {
|
|
|
|
return {}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
getExtraMessageClasses () {
|
|
|
|
let extra_classes;
|
|
|
|
if (_converse.show_message_load_animation) {
|
|
|
|
extra_classes = 'onload ' + (this.model.get('delayed') && 'delayed' || '');
|
|
|
|
} else {
|
|
|
|
extra_classes = this.model.get('delayed') && 'delayed' || '';
|
|
|
|
}
|
|
|
|
if (this.model.get('type') === 'groupchat' && this.model.get('sender') === 'them') {
|
|
|
|
if (this.model.collection.chatbox.isUserMentioned(this.model.get('message'))) {
|
|
|
|
// Add special class to mark groupchat messages
|
|
|
|
// in which we are mentioned.
|
|
|
|
extra_classes += ' mentioned';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return extra_classes;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return converse;
|
|
|
|
}));
|