Fixing UI thread issues with bulk operations and request queue refactoring.

This commit is contained in:
Burak Kaan Köse
2026-04-20 02:18:23 +02:00
parent 3bd0b69429
commit 54148716bb
38 changed files with 1644 additions and 206 deletions
@@ -12,6 +12,7 @@ using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Accounts;
using Wino.Core.Domain.Models.Synchronization;
using Wino.Core.Requests.Mail;
using Wino.Core.Requests.Bundles;
using Wino.Messaging.UI;
@@ -262,4 +263,75 @@ public abstract partial class BaseSynchronizer<TBaseRequest> : ObservableObject,
return ret;
}
protected void ApplyOptimisticUiChanges(IEnumerable<IRequestBundle<TBaseRequest>> bundles, Func<IRequestBase, bool> shouldApply = null)
{
var bundleList = bundles?
.Where(b => b?.Request != null && (shouldApply?.Invoke(b.Request) ?? true))
.ToList() ?? [];
if (bundleList.Count == 0)
return;
var requestList = new List<IRequestBase>(bundleList.Count);
foreach (var bundle in bundleList)
{
if (bundle.UIChangeRequest != null && !ReferenceEquals(bundle.UIChangeRequest, bundle.Request))
{
bundle.UIChangeRequest.ApplyUIChanges();
continue;
}
requestList.Add(bundle.Request);
}
if (requestList.Count == 0)
return;
var appliedBatchRequestKeys = new HashSet<object>();
foreach (var group in requestList.GroupBy(r => r.GroupingKey()))
{
var groupRequests = group.ToList();
if (groupRequests.Count <= 1)
continue;
if (!TryApplyBatchUiChanges(groupRequests))
continue;
appliedBatchRequestKeys.Add(group.Key);
}
foreach (var request in requestList)
{
if (!appliedBatchRequestKeys.Contains(request.GroupingKey()))
{
request.ApplyUIChanges();
}
}
}
private static bool TryApplyBatchUiChanges(IReadOnlyList<IRequestBase> requests)
{
if (requests == null || requests.Count <= 1)
return false;
return requests[0] switch
{
MarkReadRequest => ApplyBatch(new BatchMarkReadRequest(requests.Cast<MarkReadRequest>())),
ChangeFlagRequest => ApplyBatch(new BatchChangeFlagRequest(requests.Cast<ChangeFlagRequest>())),
DeleteRequest => ApplyBatch(new BatchDeleteRequest(requests.Cast<DeleteRequest>())),
MoveRequest => ApplyBatch(new BatchMoveRequest(requests.Cast<MoveRequest>())),
ArchiveRequest => ApplyBatch(new BatchArchiveRequest(requests.Cast<ArchiveRequest>())),
ChangeJunkStateRequest => ApplyBatch(new BatchChangeJunkStateRequest(requests.Cast<ChangeJunkStateRequest>())),
_ => false
};
static bool ApplyBatch(IUIChangeRequest request)
{
request.ApplyUIChanges();
return true;
}
}
}