diff --git a/js/models/conversations.js b/js/models/conversations.js index 8e471760b..cf0eebcbd 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2425,11 +2425,20 @@ if (!channelAPI) { return false; } - const success = await channelAPI.deleteMessage(message.getServerId()); - if (success) { + const serverId = message.getServerId(); + + const success = serverId + ? await channelAPI.deleteMessage(serverId) + : false; + + const shouldDeleteLocally = success || message.hasErrors() || !serverId; + // If the message has errors it is likely not saved + // on the server, so we delete it locally unconditionally + if (shouldDeleteLocally) { this.removeMessage(message.id); } - return success; + + return shouldDeleteLocally; }, removeMessage(messageId) { diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index cd7d14cf7..ad1651406 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1335,26 +1335,34 @@ ? i18n('deletePublicWarning') : i18n('deleteWarning'); + const doDelete = async () => { + if (this.model.isPublic()) { + const success = await this.model.deletePublicMessage(message); + if (!success) { + // Message failed to delete from server, show error? + return; + } + } else { + this.model.messageCollection.remove(message.id); + } + await window.Signal.Data.removeMessage(message.id, { + Message: Whisper.Message, + }); + message.trigger('unload'); + this.resetPanel(); + this.updateHeader(); + }; + + // The message wasn't saved, so we don't show any warning + if (message.hasErrors()) { + doDelete(); + return; + } + const dialog = new Whisper.ConfirmationDialogView({ message: warningMessage, okText: i18n('delete'), - resolve: async () => { - if (this.model.isPublic()) { - const success = await this.model.deletePublicMessage(message); - if (!success) { - // Message failed to delete from server, show error? - return; - } - } else { - this.model.messageCollection.remove(message.id); - } - await window.Signal.Data.removeMessage(message.id, { - Message: Whisper.Message, - }); - message.trigger('unload'); - this.resetPanel(); - this.updateHeader(); - }, + resolve: doDelete, }); this.$el.prepend(dialog.el);