From c46b96f25269305f28a09fa7dd3e3a35db968f6b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 28 May 2020 17:57:21 +0300 Subject: [PATCH] Moved edit captions from EditCaptionBox to api_editing. --- Telegram/SourceFiles/api/api_editing.cpp | 34 +++++- Telegram/SourceFiles/api/api_editing.h | 7 ++ .../SourceFiles/boxes/edit_caption_box.cpp | 104 +++++++----------- Telegram/SourceFiles/boxes/edit_caption_box.h | 6 - 4 files changed, 74 insertions(+), 77 deletions(-) diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index af50e7c47..dcfca83ff 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -17,12 +17,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_item.h" #include "lang/lang_keys.h" #include "main/main_session.h" +#include "mtproto/mtproto_rpc_sender.h" namespace Api { namespace { -void EditMessage( +mtpRequestId EditMessage( not_null item, + const TextWithEntities &textWithEntities, SendOptions options, Fn)> done, Fn fail, @@ -30,16 +32,16 @@ void EditMessage( const auto session = &item->history()->session(); const auto api = &session->api(); - const auto text = item->originalText().text; + const auto text = textWithEntities.text; const auto sentEntities = EntitiesToMTP( session, - item->originalText().entities, + textWithEntities.entities, ConvertOption::SkipLocal); const auto media = item->media(); const auto emptyFlag = MTPmessages_EditMessage::Flag(0); const auto flags = emptyFlag - | (!text.isEmpty() + | (!text.isEmpty() || media ? MTPmessages_EditMessage::Flag::f_message : emptyFlag) | ((media && inputMedia.has_value()) @@ -58,7 +60,7 @@ void EditMessage( const auto id = item->isScheduled() ? session->data().scheduledMessages().lookupId(item) : item->id; - api->request(MTPmessages_EditMessage( + return api->request(MTPmessages_EditMessage( MTP_flags(flags), item->history()->peer->input, MTP_int(id), @@ -74,6 +76,16 @@ void EditMessage( ).send(); } +mtpRequestId EditMessage( + not_null item, + SendOptions options, + Fn)> done, + Fn fail, + std::optional inputMedia = std::nullopt) { + const auto &text = item->originalText(); + return EditMessage(item, text, options, done, fail, inputMedia); +} + void EditMessageWithUploadedMedia( not_null item, SendOptions options, @@ -143,5 +155,17 @@ void EditMessageWithUploadedPhoto( EditMessageWithUploadedMedia(item, options, media); } +mtpRequestId EditCaption( + not_null item, + const TextWithEntities &caption, + Fn done, + Fn fail) { + const auto callback = [=](const auto &result, Fn applyUpdates) { + done(result); + applyUpdates(); + }; + return EditMessage(item, caption, SendOptions(), callback, fail); +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_editing.h b/Telegram/SourceFiles/api/api_editing.h index 0932da682..d27a2521d 100644 --- a/Telegram/SourceFiles/api/api_editing.h +++ b/Telegram/SourceFiles/api/api_editing.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once class HistoryItem; +class RPCError; namespace Api { @@ -28,4 +29,10 @@ void EditMessageWithUploadedPhoto( const MTPInputFile &file, SendOptions options); +mtpRequestId EditCaption( + not_null item, + const TextWithEntities &caption, + Fn done, + Fn fail); + } // namespace Api diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index 2c32e27b5..4284789d4 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/edit_caption_box.h" #include "apiwrap.h" +#include "api/api_editing.h" #include "api/api_text_entities.h" #include "main/main_session.h" #include "chat_helpers/emoji_suggestions_widget.h" @@ -70,7 +71,6 @@ EditCaptionBox::EditCaptionBox( not_null controller, not_null item) : _controller(controller) -, _api(&controller->session().mtp()) , _msgId(item->fullId()) { Expects(item->media() != nullptr); Expects(item->media()->allowsEditCaption()); @@ -930,37 +930,13 @@ void EditCaptionBox::save() { return; } - auto flags = MTPmessages_EditMessage::Flag::f_message | 0; - if (_previewCancelled) { - flags |= MTPmessages_EditMessage::Flag::f_no_webpage; - } const auto textWithTags = _field->getTextWithAppliedMarkdown(); - auto sending = TextWithEntities{ + const auto sending = TextWithEntities{ textWithTags.text, TextUtilities::ConvertTextTagsToEntities(textWithTags.tags) }; - const auto prepareFlags = Ui::ItemTextOptions( - item->history(), - _controller->session().user()).flags; - TextUtilities::PrepareForSending(sending, prepareFlags); - TextUtilities::Trim(sending); - - const auto sentEntities = Api::EntitiesToMTP( - &item->history()->session(), - sending.entities, - Api::ConvertOption::SkipLocal); - if (!sentEntities.v.isEmpty()) { - flags |= MTPmessages_EditMessage::Flag::f_entities; - } if (!_preparedList.files.empty()) { - const auto textWithTags = _field->getTextWithAppliedMarkdown(); - auto sending = TextWithEntities{ - textWithTags.text, - TextUtilities::ConvertTextTagsToEntities(textWithTags.tags) - }; - item->setText(sending); - _controller->session().api().editMedia( std::move(_preparedList), (!_asFile && _photo) ? SendMediaType::Photo : SendMediaType::File, @@ -971,47 +947,43 @@ void EditCaptionBox::save() { return; } - _saveRequestId = _api.request(MTPmessages_EditMessage( - MTP_flags(flags), - item->history()->peer->input, - MTP_int(item->id), - MTP_string(sending.text), - MTPInputMedia(), - MTPReplyMarkup(), - sentEntities, - MTP_int(0) - )).done([=](const MTPUpdates &result) { - saveDone(result); - }).fail([=](const RPCError &error) { - saveFail(error); - }).send(); -} - -void EditCaptionBox::saveDone(const MTPUpdates &updates) { - _saveRequestId = 0; - const auto controller = _controller; - closeBox(); - controller->session().api().applyUpdates(updates); -} - -void EditCaptionBox::saveFail(const RPCError &error) { - _saveRequestId = 0; - const auto &type = error.type(); - if (type == qstr("MESSAGE_ID_INVALID") - || type == qstr("CHAT_ADMIN_REQUIRED") - || type == qstr("MESSAGE_EDIT_TIME_EXPIRED")) { - _error = tr::lng_edit_error(tr::now); - update(); - } else if (type == qstr("MESSAGE_NOT_MODIFIED")) { + const auto done = crl::guard(this, [=](const MTPUpdates &updates) { + _saveRequestId = 0; closeBox(); - } else if (type == qstr("MESSAGE_EMPTY")) { - _field->setFocus(); - _field->showError(); - update(); - } else { - _error = tr::lng_edit_error(tr::now); - update(); - } + }); + + const auto fail = crl::guard(this, [=](const RPCError &error) { + const auto defaultErrors = { + u"MESSAGE_ID_INVALID"_q, + u"CHAT_ADMIN_REQUIRED"_q, + u"MESSAGE_EDIT_TIME_EXPIRED"_q, + }; + + _saveRequestId = 0; + const auto &type = error.type(); + if (ranges::contains(defaultErrors, type)) { + _error = tr::lng_edit_error(tr::now); + update(); + } else if (type == u"MESSAGE_NOT_MODIFIED"_q) { + closeBox(); + } else if (type == u"MESSAGE_EMPTY"_q) { + _field->setFocus(); + _field->showError(); + update(); + } else { + _error = tr::lng_edit_error(tr::now); + update(); + } + }); + + lifetime().add([=] { + if (_saveRequestId) { + auto &session = _controller->session(); + session.api().request(base::take(_saveRequestId)).cancel(); + } + }); + + _saveRequestId = Api::EditCaption(item, sending, done, fail); } void EditCaptionBox::setName(QString nameString, qint64 size) { diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.h b/Telegram/SourceFiles/boxes/edit_caption_box.h index 61e2eb72a..6035bfa86 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.h +++ b/Telegram/SourceFiles/boxes/edit_caption_box.h @@ -10,7 +10,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/abstract_box.h" #include "storage/storage_media_prepare.h" #include "ui/wrap/slide_wrap.h" -#include "mtproto/sender.h" class Image; @@ -83,9 +82,6 @@ private: void save(); void captionResized(); - void saveDone(const MTPUpdates &updates); - void saveFail(const RPCError &error); - void setName(QString nameString, qint64 size); bool fileFromClipboard(not_null data); void updateEditPreview(); @@ -102,7 +98,6 @@ private: } const not_null _controller; - MTP::Sender _api; FullMsgId _msgId; std::shared_ptr _photoMedia; @@ -135,7 +130,6 @@ private: Storage::PreparedList _preparedList; - bool _previewCancelled = false; mtpRequestId _saveRequestId = 0; object_ptr _editMedia = nullptr;