Avoid unnecessary saved dialogs load requests.

This commit is contained in:
John Preston 2024-01-01 23:42:18 +04:00
parent a4f4e4564a
commit a30d0eccda
2 changed files with 30 additions and 2 deletions

View file

@ -28,7 +28,8 @@ SavedMessages::SavedMessages(not_null<Session*> owner)
, _chatsList( , _chatsList(
&owner->session(), &owner->session(),
FilterId(), FilterId(),
owner->maxPinnedChatsLimitValue(this)) { owner->maxPinnedChatsLimitValue(this))
, _loadMore([=] { sendLoadMoreRequests(); }) {
} }
SavedMessages::~SavedMessages() = default; SavedMessages::~SavedMessages() = default;
@ -60,6 +61,16 @@ not_null<SavedSublist*> SavedMessages::sublist(not_null<PeerData*> peer) {
} }
void SavedMessages::loadMore() { void SavedMessages::loadMore() {
_loadMoreScheduled = true;
_loadMore.call();
}
void SavedMessages::loadMore(not_null<SavedSublist*> sublist) {
_loadMoreSublistsScheduled.emplace(sublist);
_loadMore.call();
}
void SavedMessages::sendLoadMore() {
if (_loadMoreRequestId || _chatsList.loaded()) { if (_loadMoreRequestId || _chatsList.loaded()) {
return; return;
} else if (!_pinnedLoaded) { } else if (!_pinnedLoaded) {
@ -102,7 +113,7 @@ void SavedMessages::loadPinned() {
}).send(); }).send();
} }
void SavedMessages::loadMore(not_null<SavedSublist*> sublist) { void SavedMessages::sendLoadMore(not_null<SavedSublist*> sublist) {
if (_loadMoreRequests.contains(sublist) || sublist->isFullLoaded()) { if (_loadMoreRequests.contains(sublist) || sublist->isFullLoaded()) {
return; 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) { void SavedMessages::apply(const MTPDupdatePinnedSavedDialogs &update) {
const auto list = update.vorder(); const auto list = update.vorder();
if (!list) { if (!list) {

View file

@ -41,6 +41,10 @@ private:
void loadPinned(); void loadPinned();
void apply(const MTPmessages_SavedDialogs &result, bool pinned); void apply(const MTPmessages_SavedDialogs &result, bool pinned);
void sendLoadMore();
void sendLoadMore(not_null<SavedSublist*> sublist);
void sendLoadMoreRequests();
const not_null<Session*> _owner; const not_null<Session*> _owner;
Dialogs::MainList _chatsList; Dialogs::MainList _chatsList;
@ -56,6 +60,10 @@ private:
MsgId _offsetId = 0; MsgId _offsetId = 0;
PeerData *_offsetPeer = nullptr; PeerData *_offsetPeer = nullptr;
SingleQueuedInvokation _loadMore;
base::flat_set<not_null<SavedSublist*>> _loadMoreSublistsScheduled;
bool _loadMoreScheduled = false;
bool _pinnedLoaded = false; bool _pinnedLoaded = false;
bool _unsupported = false; bool _unsupported = false;