Retracted moderated message should not be editable.

Also, don't set retracted MUC messages as ephemeral, we want to keep on
showing them to provide context in a MUC.
This commit is contained in:
JC Brand 2020-02-18 16:06:59 +01:00
parent 227b70339c
commit ead8cdbcd6
3 changed files with 38 additions and 14 deletions

View File

@ -424,6 +424,7 @@
expect(view.model.messages.at(0).get('moderated')).toBe('retracted');
expect(view.model.messages.at(0).get('moderation_reason')).toBe(reason);
expect(view.model.messages.at(0).get('is_ephemeral')).toBe(false);
expect(view.model.messages.at(0).get('editable')).toBe(false);
expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1);
const msg_el = view.el.querySelector('.chat-msg--retracted .chat-msg__message');
@ -571,7 +572,7 @@
const message = view.model.messages.at(0);
expect(message.get('retracted')).toBeTruthy();
expect(message.get('is_ephemeral')).toBeTruthy();
expect(message.get('is_ephemeral')).toBe(false);
expect(message.get('editable')).toBeFalsy();
const stanza_id = message.get(`stanza_id ${muc_jid}`);
@ -591,7 +592,7 @@
expect(view.model.messages.length).toBe(1);
expect(view.model.messages.at(0).get('retracted')).toBeTruthy();
expect(view.model.messages.at(0).get('is_ephemeral')).toBe(true);
expect(view.model.messages.at(0).get('is_ephemeral')).toBe(false);
expect(view.model.messages.at(0).get('editable')).toBe(false);
expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1);
const el = view.el.querySelector('.chat-msg--retracted .chat-msg__message div');
@ -640,6 +641,7 @@
expect(view.model.messages.length).toBe(1);
expect(view.model.messages.at(0).get('retracted')).toBeFalsy();
expect(view.model.messages.at(0).get('is_ephemeral')).toBeFalsy();
expect(view.model.messages.at(0).get('editable')).toBeTruthy();
expect(view.el.querySelectorAll('.chat-error').length).toBe(1);
const errmsg = view.el.querySelector('.chat-error');
@ -675,6 +677,7 @@
expect(view.model.messages.length).toBe(1);
expect(view.model.messages.at(0).get('retracted')).toBeFalsy();
expect(view.model.messages.at(0).get('is_ephemeral')).toBeFalsy();
expect(view.model.messages.at(0).get('editable')).toBeTruthy();
const error_messages = view.el.querySelectorAll('.chat-error');
expect(error_messages.length).toBe(2);

View File

@ -990,7 +990,7 @@ converse.plugins.add('converse-muc-views', {
* @param { string } [reason] - The reason for retracting the message.
*/
async retractOtherMessage (message, reason) {
const result = await this.model.sendRetractionIQ(message, reason);
const result = await this.model.retractOtherMessage(message, reason);
if (result === null) {
const err_msg = __(`A timeout occurred while trying to retract the message`);
_converse.api.alert('error', __('Error'), err_msg);
@ -1000,13 +1000,6 @@ converse.plugins.add('converse-muc-views', {
_converse.api.alert('error', __('Error'), err_msg);
_converse.log(err_msg, Strophe.LogLevel.WARN);
_converse.log(result, Strophe.LogLevel.WARN);
} else {
message.save({
'moderated': 'retracted',
'moderated_by': _converse.bare_jid,
'moderated_id': message.get('msgid'),
'moderation_reason': reason
});
}
},

View File

@ -648,26 +648,23 @@ converse.plugins.add('converse-muc', {
},
/**
* Retract one of your messages in this chat
* Retract one of your messages in this groupchat
* @private
* @method _converse.ChatRoom#retractOwnMessage
* @param { _converse.Message } message - The message which we're retracting.
*/
async retractOwnMessage(message) {
const editable = message.get('editable');
const is_ephemeral = message.get('is_ephemeral');
// Optimistic save
message.save({
'retracted': (new Date()).toISOString(),
'retracted_id': message.get('origin_id'),
'is_ephemeral': true,
'editable': false
});
try {
await this.sendRetractionMessage(message)
} catch (e) {
message.save({
is_ephemeral,
editable,
'retracted': undefined,
'retracted_id': undefined,
@ -676,6 +673,37 @@ converse.plugins.add('converse-muc', {
}
},
/**
* Retract someone else's message in this groupchat.
* @private
* @method _converse.ChatRoom#retractOtherMessage
* @param { _converse.Message } message - The message which we're retracting.
* @param { string } [reason] - The reason for retracting the message.
*/
async retractOtherMessage (message, reason) {
const editable = message.get('editable');
// Optimistic save
message.save({
'moderated': 'retracted',
'moderated_by': _converse.bare_jid,
'moderated_id': message.get('msgid'),
'moderation_reason': reason,
'editable': false
});
const result = await this.sendRetractionIQ(message, reason);
if (result === null || u.isErrorStanza(result)) {
// Undo the save if something went wrong
message.save({
editable,
'moderated': undefined,
'moderated_by': undefined,
'moderated_id': undefined,
'moderation_reason': undefined,
});
}
return result;
},
/**
* Sends a message stanza to retract a message in this groupchat.
* @private