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 e32b56742..564db2dd6 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1313,7 +1313,8 @@ const selected = Array.from(this.model.selectedMessages); const isModerator = this.model.isModerator(ourPubkey); const isAllOurs = selected.every( - message => message.attributes.source === message.OUR_NUMBER + message => + message.propsForMessage.authorPhoneNumber === message.OUR_NUMBER ); if (!isAllOurs && !isModerator) { @@ -1333,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'); @@ -1346,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? @@ -1381,9 +1388,21 @@ 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, 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..227f66246 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -356,7 +356,17 @@ 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 +382,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 ? ( diff --git a/ts/components/session/SessionConfirm.tsx b/ts/components/session/SessionConfirm.tsx index 2b43cc543..859e856c8 100644 --- a/ts/components/session/SessionConfirm.tsx +++ b/ts/components/session/SessionConfirm.tsx @@ -69,8 +69,6 @@ export class SessionConfirm extends React.Component { )} -
-