using System; using System.Collections.Generic; using System.ComponentModel; using CommunityToolkit.Mvvm.Messaging; using MoreLinq; using Wino.Core.Domain.Entities; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Requests; using Wino.Messaging.UI; namespace Wino.Core.Requests { /// /// Archive message request. /// By default, the message will be moved to the Archive folder. /// For Gmail, 'Archive' label will be removed from the message. /// /// Whether are archiving or unarchiving /// Mail to archive /// Source folder. /// Optional Target folder. Required for ImapSynchronizer and OutlookSynchronizer. public record ArchiveRequest(bool IsArchiving, MailCopy Item, MailItemFolder FromFolder, MailItemFolder ToFolder = null) : RequestBase(Item, MailSynchronizerOperation.Archive), ICustomFolderSynchronizationRequest { public List SynchronizationFolderIds { get { var folderIds = new List { FromFolder.Id }; if (ToFolder != null) { folderIds.Add(ToFolder.Id); } return folderIds; } } public override IBatchChangeRequest CreateBatch(IEnumerable matchingItems) => new BatchArchiveRequest(IsArchiving, matchingItems, FromFolder, ToFolder); public override void ApplyUIChanges() { WeakReferenceMessenger.Default.Send(new MailRemovedMessage(Item)); } public override void RevertUIChanges() { WeakReferenceMessenger.Default.Send(new MailAddedMessage(Item)); } } [EditorBrowsable(EditorBrowsableState.Never)] public record BatchArchiveRequest(bool IsArchiving, IEnumerable Items, MailItemFolder FromFolder, MailItemFolder ToFolder = null) : BatchRequestBase(Items, MailSynchronizerOperation.Archive) { public override void ApplyUIChanges() { Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailRemovedMessage(item.Item))); } public override void RevertUIChanges() { Items.ForEach(item => WeakReferenceMessenger.Default.Send(new MailAddedMessage(item.Item))); } } }