diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index 4a69ed31c..005effad9 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -68,7 +68,7 @@ mtpRequestId EditMessage( const auto emptyFlag = MTPmessages_EditMessage::Flag(0); const auto flags = emptyFlag - | (!text.isEmpty() || media + | ((!text.isEmpty() || media) ? MTPmessages_EditMessage::Flag::f_message : emptyFlag) | ((media && inputMedia.has_value()) @@ -98,7 +98,7 @@ mtpRequestId EditMessage( item->history()->peer->input, MTP_int(id), MTP_string(text), - inputMedia.value_or(Data::WebPageForMTP(webpage)), + inputMedia.value_or(Data::WebPageForMTP(webpage, text.isEmpty())), MTPReplyMarkup(), sentEntities, MTP_int(options.scheduled) diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 932990d62..b1fb11572 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -2158,7 +2158,9 @@ void ApiWrap::saveDraftsToCloud() { history->peer->input, MTP_string(textWithTags.text), entities, - Data::WebPageForMTP(cloudDraft->webpage) + Data::WebPageForMTP( + cloudDraft->webpage, + textWithTags.text.isEmpty()) )).done([=](const MTPBool &result, const MTP::Response &response) { const auto requestId = response.requestId; history->finishSavingCloudDraft( diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 6d4985d97..fbdb5138e 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -1587,9 +1587,6 @@ void HistoryWidget::fieldChanged() { updateSendButtonType(); if (!HasSendText(_field)) { - if (_preview) { - _preview->apply({}); - } _fieldIsEmpty = true; } else if (_fieldIsEmpty) { _fieldIsEmpty = false; @@ -1887,7 +1884,7 @@ bool HistoryWidget::applyDraft(FieldHistoryAction fieldHistoryAction) { _processingReplyTo = _replyTo = FullReplyTo(); setEditMsgId(0); if (_preview) { - _preview->apply({}); + _preview->apply({ .removed = true }); } if (fieldWillBeHiddenAfterEdit) { updateControlsVisibility(); @@ -1923,7 +1920,17 @@ bool HistoryWidget::applyDraft(FieldHistoryAction fieldHistoryAction) { } if (_preview) { - _preview->apply(draft->webpage, !_editMsgId); + _preview->setDisabled(_editMsgId + && _replyEditMsg + && _replyEditMsg->media() + && !_replyEditMsg->media()->webpage()); + if (!_editMsgId) { + _preview->apply(draft->webpage, true); + } else if (!_replyEditMsg + || !_replyEditMsg->media() + || _replyEditMsg->media()->webpage()) { + _preview->apply(draft->webpage, false); + } } return true; } @@ -2503,6 +2510,9 @@ void HistoryWidget::setEditMsgId(MsgId msgId) { _editMsgId = msgId; if (!msgId) { _canReplaceMedia = false; + if (_preview) { + _preview->setDisabled(false); + } } if (_history) { refreshSendAsToggle(); @@ -3775,6 +3785,7 @@ void HistoryWidget::saveEditMsg() { cancelEdit(); return; } + const auto webPageDraft = _preview->draft(); const auto textWithTags = _field->getTextWithAppliedMarkdown(); const auto prepareFlags = Ui::ItemTextOptions( _history, @@ -3785,8 +3796,12 @@ void HistoryWidget::saveEditMsg() { TextUtilities::ConvertTextTagsToEntities(textWithTags.tags) }; TextUtilities::PrepareForSending(left, prepareFlags); + const auto media = item->media(); if (!TextUtilities::CutPart(sending, left, MaxMessageSize) - && (!item->media() || !item->media()->allowsEditCaption())) { + && (webPageDraft.removed + || webPageDraft.url.isEmpty() + || !webPageDraft.manual) + && (!media || !media->allowsEditCaption())) { const auto suggestModerateActions = false; controller()->show( Box(item, suggestModerateActions)); @@ -3844,7 +3859,7 @@ void HistoryWidget::saveEditMsg() { _saveEditMsgRequestId = Api::EditTextMessage( item, sending, - _preview->draft(), + webPageDraft, options, done, fail); @@ -6267,9 +6282,7 @@ void HistoryWidget::editDraftOptions() { } else { cancelReply(); } - if (_preview->draft() != webpage) { - _preview->apply(webpage); - } + _preview->apply(webpage); }; const auto highlight = [=] { controller()->showPeerHistory( @@ -7693,6 +7706,12 @@ void HistoryWidget::messageDataReceived( } else if (_editMsgId == msgId || (_replyTo.messageId == FullMsgId(peer->id, msgId))) { updateReplyEditTexts(true); + if (_editMsgId == msgId) { + _preview->setDisabled(_editMsgId + && _replyEditMsg + && _replyEditMsg->media() + && !_replyEditMsg->media()->webpage()); + } } } diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index c55046a1f..c203735c8 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -1758,9 +1758,6 @@ void ComposeControls::fieldChanged() { && (_textUpdateEvents & TextUpdateEvent::SendTyping)); updateSendButtonType(); _hasSendText = HasSendText(_field); - if (!_hasSendText.current() && _preview && !_preview->draft().manual) { - _preview->apply({ .removed = true }); - } if (updateBotCommandShown() || updateLikeShown()) { updateControlsVisibility(); updateControlsGeometry(_wrap->size()); @@ -1930,7 +1927,7 @@ void ComposeControls::applyDraft(FieldHistoryAction fieldHistoryAction) { _header->editMessage({}); _header->replyToMessage({}); if (_preview) { - _preview->apply({}); + _preview->apply({ .removed = true }); } _canReplaceMedia = false; _photoEditMedia = nullptr; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp index 1147395aa..60e9d1bb0 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp @@ -252,6 +252,7 @@ rpl::producer PreviewWrap::showLinkSelector( _history->nextNonHistoryEntryId(), (MessageFlag::FakeHistoryItem | MessageFlag::Outgoing + | MessageFlag::HasFromId | (webpage.invert ? MessageFlag::InvertMedia : MessageFlag())), UserId(), // via FullReplyTo(), diff --git a/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.cpp b/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.cpp index a3b402b29..c75accfb2 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.cpp @@ -163,13 +163,15 @@ void WebpageProcessor::apply(Data::WebPageDraft draft, bool reparse) { _link = QString(); _parsed = WebpageParsed(); updateFromData(); - } else if (draft.manual && draft.id && !draft.url.isEmpty()) { + } else if (draft.manual && !draft.url.isEmpty()) { _draft = draft; _parsedLinks = QStringList(); _links = QStringList(); _link = _draft.url; - const auto page = _history->owner().webpage(draft.id); - if (page->url == draft.url) { + const auto page = draft.id + ? _history->owner().webpage(draft.id).get() + : nullptr; + if (page && page->url == draft.url) { _data = page; updateFromData(); } else { @@ -220,7 +222,9 @@ void WebpageProcessor::request() { page->failed = true; } _cache.emplace(link, page->failed ? nullptr : page.get()); - if (_link == link && !_draft.removed && !_draft.manual) { + if (_link == link + && !_draft.removed + && (!_draft.manual || _draft.url == link)) { _data = (page->id && !page->failed) ? page.get() : nullptr; @@ -258,6 +262,15 @@ void WebpageProcessor::request() { }).send(); } +void WebpageProcessor::setDisabled(bool disabled) { + _parser.setDisabled(disabled); + if (disabled) { + apply({ .removed = true }); + } else { + checkNow(false); + } +} + void WebpageProcessor::checkNow(bool force) { _parser.parseNow(); if (force) { diff --git a/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.h b/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.h index e51c7c838..2c356eedc 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_webpage_processor.h @@ -53,6 +53,7 @@ public: not_null history, not_null field); + void setDisabled(bool disabled); void checkNow(bool force); // If editing a message without a preview we don't want to show