diff --git a/Telegram/SourceFiles/settings/settings_folders.cpp b/Telegram/SourceFiles/settings/settings_folders.cpp index aa62e5746..af6869a7b 100644 --- a/Telegram/SourceFiles/settings/settings_folders.cpp +++ b/Telegram/SourceFiles/settings/settings_folders.cpp @@ -526,11 +526,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { return [=] { auto ids = prepareGoodIdsForNewFilters(); - using Requests = std::vector; - auto addRequests = Requests(), removeRequests = Requests(); + auto order = std::vector(); + auto updates = std::vector(); + auto addRequests = std::vector(); + auto removeRequests = std::vector(); + auto &realFilters = session->data().chatsFilters(); const auto &list = realFilters.list(); - auto order = std::vector(); order.reserve(rows->size()); for (const auto &row : *rows) { const auto id = row.filter.id(); @@ -558,7 +560,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { addRequests.push_back(request); order.push_back(newId); } - realFilters.apply(MTP_updateDialogFilter( + updates.push_back(MTP_updateDialogFilter( MTP_flags(removed ? MTPDupdateDialogFilter::Flag(0) : MTPDupdateDialogFilter::Flag::f_filter), @@ -578,16 +580,31 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { } order.insert(order.begin() + position, FilterId(0)); } - auto previousId = mtpRequestId(0); - auto &&requests = ranges::views::concat(removeRequests, addRequests); - for (auto &request : requests) { - previousId = session->api().request( - std::move(request) - ).afterRequest(previousId).send(); - } - if (!order.empty() && !addRequests.empty()) { - realFilters.saveOrder(order, previousId); - } + crl::on_main(session, [ + session, + order = std::move(order), + updates = std::move(updates), + addRequests = std::move(addRequests), + removeRequests = std::move(removeRequests) + ] { + const auto api = &session->api(); + const auto filters = &session->data().chatsFilters(); + for (const auto &update : updates) { + filters->apply(update); + } + auto previousId = mtpRequestId(0); + auto &&requests = ranges::views::concat( + removeRequests, + addRequests); + for (auto &request : requests) { + previousId = api->request( + std::move(request) + ).afterRequest(previousId).send(); + } + if (!order.empty() && !addRequests.empty()) { + filters->saveOrder(order, previousId); + } + }); }; }