Improve editing messages with webpage previews.

This commit is contained in:
John Preston 2023-10-26 10:26:06 +04:00
parent c035ec6917
commit 3b91e2dee4
7 changed files with 54 additions and 21 deletions

View file

@ -68,7 +68,7 @@ mtpRequestId EditMessage(
const auto emptyFlag = MTPmessages_EditMessage::Flag(0); const auto emptyFlag = MTPmessages_EditMessage::Flag(0);
const auto flags = emptyFlag const auto flags = emptyFlag
| (!text.isEmpty() || media | ((!text.isEmpty() || media)
? MTPmessages_EditMessage::Flag::f_message ? MTPmessages_EditMessage::Flag::f_message
: emptyFlag) : emptyFlag)
| ((media && inputMedia.has_value()) | ((media && inputMedia.has_value())
@ -98,7 +98,7 @@ mtpRequestId EditMessage(
item->history()->peer->input, item->history()->peer->input,
MTP_int(id), MTP_int(id),
MTP_string(text), MTP_string(text),
inputMedia.value_or(Data::WebPageForMTP(webpage)), inputMedia.value_or(Data::WebPageForMTP(webpage, text.isEmpty())),
MTPReplyMarkup(), MTPReplyMarkup(),
sentEntities, sentEntities,
MTP_int(options.scheduled) MTP_int(options.scheduled)

View file

@ -2158,7 +2158,9 @@ void ApiWrap::saveDraftsToCloud() {
history->peer->input, history->peer->input,
MTP_string(textWithTags.text), MTP_string(textWithTags.text),
entities, entities,
Data::WebPageForMTP(cloudDraft->webpage) Data::WebPageForMTP(
cloudDraft->webpage,
textWithTags.text.isEmpty())
)).done([=](const MTPBool &result, const MTP::Response &response) { )).done([=](const MTPBool &result, const MTP::Response &response) {
const auto requestId = response.requestId; const auto requestId = response.requestId;
history->finishSavingCloudDraft( history->finishSavingCloudDraft(

View file

@ -1587,9 +1587,6 @@ void HistoryWidget::fieldChanged() {
updateSendButtonType(); updateSendButtonType();
if (!HasSendText(_field)) { if (!HasSendText(_field)) {
if (_preview) {
_preview->apply({});
}
_fieldIsEmpty = true; _fieldIsEmpty = true;
} else if (_fieldIsEmpty) { } else if (_fieldIsEmpty) {
_fieldIsEmpty = false; _fieldIsEmpty = false;
@ -1887,7 +1884,7 @@ bool HistoryWidget::applyDraft(FieldHistoryAction fieldHistoryAction) {
_processingReplyTo = _replyTo = FullReplyTo(); _processingReplyTo = _replyTo = FullReplyTo();
setEditMsgId(0); setEditMsgId(0);
if (_preview) { if (_preview) {
_preview->apply({}); _preview->apply({ .removed = true });
} }
if (fieldWillBeHiddenAfterEdit) { if (fieldWillBeHiddenAfterEdit) {
updateControlsVisibility(); updateControlsVisibility();
@ -1923,7 +1920,17 @@ bool HistoryWidget::applyDraft(FieldHistoryAction fieldHistoryAction) {
} }
if (_preview) { 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; return true;
} }
@ -2503,6 +2510,9 @@ void HistoryWidget::setEditMsgId(MsgId msgId) {
_editMsgId = msgId; _editMsgId = msgId;
if (!msgId) { if (!msgId) {
_canReplaceMedia = false; _canReplaceMedia = false;
if (_preview) {
_preview->setDisabled(false);
}
} }
if (_history) { if (_history) {
refreshSendAsToggle(); refreshSendAsToggle();
@ -3775,6 +3785,7 @@ void HistoryWidget::saveEditMsg() {
cancelEdit(); cancelEdit();
return; return;
} }
const auto webPageDraft = _preview->draft();
const auto textWithTags = _field->getTextWithAppliedMarkdown(); const auto textWithTags = _field->getTextWithAppliedMarkdown();
const auto prepareFlags = Ui::ItemTextOptions( const auto prepareFlags = Ui::ItemTextOptions(
_history, _history,
@ -3785,8 +3796,12 @@ void HistoryWidget::saveEditMsg() {
TextUtilities::ConvertTextTagsToEntities(textWithTags.tags) }; TextUtilities::ConvertTextTagsToEntities(textWithTags.tags) };
TextUtilities::PrepareForSending(left, prepareFlags); TextUtilities::PrepareForSending(left, prepareFlags);
const auto media = item->media();
if (!TextUtilities::CutPart(sending, left, MaxMessageSize) 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; const auto suggestModerateActions = false;
controller()->show( controller()->show(
Box<DeleteMessagesBox>(item, suggestModerateActions)); Box<DeleteMessagesBox>(item, suggestModerateActions));
@ -3844,7 +3859,7 @@ void HistoryWidget::saveEditMsg() {
_saveEditMsgRequestId = Api::EditTextMessage( _saveEditMsgRequestId = Api::EditTextMessage(
item, item,
sending, sending,
_preview->draft(), webPageDraft,
options, options,
done, done,
fail); fail);
@ -6267,9 +6282,7 @@ void HistoryWidget::editDraftOptions() {
} else { } else {
cancelReply(); cancelReply();
} }
if (_preview->draft() != webpage) { _preview->apply(webpage);
_preview->apply(webpage);
}
}; };
const auto highlight = [=] { const auto highlight = [=] {
controller()->showPeerHistory( controller()->showPeerHistory(
@ -7693,6 +7706,12 @@ void HistoryWidget::messageDataReceived(
} else if (_editMsgId == msgId } else if (_editMsgId == msgId
|| (_replyTo.messageId == FullMsgId(peer->id, msgId))) { || (_replyTo.messageId == FullMsgId(peer->id, msgId))) {
updateReplyEditTexts(true); updateReplyEditTexts(true);
if (_editMsgId == msgId) {
_preview->setDisabled(_editMsgId
&& _replyEditMsg
&& _replyEditMsg->media()
&& !_replyEditMsg->media()->webpage());
}
} }
} }

View file

@ -1758,9 +1758,6 @@ void ComposeControls::fieldChanged() {
&& (_textUpdateEvents & TextUpdateEvent::SendTyping)); && (_textUpdateEvents & TextUpdateEvent::SendTyping));
updateSendButtonType(); updateSendButtonType();
_hasSendText = HasSendText(_field); _hasSendText = HasSendText(_field);
if (!_hasSendText.current() && _preview && !_preview->draft().manual) {
_preview->apply({ .removed = true });
}
if (updateBotCommandShown() || updateLikeShown()) { if (updateBotCommandShown() || updateLikeShown()) {
updateControlsVisibility(); updateControlsVisibility();
updateControlsGeometry(_wrap->size()); updateControlsGeometry(_wrap->size());
@ -1930,7 +1927,7 @@ void ComposeControls::applyDraft(FieldHistoryAction fieldHistoryAction) {
_header->editMessage({}); _header->editMessage({});
_header->replyToMessage({}); _header->replyToMessage({});
if (_preview) { if (_preview) {
_preview->apply({}); _preview->apply({ .removed = true });
} }
_canReplaceMedia = false; _canReplaceMedia = false;
_photoEditMedia = nullptr; _photoEditMedia = nullptr;

View file

@ -252,6 +252,7 @@ rpl::producer<QString> PreviewWrap::showLinkSelector(
_history->nextNonHistoryEntryId(), _history->nextNonHistoryEntryId(),
(MessageFlag::FakeHistoryItem (MessageFlag::FakeHistoryItem
| MessageFlag::Outgoing | MessageFlag::Outgoing
| MessageFlag::HasFromId
| (webpage.invert ? MessageFlag::InvertMedia : MessageFlag())), | (webpage.invert ? MessageFlag::InvertMedia : MessageFlag())),
UserId(), // via UserId(), // via
FullReplyTo(), FullReplyTo(),

View file

@ -163,13 +163,15 @@ void WebpageProcessor::apply(Data::WebPageDraft draft, bool reparse) {
_link = QString(); _link = QString();
_parsed = WebpageParsed(); _parsed = WebpageParsed();
updateFromData(); updateFromData();
} else if (draft.manual && draft.id && !draft.url.isEmpty()) { } else if (draft.manual && !draft.url.isEmpty()) {
_draft = draft; _draft = draft;
_parsedLinks = QStringList(); _parsedLinks = QStringList();
_links = QStringList(); _links = QStringList();
_link = _draft.url; _link = _draft.url;
const auto page = _history->owner().webpage(draft.id); const auto page = draft.id
if (page->url == draft.url) { ? _history->owner().webpage(draft.id).get()
: nullptr;
if (page && page->url == draft.url) {
_data = page; _data = page;
updateFromData(); updateFromData();
} else { } else {
@ -220,7 +222,9 @@ void WebpageProcessor::request() {
page->failed = true; page->failed = true;
} }
_cache.emplace(link, page->failed ? nullptr : page.get()); _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) _data = (page->id && !page->failed)
? page.get() ? page.get()
: nullptr; : nullptr;
@ -258,6 +262,15 @@ void WebpageProcessor::request() {
}).send(); }).send();
} }
void WebpageProcessor::setDisabled(bool disabled) {
_parser.setDisabled(disabled);
if (disabled) {
apply({ .removed = true });
} else {
checkNow(false);
}
}
void WebpageProcessor::checkNow(bool force) { void WebpageProcessor::checkNow(bool force) {
_parser.parseNow(); _parser.parseNow();
if (force) { if (force) {

View file

@ -53,6 +53,7 @@ public:
not_null<History*> history, not_null<History*> history,
not_null<Ui::InputField*> field); not_null<Ui::InputField*> field);
void setDisabled(bool disabled);
void checkNow(bool force); void checkNow(bool force);
// If editing a message without a preview we don't want to show // If editing a message without a preview we don't want to show