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('moderated')).toBe('retracted');
expect(view.model.messages.at(0).get('moderation_reason')).toBe(reason); 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('is_ephemeral')).toBe(false);
expect(view.model.messages.at(0).get('editable')).toBe(false);
expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1); expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1);
const msg_el = view.el.querySelector('.chat-msg--retracted .chat-msg__message'); const msg_el = view.el.querySelector('.chat-msg--retracted .chat-msg__message');
@ -571,7 +572,7 @@
const message = view.model.messages.at(0); const message = view.model.messages.at(0);
expect(message.get('retracted')).toBeTruthy(); expect(message.get('retracted')).toBeTruthy();
expect(message.get('is_ephemeral')).toBeTruthy(); expect(message.get('is_ephemeral')).toBe(false);
expect(message.get('editable')).toBeFalsy(); expect(message.get('editable')).toBeFalsy();
const stanza_id = message.get(`stanza_id ${muc_jid}`); const stanza_id = message.get(`stanza_id ${muc_jid}`);
@ -591,7 +592,7 @@
expect(view.model.messages.length).toBe(1); expect(view.model.messages.length).toBe(1);
expect(view.model.messages.at(0).get('retracted')).toBeTruthy(); 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.model.messages.at(0).get('editable')).toBe(false);
expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1); expect(view.el.querySelectorAll('.chat-msg--retracted').length).toBe(1);
const el = view.el.querySelector('.chat-msg--retracted .chat-msg__message div'); 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.length).toBe(1);
expect(view.model.messages.at(0).get('retracted')).toBeFalsy(); 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('is_ephemeral')).toBeFalsy();
expect(view.model.messages.at(0).get('editable')).toBeTruthy();
expect(view.el.querySelectorAll('.chat-error').length).toBe(1); expect(view.el.querySelectorAll('.chat-error').length).toBe(1);
const errmsg = view.el.querySelector('.chat-error'); const errmsg = view.el.querySelector('.chat-error');
@ -675,6 +677,7 @@
expect(view.model.messages.length).toBe(1); expect(view.model.messages.length).toBe(1);
expect(view.model.messages.at(0).get('retracted')).toBeFalsy(); 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('is_ephemeral')).toBeFalsy();
expect(view.model.messages.at(0).get('editable')).toBeTruthy();
const error_messages = view.el.querySelectorAll('.chat-error'); const error_messages = view.el.querySelectorAll('.chat-error');
expect(error_messages.length).toBe(2); 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. * @param { string } [reason] - The reason for retracting the message.
*/ */
async retractOtherMessage (message, reason) { async retractOtherMessage (message, reason) {
const result = await this.model.sendRetractionIQ(message, reason); const result = await this.model.retractOtherMessage(message, reason);
if (result === null) { if (result === null) {
const err_msg = __(`A timeout occurred while trying to retract the message`); const err_msg = __(`A timeout occurred while trying to retract the message`);
_converse.api.alert('error', __('Error'), err_msg); _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.api.alert('error', __('Error'), err_msg);
_converse.log(err_msg, Strophe.LogLevel.WARN); _converse.log(err_msg, Strophe.LogLevel.WARN);
_converse.log(result, 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 * @private
* @method _converse.ChatRoom#retractOwnMessage * @method _converse.ChatRoom#retractOwnMessage
* @param { _converse.Message } message - The message which we're retracting. * @param { _converse.Message } message - The message which we're retracting.
*/ */
async retractOwnMessage(message) { async retractOwnMessage(message) {
const editable = message.get('editable'); const editable = message.get('editable');
const is_ephemeral = message.get('is_ephemeral');
// Optimistic save // Optimistic save
message.save({ message.save({
'retracted': (new Date()).toISOString(), 'retracted': (new Date()).toISOString(),
'retracted_id': message.get('origin_id'), 'retracted_id': message.get('origin_id'),
'is_ephemeral': true,
'editable': false 'editable': false
}); });
try { try {
await this.sendRetractionMessage(message) await this.sendRetractionMessage(message)
} catch (e) { } catch (e) {
message.save({ message.save({
is_ephemeral,
editable, editable,
'retracted': undefined, 'retracted': undefined,
'retracted_id': 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. * Sends a message stanza to retract a message in this groupchat.
* @private * @private