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 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)

View File

@ -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(

View File

@ -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<DeleteMessagesBox>(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());
}
}
}

View File

@ -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;

View File

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

View File

@ -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) {

View File

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