diff --git a/Telegram/SourceFiles/api/api_messages_search.cpp b/Telegram/SourceFiles/api/api_messages_search.cpp index 4cbfe665e2..54d75e3d66 100644 --- a/Telegram/SourceFiles/api/api_messages_search.cpp +++ b/Telegram/SourceFiles/api/api_messages_search.cpp @@ -69,6 +69,14 @@ void MessagesSearch::searchMore() { void MessagesSearch::searchRequest() { const auto nextToken = _query + QString::number(_from ? _from->id.value : 0); + if (!_offsetId) { + const auto it = _cacheOfStartByToken.find(nextToken); + if (it != end(_cacheOfStartByToken)) { + _requestId = 0; + searchReceived(it->second, _requestId, nextToken); + return; + } + } auto callback = [=](Fn finish) { const auto flags = _from ? MTP_flags(MTPmessages_Search::Flag::f_from_id) @@ -90,7 +98,7 @@ void MessagesSearch::searchRequest() { MTP_int(0), // max_id MTP_int(0), // min_id MTP_long(0) // hash - )).done([=](const MTPmessages_Messages &result, mtpRequestId id) { + )).done([=](const TLMessages &result, mtpRequestId id) { _searchInHistoryRequest = 0; searchReceived(result, id, nextToken); finish(); @@ -114,7 +122,7 @@ void MessagesSearch::searchRequest() { } void MessagesSearch::searchReceived( - const MTPmessages_Messages &result, + const TLMessages &result, mtpRequestId requestId, const QString &nextToken) { if (requestId != _requestId) { @@ -159,6 +167,9 @@ void MessagesSearch::searchReceived( }, [](const MTPDmessages_messagesNotModified &data) { return FoundMessages{}; }); + if (!_offsetId) { + _cacheOfStartByToken.emplace(nextToken, result); + } _requestId = 0; _offsetId = found.messages.empty() ? MsgId() diff --git a/Telegram/SourceFiles/api/api_messages_search.h b/Telegram/SourceFiles/api/api_messages_search.h index 9e1a9d4ca8..76e84202db 100644 --- a/Telegram/SourceFiles/api/api_messages_search.h +++ b/Telegram/SourceFiles/api/api_messages_search.h @@ -37,9 +37,10 @@ public: [[nodiscard]] rpl::producer messagesFounds() const; private: + using TLMessages = MTPmessages_Messages; void searchRequest(); void searchReceived( - const MTPmessages_Messages &result, + const TLMessages &result, mtpRequestId requestId, const QString &nextToken); @@ -47,6 +48,8 @@ private: const not_null _history; MTP::Sender _api; + base::flat_map _cacheOfStartByToken; + QString _query; PeerData *_from = nullptr; MsgId _offsetId; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp index 5c3402b268..1943b0bf0c 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_search.cpp @@ -260,7 +260,7 @@ public: private: void clearItems(); - void requestSearch(); + void requestSearch(bool cache = true); void requestSearchDelayed(); base::unique_qptr _cancel; @@ -270,6 +270,8 @@ private: base::Timer _searchTimer; + std::vector _typedRequests; + rpl::event_stream _searchRequests; rpl::event_stream<> _queryChanges; }; @@ -337,11 +339,23 @@ void TopBar::clearItems() { }); } -void TopBar::requestSearch() { - _searchRequests.fire({ _select->getQuery(), _from.current() }); +void TopBar::requestSearch(bool cache) { + const auto search = SearchRequest{ _select->getQuery(), _from.current() }; + if (cache) { + _typedRequests.push_back(search); + } + _searchRequests.fire_copy(search); } void TopBar::requestSearchDelayed() { + // Check cached queries. + for (const auto &t : _typedRequests) { + if (t.query == _select->getQuery() && t.from == _from.current()) { + requestSearch(false); + return; + } + } + _searchTimer.callOnce(AutoSearchTimeout); }