From ae9e35e091b936448f82963f3e2320bb9ce9e1a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sat, 1 Nov 2025 12:35:47 +0100 Subject: [PATCH] Fix the sorting when adding mails. --- .../Interfaces/IMailListItemSorting.cs | 9 +++++++++ .../Models/Comparers/ListItemComparer.cs | 6 ++++-- .../Collections/WinoMailCollection.cs | 16 +++++++++++++++- Wino.Mail.ViewModels/Data/IMailListItem.cs | 2 +- Wino.Mail.ViewModels/Data/MailItemViewModel.cs | 4 ++++ .../Data/ThreadMailItemViewModel.cs | 4 ++++ 6 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 Wino.Core.Domain/Interfaces/IMailListItemSorting.cs diff --git a/Wino.Core.Domain/Interfaces/IMailListItemSorting.cs b/Wino.Core.Domain/Interfaces/IMailListItemSorting.cs new file mode 100644 index 00000000..5d4c24f5 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/IMailListItemSorting.cs @@ -0,0 +1,9 @@ +using System; + +namespace Wino.Core.Domain.Interfaces; + +public interface IMailListItemSorting +{ + DateTime SortingDate { get; } + string SortingName { get; } +} diff --git a/Wino.Core.Domain/Models/Comparers/ListItemComparer.cs b/Wino.Core.Domain/Models/Comparers/ListItemComparer.cs index 7431f85d..59b8a3f6 100644 --- a/Wino.Core.Domain/Models/Comparers/ListItemComparer.cs +++ b/Wino.Core.Domain/Models/Comparers/ListItemComparer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Interfaces; public class ListItemComparer : IComparer { @@ -8,13 +9,14 @@ public class ListItemComparer : IComparer public int Compare(object x, object y) { - if (x is MailCopy xMail && y is MailCopy yMail) + if (x is IMailListItemSorting xSorting && y is IMailListItemSorting ySorting) + return SortByName ? string.Compare(xSorting.SortingName, ySorting.SortingName, StringComparison.OrdinalIgnoreCase) : DateTime.Compare(xSorting.SortingDate, ySorting.SortingDate); + else if (x is MailCopy xMail && y is MailCopy yMail) return SortByName ? string.Compare(xMail.FromName, yMail.FromName, StringComparison.OrdinalIgnoreCase) : DateTime.Compare(yMail.CreationDate, xMail.CreationDate); else if (x is DateTime dateX && y is DateTime dateY) return DateTime.Compare(dateY, dateX); else if (x is string stringX && y is string stringY) return stringY.CompareTo(stringX); - return 0; } } diff --git a/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs index e8d87389..3bbb8b9b 100644 --- a/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs +++ b/Wino.Mail.ViewModels/Collections/WinoMailCollection.cs @@ -42,10 +42,21 @@ public class WinoMailCollection : ObservableRecipient, IRecipient MailItems { get; } + private SortingOptionType _sortingType; + /// /// Property that defines how the item sorting should be done in the collection. /// - public SortingOptionType SortingType { get; set; } + public SortingOptionType SortingType + { + get => _sortingType; + set + { + _sortingType = value; + // Update the comparer's sort mode when sorting type changes + listComparer.SortByName = value == SortingOptionType.Sender; + } + } /// /// Gets or sets the grouping type for emails. @@ -79,6 +90,9 @@ public class WinoMailCollection : ObservableRecipient, IRecipient(_mailItemSource); + // Initialize sorting type to default (date-based) + SortingType = SortingOptionType.ReceiveDate; + Messenger.Register(this); } diff --git a/Wino.Mail.ViewModels/Data/IMailListItem.cs b/Wino.Mail.ViewModels/Data/IMailListItem.cs index 33ec9dbe..0d6ffaf6 100644 --- a/Wino.Mail.ViewModels/Data/IMailListItem.cs +++ b/Wino.Mail.ViewModels/Data/IMailListItem.cs @@ -9,7 +9,7 @@ namespace Wino.Mail.ViewModels.Data; /// Common interface for mail items that can be displayed in a mail list. /// Implemented by both MailItemViewModel and ThreadMailItemViewModel. /// -public interface IMailListItem : IMailHashContainer, INotifyPropertyChanged +public interface IMailListItem : IMailHashContainer, IMailListItemSorting, INotifyPropertyChanged { /// /// Gets the latest creation date for sorting purposes. diff --git a/Wino.Mail.ViewModels/Data/MailItemViewModel.cs b/Wino.Mail.ViewModels/Data/MailItemViewModel.cs index 64f8af97..422cebc4 100644 --- a/Wino.Mail.ViewModels/Data/MailItemViewModel.cs +++ b/Wino.Mail.ViewModels/Data/MailItemViewModel.cs @@ -171,6 +171,10 @@ public partial class MailItemViewModel(MailCopy mailCopy) : ObservableRecipient, set => SetProperty(MailCopy.SenderContact.Base64ContactPicture, value, MailCopy, (u, n) => u.SenderContact.Base64ContactPicture = n); } + public DateTime SortingDate => CreationDate; + + public string SortingName => FromName; + public IEnumerable GetContainingIds() => [MailCopy.UniqueId]; public IEnumerable GetSelectedMailItems() diff --git a/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs index 6239c987..4236e7f0 100644 --- a/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs +++ b/Wino.Mail.ViewModels/Data/ThreadMailItemViewModel.cs @@ -167,6 +167,10 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IMailListIte private MailItemViewModel latestMailViewModel => ThreadEmails.OrderByDescending(e => e.MailCopy?.CreationDate).FirstOrDefault()!; + public DateTime SortingDate => CreationDate; + + public string SortingName => FromName; + public ThreadMailItemViewModel(string threadId) { _threadId = threadId;