Files
Wino-Mail/Wino.Services/ContextMenuItemService.cs

182 lines
7.8 KiB
C#
Raw Normal View History

2024-04-18 01:44:37 +02:00
using System.Collections.Generic;
using System.Linq;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Folders;
using Wino.Core.Domain.Models.MailItem;
using Wino.Core.Domain.Models.Menus;
namespace Wino.Services
2024-04-18 01:44:37 +02:00
{
public class ContextMenuItemService : IContextMenuItemService
2024-04-18 01:44:37 +02:00
{
public virtual IEnumerable<FolderOperationMenuItem> GetFolderContextMenuActions(IBaseFolderMenuItem folderInformation)
{
var list = new List<FolderOperationMenuItem>();
2024-04-18 01:44:37 +02:00
if (folderInformation.IsSticky)
list.Add(FolderOperationMenuItem.Create(FolderOperation.Unpin));
else
list.Add(FolderOperationMenuItem.Create(FolderOperation.Pin));
2024-04-18 01:44:37 +02:00
list.Add(FolderOperationMenuItem.Create(FolderOperation.Seperator));
2024-04-18 01:44:37 +02:00
// Following 4 items are disabled for system folders.
2024-04-18 01:44:37 +02:00
list.Add(FolderOperationMenuItem.Create(FolderOperation.Rename, !folderInformation.IsSystemFolder));
list.Add(FolderOperationMenuItem.Create(FolderOperation.Delete, !folderInformation.IsSystemFolder));
list.Add(FolderOperationMenuItem.Create(FolderOperation.CreateSubFolder, !folderInformation.IsSystemFolder));
2024-04-18 01:44:37 +02:00
list.Add(FolderOperationMenuItem.Create(FolderOperation.Seperator));
2024-04-18 01:44:37 +02:00
list.Add(FolderOperationMenuItem.Create(FolderOperation.Empty));
2024-04-18 01:44:37 +02:00
list.Add(FolderOperationMenuItem.Create(FolderOperation.MarkAllAsRead));
2024-04-18 01:44:37 +02:00
return list;
}
public virtual IEnumerable<MailOperationMenuItem> GetMailItemContextMenuActions(IEnumerable<IMailItem> selectedMailItems)
{
if (selectedMailItems == null)
return default;
2024-04-18 01:44:37 +02:00
var operationList = new List<MailOperationMenuItem>();
2024-04-18 01:44:37 +02:00
// Disable archive button for Archive folder itself.
2024-04-18 01:44:37 +02:00
bool isArchiveFolder = selectedMailItems.All(a => a.AssignedFolder.SpecialFolderType == SpecialFolderType.Archive);
bool isDraftOrSent = selectedMailItems.All(a => a.AssignedFolder.SpecialFolderType == SpecialFolderType.Draft || a.AssignedFolder.SpecialFolderType == SpecialFolderType.Sent);
bool isJunkFolder = selectedMailItems.All(a => a.AssignedFolder.SpecialFolderType == SpecialFolderType.Junk);
2024-04-18 01:44:37 +02:00
bool isSingleItem = selectedMailItems.Count() == 1;
2024-04-18 01:44:37 +02:00
IMailItem singleItem = selectedMailItems.FirstOrDefault();
2024-04-18 01:44:37 +02:00
// Archive button.
2024-04-18 01:44:37 +02:00
if (isArchiveFolder)
operationList.Add(MailOperationMenuItem.Create(MailOperation.UnArchive));
2024-04-18 01:44:37 +02:00
else
operationList.Add(MailOperationMenuItem.Create(MailOperation.Archive));
2025-02-16 11:35:43 +01:00
// Delete button.
operationList.Add(MailOperationMenuItem.Create(MailOperation.SoftDelete));
2024-04-18 01:44:37 +02:00
// Move button.
operationList.Add(MailOperationMenuItem.Create(MailOperation.Move, !isDraftOrSent));
2024-04-18 01:44:37 +02:00
// Independent flag, read etc.
if (isSingleItem)
{
if (singleItem.IsFlagged)
operationList.Add(MailOperationMenuItem.Create(MailOperation.ClearFlag));
else
operationList.Add(MailOperationMenuItem.Create(MailOperation.SetFlag));
if (singleItem.IsRead)
operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsUnread));
else
operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsRead));
}
else
2025-02-16 11:35:43 +01:00
{
bool isAllRead = selectedMailItems.All(a => a.IsRead);
bool isAllUnread = selectedMailItems.All(a => !a.IsRead);
bool isAllFlagged = selectedMailItems.All(a => a.IsFlagged);
bool isAllNotFlagged = selectedMailItems.All(a => !a.IsFlagged);
List<MailOperationMenuItem> readOperations = (isAllRead, isAllUnread) switch
{
(true, false) => [MailOperationMenuItem.Create(MailOperation.MarkAsUnread)],
(false, true) => [MailOperationMenuItem.Create(MailOperation.MarkAsRead)],
_ => [MailOperationMenuItem.Create(MailOperation.MarkAsRead), MailOperationMenuItem.Create(MailOperation.MarkAsUnread)]
};
operationList.AddRange(readOperations);
List<MailOperationMenuItem> flagsOperations = (isAllFlagged, isAllNotFlagged) switch
{
(true, false) => [MailOperationMenuItem.Create(MailOperation.ClearFlag)],
(false, true) => [MailOperationMenuItem.Create(MailOperation.SetFlag)],
_ => [MailOperationMenuItem.Create(MailOperation.SetFlag), MailOperationMenuItem.Create(MailOperation.ClearFlag)]
};
operationList.AddRange(flagsOperations);
}
// Ignore
if (!isDraftOrSent)
operationList.Add(MailOperationMenuItem.Create(MailOperation.Ignore));
// Seperator
operationList.Add(MailOperationMenuItem.Create(MailOperation.Seperator));
// Junk folder
if (isJunkFolder)
operationList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsNotJunk));
else if (!isDraftOrSent)
operationList.Add(MailOperationMenuItem.Create(MailOperation.MoveToJunk));
// TODO: Focus folder support.
// Remove the separator if it's the last item remaining.
// It's creating unpleasent UI glitch.
if (operationList.LastOrDefault()?.Operation == MailOperation.Seperator)
operationList.RemoveAt(operationList.Count - 1);
return operationList;
2025-02-16 11:35:43 +01:00
}
public virtual IEnumerable<MailOperationMenuItem> GetMailItemRenderMenuActions(IMailItem mailItem, bool isDarkEditor)
{
var actionList = new List<MailOperationMenuItem>();
2024-04-18 01:44:37 +02:00
bool isArchiveFolder = mailItem.AssignedFolder.SpecialFolderType == SpecialFolderType.Archive;
2024-04-18 01:44:37 +02:00
// Add light/dark editor theme switch.
if (isDarkEditor)
actionList.Add(MailOperationMenuItem.Create(MailOperation.LightEditor));
else
actionList.Add(MailOperationMenuItem.Create(MailOperation.DarkEditor));
2024-04-18 01:44:37 +02:00
actionList.Add(MailOperationMenuItem.Create(MailOperation.Seperator));
2024-04-18 01:44:37 +02:00
// You can't do these to draft items.
if (!mailItem.IsDraft)
{
// Reply
actionList.Add(MailOperationMenuItem.Create(MailOperation.Reply));
2024-04-18 01:44:37 +02:00
// Reply All
actionList.Add(MailOperationMenuItem.Create(MailOperation.ReplyAll));
2024-04-18 01:44:37 +02:00
// Forward
actionList.Add(MailOperationMenuItem.Create(MailOperation.Forward));
}
2024-04-18 01:44:37 +02:00
// Archive - Unarchive
if (isArchiveFolder)
actionList.Add(MailOperationMenuItem.Create(MailOperation.UnArchive));
else
actionList.Add(MailOperationMenuItem.Create(MailOperation.Archive));
2024-04-18 01:44:37 +02:00
// Delete
actionList.Add(MailOperationMenuItem.Create(MailOperation.SoftDelete));
2025-02-16 11:35:43 +01:00
// Flag - Clear Flag
if (mailItem.IsFlagged)
actionList.Add(MailOperationMenuItem.Create(MailOperation.ClearFlag));
else
actionList.Add(MailOperationMenuItem.Create(MailOperation.SetFlag));
2025-02-16 11:35:43 +01:00
// Secondary items.
2025-02-16 11:35:43 +01:00
// Read - Unread
if (mailItem.IsRead)
actionList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsUnread, true, false));
else
actionList.Add(MailOperationMenuItem.Create(MailOperation.MarkAsRead, true, false));
2024-04-18 01:44:37 +02:00
return actionList;
2024-04-18 01:44:37 +02:00
}
}
}