diff --git a/Telegram/SourceFiles/data/data_saved_messages.cpp b/Telegram/SourceFiles/data/data_saved_messages.cpp index 9fd28f735..695622bbe 100644 --- a/Telegram/SourceFiles/data/data_saved_messages.cpp +++ b/Telegram/SourceFiles/data/data_saved_messages.cpp @@ -28,7 +28,8 @@ SavedMessages::SavedMessages(not_null owner) , _chatsList( &owner->session(), FilterId(), - owner->maxPinnedChatsLimitValue(this)) { + owner->maxPinnedChatsLimitValue(this)) +, _loadMore([=] { sendLoadMoreRequests(); }) { } SavedMessages::~SavedMessages() = default; @@ -60,6 +61,16 @@ not_null SavedMessages::sublist(not_null peer) { } void SavedMessages::loadMore() { + _loadMoreScheduled = true; + _loadMore.call(); +} + +void SavedMessages::loadMore(not_null sublist) { + _loadMoreSublistsScheduled.emplace(sublist); + _loadMore.call(); +} + +void SavedMessages::sendLoadMore() { if (_loadMoreRequestId || _chatsList.loaded()) { return; } else if (!_pinnedLoaded) { @@ -102,7 +113,7 @@ void SavedMessages::loadPinned() { }).send(); } -void SavedMessages::loadMore(not_null sublist) { +void SavedMessages::sendLoadMore(not_null sublist) { if (_loadMoreRequests.contains(sublist) || sublist->isFullLoaded()) { return; } @@ -233,6 +244,15 @@ void SavedMessages::apply( } } +void SavedMessages::sendLoadMoreRequests() { + if (_loadMoreScheduled) { + sendLoadMore(); + } + for (const auto sublist : base::take(_loadMoreSublistsScheduled)) { + sendLoadMore(sublist); + } +} + void SavedMessages::apply(const MTPDupdatePinnedSavedDialogs &update) { const auto list = update.vorder(); if (!list) { diff --git a/Telegram/SourceFiles/data/data_saved_messages.h b/Telegram/SourceFiles/data/data_saved_messages.h index 3fbc5a772..3e09f4db0 100644 --- a/Telegram/SourceFiles/data/data_saved_messages.h +++ b/Telegram/SourceFiles/data/data_saved_messages.h @@ -41,6 +41,10 @@ private: void loadPinned(); void apply(const MTPmessages_SavedDialogs &result, bool pinned); + void sendLoadMore(); + void sendLoadMore(not_null sublist); + void sendLoadMoreRequests(); + const not_null _owner; Dialogs::MainList _chatsList; @@ -56,6 +60,10 @@ private: MsgId _offsetId = 0; PeerData *_offsetPeer = nullptr; + SingleQueuedInvokation _loadMore; + base::flat_set> _loadMoreSublistsScheduled; + bool _loadMoreScheduled = false; + bool _pinnedLoaded = false; bool _unsupported = false;