From 0bc21d74f7e8510f582bd14d5f04bdeda9865186 Mon Sep 17 00:00:00 2001 From: John Yong Date: Sun, 2 Apr 2017 02:34:43 +0800 Subject: [PATCH] Implement unsend messages. Fix #1340 --- app/js/controllers.js | 33 +++++++++++++++++++++++-- app/js/locales/en-us.json | 5 ++++ app/js/messages_manager.js | 25 ++++++++++++++++++- app/js/services.js | 4 ++- app/less/app.less | 2 +- app/partials/desktop/confirm_modal.html | 16 +++++++++++- 6 files changed, 79 insertions(+), 6 deletions(-) diff --git a/app/js/controllers.js b/app/js/controllers.js index 87d08cf2..12e95f88 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -1797,8 +1797,37 @@ angular.module('myApp.controllers', ['myApp.i18n']) }) } if (selectedMessageIDs.length) { - ErrorService.confirm({type: 'MESSAGES_DELETE', count: selectedMessageIDs.length}).then(function () { - AppMessagesManager.deleteMessages(selectedMessageIDs).then(function () { + var peerID = $scope.curDialog.peerID + var isUser = peerID > 0 + var isChannel = AppPeersManager.isChannel(peerID) + var isBroadcast = AppPeersManager.isBroadcast(peerID) + var isMegagroup = AppPeersManager.isMegagroup(peerID) + var isUsualGroup = !isChannel && !isUser + + var revocable = !isChannel + for (var i = 0; revocable && i < selectedMessageIDs.length; i++) { + var messageID = selectedMessageIDs[i] + if (!AppMessagesManager.canRevokeMessage(messageID)) { + revocable = false + } + } + + var userFirstName = false + if (isUser) { + userFirstName = AppUsersManager.getUser(peerID).first_name + } + + ErrorService.confirm({ + type: 'MESSAGES_DELETE', + count: selectedMessageIDs.length, + revocable: revocable, + isUser: isUser, + userFirstName: userFirstName, + isChannel: isBroadcast, + isSupergroup: isMegagroup, + isUsualGroup: isUsualGroup + }, {}, { revoke: false }).then(function (data) { + AppMessagesManager.deleteMessages(selectedMessageIDs, data.revoke).then(function () { selectedCancel() }) }) diff --git a/app/js/locales/en-us.json b/app/js/locales/en-us.json index 5b2fc489..ea81df2b 100644 --- a/app/js/locales/en-us.json +++ b/app/js/locales/en-us.json @@ -228,6 +228,11 @@ "confirm_modal_clipboard_X_files_send": "{'one': 'Are you sure to send file from clipboard?', 'other': 'Are you sure to send {} files from clipboard?'}", "confirm_modal_message_delete": "Are you sure you want to delete the message?", "confirm_modal_X_messages_delete": "{'one': 'Are you sure you want to delete the message?', 'other': 'Are you sure you want to delete {} messages?'}", + "confirm_modal_message_revoke": "Delete for {recipient}", + "confirm_modal_message_revoke_recipient_group": "everyone", + "confirm_modal_X_messages_non_configurable_for_everyone": "{'one': 'This will delete it for everyone in this chat.', 'other': 'This will delete them for everyone in this chat.'}", + "confirm_modal_X_messages_non_configurable_for_user_only": "{'one': 'This will delete it just for you, not for {{ userFirstName }}.', 'other': 'This will delete them just for you, not for {{ userFirstName }}.'}", + "confirm_modal_X_messages_non_configurable_for_user_only_in_group": "{'one': 'This will delete it just for you, not for other participants of the chat.', 'other': 'This will delete them just for you, not for other participants of the chat.'}", "confirm_modal_photo_delete": "Are you sure you want to delete the photo?", "confirm_modal_contacts_import": "Telegram will now sync your contacts in order to find your friends.", "confirm_modal_login_phone_correct": "Is this phone number correct?", diff --git a/app/js/messages_manager.js b/app/js/messages_manager.js index ad086d2a..c6c81ed1 100644 --- a/app/js/messages_manager.js +++ b/app/js/messages_manager.js @@ -957,7 +957,24 @@ angular.module('myApp.services') }) } - function deleteMessages (messageIDs) { + function canRevokeMessage(messageID) { + if (messageID <= 0 || + !messagesStorage[messageID]) { + return false + } + + var message = messagesStorage[messageID] + if (message._ != 'message' || + message.deleted || + !message.pFlags.out || + message.date < tsNow(true) - 2 * 86400) { + return false + } + + return true + } + + function deleteMessages (messageIDs, revoke) { var splitted = AppMessagesIDsManager.splitMessageIDsByChannels(messageIDs) var promises = [] angular.forEach(splitted.msgIDs, function (msgIDs, channelID) { @@ -995,7 +1012,12 @@ angular.module('myApp.services') }) }) } else { + var flags = 0 + if (revoke) { + flags |= 1 + } promise = MtpApiManager.invokeApi('messages.deleteMessages', { + flags: flags, id: msgIDs }).then(function (affectedMessages) { ApiUpdatesManager.processUpdateMessage({ @@ -3392,6 +3414,7 @@ angular.module('myApp.services') canMessageBeEdited: canMessageBeEdited, canEditMessage: canEditMessage, getMessageEditData: getMessageEditData, + canRevokeMessage: canRevokeMessage, clearDialogCache: clearDialogCache, wrapForDialog: wrapForDialog, wrapForHistory: wrapForHistory, diff --git a/app/js/services.js b/app/js/services.js index 575e446c..e2325763 100755 --- a/app/js/services.js +++ b/app/js/services.js @@ -4152,10 +4152,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }) } - function confirm (params, options) { + function confirm (params, options, data) { options = options || {} + data = data || {} var scope = $rootScope.$new() angular.extend(scope, params) + angular.extend(scope, { data: data }) var modal = $modal.open({ templateUrl: templateUrl('confirm_modal'), diff --git a/app/less/app.less b/app/less/app.less index 81873052..b2d9a898 100644 --- a/app/less/app.less +++ b/app/less/app.less @@ -741,7 +741,7 @@ a { } } -a.tg_checkbox { +a.tg_checkbox, p.tg_checkbox { color: #000; display: block; line-height: 18px; diff --git a/app/partials/desktop/confirm_modal.html b/app/partials/desktop/confirm_modal.html index 67fb67ad..777fe531 100644 --- a/app/partials/desktop/confirm_modal.html +++ b/app/partials/desktop/confirm_modal.html @@ -25,6 +25,20 @@ + + + + + + + + + +

+ + + +

@@ -86,7 +100,7 @@ -