diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 2b91cbe5b8..847d4a530f 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_chat.h" #include "data/data_user.h" #include "data/data_cloud_themes.h" +#include "data/data_chat_filters.h" #include "data/data_histories.h" #include "dialogs/dialogs_key.h" #include "core/core_cloud_password.h" @@ -248,6 +249,13 @@ ApiWrap::ApiWrap(not_null session) photoUploadReady(data.fullId, data.file); }, _session->lifetime()); + _session->data().chatsFilters().changed( + ) | rpl::filter([=] { + return _session->data().chatsFilters().archiveNeeded(); + }) | rpl::start_with_next([=] { + requestMoreDialogsIfNeeded(); + }, _session->lifetime()); + setupSupportMode(); }); } @@ -856,13 +864,11 @@ void ApiWrap::requestMoreDialogs(Data::Folder *folder) { count); }); - if (!folder) { - if (!_dialogsLoadState || !_dialogsLoadState->listReceived) { - refreshDialogsLoadBlocked(); - } - requestDialogs(folder); - requestContacts(); + if (!folder + && (!_dialogsLoadState || !_dialogsLoadState->listReceived)) { + refreshDialogsLoadBlocked(); } + requestMoreDialogsIfNeeded(); _session->data().chatsListChanged(folder); }).fail([=](const RPCError &error) { dialogsLoadState(folder)->requestId = 0; @@ -888,6 +894,21 @@ void ApiWrap::refreshDialogsLoadBlocked() { && (_dialogsLoadState->offsetDate <= _dialogsLoadTill); } +void ApiWrap::requestMoreDialogsIfNeeded() { + if (_dialogsLoadState && !_dialogsLoadState->listReceived) { + if (_dialogsLoadState->requestId) { + return; + } + requestDialogs(nullptr); + } else if (const auto folder = _session->data().folderLoaded( + Data::Folder::kId)) { + if (_session->data().chatsFilters().archiveNeeded()) { + requestMoreDialogs(folder); + } + } + requestContacts(); +} + void ApiWrap::updateDialogsOffset( Data::Folder *folder, const QVector &dialogs, diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index c48ef2b01c..30d364dbd3 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -170,6 +170,7 @@ public: void requestDialogs(Data::Folder *folder = nullptr); void requestPinnedDialogs(Data::Folder *folder = nullptr); void requestMoreBlockedByDateDialogs(); + void requestMoreDialogsIfNeeded(); rpl::producer dialogsLoadMayBlockByDate() const; rpl::producer dialogsLoadBlockedByDate() const; diff --git a/Telegram/SourceFiles/data/data_chat_filters.cpp b/Telegram/SourceFiles/data/data_chat_filters.cpp index 27efdf7a5a..b5a012c09e 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.cpp +++ b/Telegram/SourceFiles/data/data_chat_filters.cpp @@ -439,6 +439,15 @@ const ChatFilter &ChatFilters::applyUpdatedPinned( return *i; } +bool ChatFilters::archiveNeeded() const { + for (const auto &filter : _list) { + if (!(filter.flags() & ChatFilter::Flag::NoArchived)) { + return true; + } + } + return false; +} + const std::vector &ChatFilters::list() const { return _list; } diff --git a/Telegram/SourceFiles/data/data_chat_filters.h b/Telegram/SourceFiles/data/data_chat_filters.h index 051afa9da8..9d0e1e0286 100644 --- a/Telegram/SourceFiles/data/data_chat_filters.h +++ b/Telegram/SourceFiles/data/data_chat_filters.h @@ -103,6 +103,8 @@ public: FilterId id, const std::vector &dialogs); + [[nodiscard]] bool archiveNeeded() const; + private: void load(bool force); bool applyOrder(const QVector &order);