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(
&owner->session(),
FilterId(),
owner->maxPinnedChatsLimitValue(this)) {
owner->maxPinnedChatsLimitValue(this))
, _loadMore([=] { sendLoadMoreRequests(); }) {
}
SavedMessages::~SavedMessages() = default;
@ -60,6 +61,16 @@ not_null<SavedSublist*> SavedMessages::sublist(not_null<PeerData*> peer) {
}
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()) {
return;
} else if (!_pinnedLoaded) {
@ -102,7 +113,7 @@ void SavedMessages::loadPinned() {
}).send();
}
void SavedMessages::loadMore(not_null<SavedSublist*> sublist) {
void SavedMessages::sendLoadMore(not_null<SavedSublist*> 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) {

View file

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