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