From 99200bb725c76a1496cb05ca30222e7b376774b4 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 7 Apr 2020 16:43:53 +1000 Subject: [PATCH] Message unsendability --- _locales/en/messages.json | 18 +++++++++++++-- js/views/conversation_view.js | 22 +++++++++++++++---- .../conversation/ConversationHeader.tsx | 7 ++++-- ts/components/conversation/Message.tsx | 5 ++++- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index b0a57a3dd..94a1fede4 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1060,17 +1060,20 @@ "delete": { "message": "Delete" }, + "unsend": { + "message": "Unsend" + }, "forwardMessage": { "message": "Forward", "description": "Text of Forward Message button" }, "deletePublicWarning": { "message": - "Are you sure? Clicking 'delete' will permanently remove this message for everyone in this channel." + "Are you sure? Clicking 'unsend' will permanently remove this message for everyone in this channel." }, "deleteMultiplePublicWarning": { "message": - "Are you sure? Clicking 'delete' will permanently remove these messages for everyone in this channel." + "Are you sure? Clicking 'unsend' will permanently remove these messages for everyone in this channel." }, "deleteWarning": { "message": @@ -1180,6 +1183,16 @@ "description": "Shown on the drop-down menu for an individual message, deletes single message" }, + "unsendMessage": { + "message": "Unsend Message", + "description": + "Shown on the drop-down menu for an individual message being removed from the server" + }, + "unsendMessages": { + "message": "Unsend Messages", + "description": + "Tiitle for prompt and header button for messages being removed from the server" + }, "messages": { "message": "Messages", "description": "Message search result" @@ -1188,6 +1201,7 @@ "message": "Delete Messages", "description": "Menu item for deleting messages, title case." }, + "deletePublicConversationConfirmation": { "message": "Permanently delete the messages locally from this public channel?", diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 17ad5f887..1ebe52ef6 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1334,9 +1334,15 @@ deleteMessages(messages, onSuccess) { const multiple = messages.length > 1; + const isPublic = this.model.isPublic(); + + // In future, we may be able to unsend private messages also + // isServerDeletable also defined in ConversationHeader.tsx for + // future reference + const isServerDeletable = !!isPublic; const warningMessage = (() => { - if (this.model.isPublic()) { + if (isPublic) { return multiple ? i18n('deleteMultiplePublicWarning') : i18n('deletePublicWarning'); @@ -1347,7 +1353,7 @@ const doDelete = async () => { let toDeleteLocally; - if (this.model.isPublic()) { + if (isPublic) { toDeleteLocally = await this.model.deletePublicMessages(messages); if (toDeleteLocally.length === 0) { // Message failed to delete from server, show error? @@ -1382,10 +1388,18 @@ return; } + // If removable from server, we "Unsend" - otherwise "Delete" + const pluralSuffix = multiple ? 's' : ''; + const title = i18n(isPublic + ? `unsendMessage${pluralSuffix}` + : `deleteMessage${pluralSuffix}`); + + const okText = i18n(isServerDeletable ? 'unsend' : 'delete'); + window.confirmationDialog({ - title: i18n('deleteMessage'), + title, message: warningMessage, - okText: i18n('delete'), + okText, okTheme: 'danger', resolve: doDelete, }); diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 198d06fbd..9a96d8553 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -356,7 +356,10 @@ export class ConversationHeader extends React.Component { } public renderSelectionOverlay() { - const { onDeleteSelectedMessages, onCloseOverlay, i18n } = this.props; + const { onDeleteSelectedMessages, onCloseOverlay, isPublic, i18n } = this.props; + + const isServerDeletable = !!isPublic; + const deleteMessageButtonText = i18n(isServerDeletable ? 'unsend' : 'delete'); return (
@@ -372,7 +375,7 @@ export class ConversationHeader extends React.Component {
diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 99f1b3d97..16b7700c8 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -907,6 +907,9 @@ export class Message extends React.PureComponent { }, 100); }; + const isServerDeletable = !!this.props.isPublic; + const deleteMessageCtxText = i18n(isServerDeletable ? 'unsend' : 'delete'); + // CONTEXT MENU "Select Message" does not work return ( @@ -968,7 +971,7 @@ export class Message extends React.PureComponent { }} onClick={wrap(onDelete)} > - {i18n('deleteMessage')} + {deleteMessageCtxText} ) : null} {isPublic ? (