From dd04f650f8e4bc7b65691442ae08ee19e50ca5fd Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 7 Apr 2020 00:14:37 +1000 Subject: [PATCH 1/7] changes --- ts/components/conversation/ResetSessionNotification.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ts/components/conversation/ResetSessionNotification.tsx b/ts/components/conversation/ResetSessionNotification.tsx index 2d0394df3..92ab7c654 100644 --- a/ts/components/conversation/ResetSessionNotification.tsx +++ b/ts/components/conversation/ResetSessionNotification.tsx @@ -14,6 +14,7 @@ export class ResetSessionNotification extends React.Component { return (
{i18n(sessionResetMessageKey)} + the fairies are coming home
); } From 94be443822aca54703ba2e3ce74a189da6ef5c84 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 7 Apr 2020 15:19:18 +1000 Subject: [PATCH 2/7] Message deletion cleanup --- js/views/conversation_view.js | 9 ++++++++- ts/components/session/SessionConfirm.tsx | 2 -- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index e32b56742..f98839610 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1313,9 +1313,14 @@ 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 ); + console.log(`[deletion] isAllOurs: `, isAllOurs); + console.log(`[deletion] isModerator: `, isModerator); + console.log(`[deletion] selected: `, selected); + + if (!isAllOurs && !isModerator) { window.pushToast({ title: i18n('messageDeletionForbidden'), @@ -1382,8 +1387,10 @@ } window.confirmationDialog({ + title: i18n('deleteMessage'), message: warningMessage, okText: i18n('delete'), + okTheme: 'danger', resolve: doDelete, }); }, 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 { )} -
-
Date: Tue, 7 Apr 2020 15:23:33 +1000 Subject: [PATCH 3/7] Remove debugging logs --- js/views/conversation_view.js | 8 ++------ ts/components/conversation/ResetSessionNotification.tsx | 1 - 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index f98839610..17ad5f887 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1313,14 +1313,10 @@ const selected = Array.from(this.model.selectedMessages); const isModerator = this.model.isModerator(ourPubkey); const isAllOurs = selected.every( - message => message.propsForMessage.authorPhoneNumber === message.OUR_NUMBER + message => + message.propsForMessage.authorPhoneNumber === message.OUR_NUMBER ); - console.log(`[deletion] isAllOurs: `, isAllOurs); - console.log(`[deletion] isModerator: `, isModerator); - console.log(`[deletion] selected: `, selected); - - if (!isAllOurs && !isModerator) { window.pushToast({ title: i18n('messageDeletionForbidden'), diff --git a/ts/components/conversation/ResetSessionNotification.tsx b/ts/components/conversation/ResetSessionNotification.tsx index 92ab7c654..2d0394df3 100644 --- a/ts/components/conversation/ResetSessionNotification.tsx +++ b/ts/components/conversation/ResetSessionNotification.tsx @@ -14,7 +14,6 @@ export class ResetSessionNotification extends React.Component { return (
{i18n(sessionResetMessageKey)} - the fairies are coming home
); } From 99200bb725c76a1496cb05ca30222e7b376774b4 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 7 Apr 2020 16:43:53 +1000 Subject: [PATCH 4/7] 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 ? ( From 9229ee74824899315de7430a0e41d4bbfa7f13b1 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 7 Apr 2020 16:49:23 +1000 Subject: [PATCH 5/7] Linted --- js/views/conversation_view.js | 10 ++++++---- ts/components/conversation/ConversationHeader.tsx | 11 +++++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 1ebe52ef6..301a1eb5c 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1337,7 +1337,7 @@ const isPublic = this.model.isPublic(); // In future, we may be able to unsend private messages also - // isServerDeletable also defined in ConversationHeader.tsx for + // isServerDeletable also defined in ConversationHeader.tsx for // future reference const isServerDeletable = !!isPublic; @@ -1390,9 +1390,11 @@ // If removable from server, we "Unsend" - otherwise "Delete" const pluralSuffix = multiple ? 's' : ''; - const title = i18n(isPublic - ? `unsendMessage${pluralSuffix}` - : `deleteMessage${pluralSuffix}`); + const title = i18n( + isPublic + ? `unsendMessage${pluralSuffix}` + : `deleteMessage${pluralSuffix}` + ); const okText = i18n(isServerDeletable ? 'unsend' : 'delete'); diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 9a96d8553..3a4a676ce 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -356,10 +356,17 @@ export class ConversationHeader extends React.Component { } public renderSelectionOverlay() { - const { onDeleteSelectedMessages, onCloseOverlay, isPublic, i18n } = this.props; + const { + onDeleteSelectedMessages, + onCloseOverlay, + isPublic, + i18n, + } = this.props; const isServerDeletable = !!isPublic; - const deleteMessageButtonText = i18n(isServerDeletable ? 'unsend' : 'delete'); + const deleteMessageButtonText = i18n( + isServerDeletable ? 'unsend' : 'delete' + ); return (
From 399ffa3c323bca82092dd7a79971a623cff7939f Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 7 Apr 2020 18:15:23 +1000 Subject: [PATCH 6/7] Remove redundant bool casting --- js/views/conversation_view.js | 10 ++++------ ts/components/conversation/ConversationHeader.tsx | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 301a1eb5c..2fed7a627 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1339,7 +1339,7 @@ // In future, we may be able to unsend private messages also // isServerDeletable also defined in ConversationHeader.tsx for // future reference - const isServerDeletable = !!isPublic; + const isServerDeletable = isPublic; const warningMessage = (() => { if (isPublic) { @@ -1390,11 +1390,9 @@ // If removable from server, we "Unsend" - otherwise "Delete" const pluralSuffix = multiple ? 's' : ''; - const title = i18n( - isPublic - ? `unsendMessage${pluralSuffix}` - : `deleteMessage${pluralSuffix}` - ); + const title = i18n(isPublic + ? `unsendMessage${pluralSuffix}` + : `deleteMessage${pluralSuffix}`); const okText = i18n(isServerDeletable ? 'unsend' : 'delete'); diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 3a4a676ce..227f66246 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -363,7 +363,7 @@ export class ConversationHeader extends React.Component { i18n, } = this.props; - const isServerDeletable = !!isPublic; + const isServerDeletable = isPublic; const deleteMessageButtonText = i18n( isServerDeletable ? 'unsend' : 'delete' ); From 9c9b8e08efeea6975b2d5e30f6c8abca681635c5 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 7 Apr 2020 18:15:23 +1000 Subject: [PATCH 7/7] Remove redundant bool casting --- js/views/conversation_view.js | 2 +- ts/components/conversation/ConversationHeader.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 301a1eb5c..564db2dd6 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1339,7 +1339,7 @@ // In future, we may be able to unsend private messages also // isServerDeletable also defined in ConversationHeader.tsx for // future reference - const isServerDeletable = !!isPublic; + const isServerDeletable = isPublic; const warningMessage = (() => { if (isPublic) { diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 3a4a676ce..227f66246 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -363,7 +363,7 @@ export class ConversationHeader extends React.Component { i18n, } = this.props; - const isServerDeletable = !!isPublic; + const isServerDeletable = isPublic; const deleteMessageButtonText = i18n( isServerDeletable ? 'unsend' : 'delete' );