Add local mail pinning support

This commit is contained in:
Burak Kaan Köse
2026-04-21 23:17:08 +02:00
parent c0023614ad
commit 09820dda71
19 changed files with 531 additions and 53 deletions
+28 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
@@ -760,6 +761,17 @@ public partial class MailListPageViewModel : MailBaseViewModel,
await _winoRequestDelegator.ExecuteAsync(accountId, requests).ConfigureAwait(false);
}
public Task ChangePinnedStatusAsync(IEnumerable<MailItemViewModel> targetItems, bool isPinned)
{
var uniqueIds = targetItems?
.Where(a => a?.MailCopy != null)
.Select(a => a.MailCopy.UniqueId)
.Distinct()
.ToList() ?? [];
return _mailService.ChangePinnedStatusAsync(uniqueIds, isPinned);
}
private bool ShouldPreventItemAdd(MailCopy mailItem)
{
bool condition = mailItem.IsRead
@@ -1553,13 +1565,28 @@ public partial class MailListPageViewModel : MailBaseViewModel,
}
}
var initialExistingIds = new ConcurrentDictionary<Guid, bool>(MailCollection.MailCopyIdHashSet);
var localPinnedItems = new List<MailCopy>();
if (!isDoingOnlineSearch)
{
var pinnedOptions = CreateInitializationOptions(SearchQuery, MailCollection.MailCopyIdHashSet);
localPinnedItems = await _mailService.FetchPinnedMailsAsync(pinnedOptions, cancellationToken).ConfigureAwait(false);
foreach (var pinnedItem in localPinnedItems)
{
initialExistingIds.TryAdd(pinnedItem.UniqueId, true);
}
}
var initializationOptions = CreateInitializationOptions(
isDoingOnlineSearch ? string.Empty : SearchQuery,
MailCollection.MailCopyIdHashSet,
initialExistingIds,
onlineSearchItems,
isDoingOnlineSearch);
items = await _mailService.FetchMailsAsync(initializationOptions, cancellationToken).ConfigureAwait(false);
items = localPinnedItems.Count > 0 ? [.. localPinnedItems, .. items] : items;
if (!listManipulationCancellationTokenSource.IsCancellationRequested)
{