From e01910ac6897a1853deb133a0448055c207c5b81 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Fri, 23 Sep 2022 13:34:35 +0400
Subject: [PATCH] Fix a crash in folders editing, happens in Qt 6.4.

Fixes #25074.
---
 .../SourceFiles/settings/settings_folders.cpp | 45 +++++++++++++------
 1 file changed, 31 insertions(+), 14 deletions(-)

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<MTPmessages_UpdateDialogFilter>;
-		auto addRequests = Requests(), removeRequests = Requests();
+		auto order = std::vector<FilterId>();
+		auto updates = std::vector<MTPUpdate>();
+		auto addRequests = std::vector<MTPmessages_UpdateDialogFilter>();
+		auto removeRequests = std::vector<MTPmessages_UpdateDialogFilter>();
+
 		auto &realFilters = session->data().chatsFilters();
 		const auto &list = realFilters.list();
-		auto order = std::vector<FilterId>();
 		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);
+			}
+		});
 	};
 }