Files
Wino-Mail/Wino.Mail.ViewModels/MessageListPageViewModel.cs
T
2026-03-24 01:18:06 +01:00

174 lines
5.9 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Input;
using Wino.Core.Domain;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
namespace Wino.Mail.ViewModels;
public partial class MessageListPageViewModel : MailBaseViewModel
{
public IPreferencesService PreferencesService { get; }
private readonly IThumbnailService _thumbnailService;
private readonly IStatePersistanceService _statePersistenceService;
private readonly IDialogServiceBase _dialogService;
private readonly List<MailOperation> availableHoverActions =
[
MailOperation.Archive,
MailOperation.SoftDelete,
MailOperation.SetFlag,
MailOperation.MarkAsRead,
MailOperation.MoveToJunk
];
private readonly List<MailListDisplayMode> availableMailSpacingOptions =
[
MailListDisplayMode.Compact,
MailListDisplayMode.Medium,
MailListDisplayMode.Spacious
];
public List<string> AvailableHoverActionsTranslations { get; set; } =
[
Translator.HoverActionOption_Archive,
Translator.HoverActionOption_Delete,
Translator.HoverActionOption_ToggleFlag,
Translator.HoverActionOption_ToggleRead,
Translator.HoverActionOption_MoveJunk
];
public IMailItemDisplayInformation DemoPreviewMailItemInformation { get; } = new DemoMailItemDisplayInformation();
public MailListDisplayMode SelectedMailSpacingMode => availableMailSpacingOptions[selectedMailSpacingIndex];
private int selectedMarkAsOptionIndex;
public int SelectedMarkAsOptionIndex
{
get => selectedMarkAsOptionIndex;
set
{
if (SetProperty(ref selectedMarkAsOptionIndex, value) && value >= 0)
{
PreferencesService.MarkAsPreference = (MailMarkAsOption)Enum.GetValues<MailMarkAsOption>().GetValue(value);
}
}
}
private int selectedMailSpacingIndex;
public int SelectedMailSpacingIndex
{
get => selectedMailSpacingIndex;
set
{
if (SetProperty(ref selectedMailSpacingIndex, value) && value >= 0 && value < availableMailSpacingOptions.Count)
{
PreferencesService.MailItemDisplayMode = availableMailSpacingOptions[value];
OnPropertyChanged(nameof(SelectedMailSpacingMode));
}
}
}
#region Properties
private int leftHoverActionIndex;
public int LeftHoverActionIndex
{
get => leftHoverActionIndex;
set
{
if (SetProperty(ref leftHoverActionIndex, value))
{
PreferencesService.LeftHoverAction = availableHoverActions[value];
}
}
}
private int centerHoverActionIndex;
public int CenterHoverActionIndex
{
get => centerHoverActionIndex;
set
{
if (SetProperty(ref centerHoverActionIndex, value))
{
PreferencesService.CenterHoverAction = availableHoverActions[value];
}
}
}
private int rightHoverActionIndex;
public int RightHoverActionIndex
{
get => rightHoverActionIndex;
set
{
if (SetProperty(ref rightHoverActionIndex, value))
{
PreferencesService.RightHoverAction = availableHoverActions[value];
}
}
}
#endregion
public MessageListPageViewModel(IPreferencesService preferencesService,
IThumbnailService thumbnailService,
IStatePersistanceService statePersistenceService,
IDialogServiceBase dialogService)
{
PreferencesService = preferencesService;
_thumbnailService = thumbnailService;
_statePersistenceService = statePersistenceService;
_dialogService = dialogService;
leftHoverActionIndex = availableHoverActions.IndexOf(PreferencesService.LeftHoverAction);
centerHoverActionIndex = availableHoverActions.IndexOf(PreferencesService.CenterHoverAction);
rightHoverActionIndex = availableHoverActions.IndexOf(PreferencesService.RightHoverAction);
selectedMailSpacingIndex = availableMailSpacingOptions.IndexOf(PreferencesService.MailItemDisplayMode);
SelectedMarkAsOptionIndex = Array.IndexOf(Enum.GetValues<MailMarkAsOption>(), PreferencesService.MarkAsPreference);
}
[RelayCommand]
private async Task ClearAvatarsCacheAsync()
{
await _thumbnailService.ClearCache();
}
[RelayCommand]
private void ResetMailListPaneLength()
{
_statePersistenceService.MailListPaneLength = 420;
_dialogService.InfoBarMessage(Translator.GeneralTitle_Info, Translator.Info_MailListSizeResetSuccessMessage, InfoBarMessageType.Success);
}
private sealed class DemoMailItemDisplayInformation : IMailItemDisplayInformation
{
public event PropertyChangedEventHandler PropertyChanged
{
add { }
remove { }
}
public string Subject => "Quarterly planning notes";
public string FromName => "Ava Brooks";
public string FromAddress => "ava@contoso.com";
public string PreviewText => "Agenda draft, attendee updates, and a few follow-up items for this week.";
public bool IsRead => false;
public bool IsDraft => false;
public bool HasAttachments => true;
public bool IsCalendarEvent => false;
public bool IsFlagged => true;
public DateTime CreationDate => DateTime.Now.AddMinutes(-12);
public Guid? ContactPictureFileId => null;
public bool ThumbnailUpdatedEvent => false;
public bool IsThreadExpanded => false;
public AccountContact SenderContact => new()
{
Address = "ava@contoso.com",
Name = "Ava Brooks"
};
}
}