Implemented initial version for popping out window for rendering and compose pages

This commit is contained in:
Burak Kaan Köse
2026-04-11 01:04:59 +02:00
parent d5c121ce24
commit 4cb08f0a98
22 changed files with 628 additions and 79 deletions
+24 -9
View File
@@ -23,21 +23,22 @@ using Wino.Core.Domain.Models.Navigation;
using Wino.Core.Extensions;
using Wino.Core.Services;
using Wino.Mail.ViewModels.Data;
using Wino.Mail.ViewModels.Messages;
using Wino.Messaging.Client.Mails;
using Wino.Messaging.UI;
namespace Wino.Mail.ViewModels;
public partial class ComposePageViewModel : MailBaseViewModel,
IRecipient<ReaderItemRefreshRequestedEvent>,
IRecipient<SynchronizationActionsAdded>,
IRecipient<SynchronizationActionsCompleted>,
IRecipient<AccountSynchronizerStateChanged>
{
public event EventHandler CloseRequested;
private static readonly TimeSpan LocalDraftRetryGracePeriod = TimeSpan.FromSeconds(15);
public Func<Task<string>> GetHTMLBodyFunction;
public Func<string, Task> RenderHtmlBodyAsyncFunc { get; set; }
public override async Task KeyboardShortcutHook(KeyboardShortcutTriggerDetails args)
{
@@ -529,9 +530,9 @@ public partial class ComposePageViewModel : MailBaseViewModel,
}
}
public async void Receive(ReaderItemRefreshRequestedEvent message)
public async Task RefreshDraftAsync(MailItemViewModel draftMailItemViewModel)
{
if (message.MailItemViewModel == null || !message.MailItemViewModel.IsDraft) return;
if (draftMailItemViewModel == null || !draftMailItemViewModel.IsDraft) return;
// Save current draft before switching.
await UpdateMimeChangesAsync();
@@ -542,7 +543,7 @@ public partial class ComposePageViewModel : MailBaseViewModel,
IncludedAttachments.Clear();
// Set the new draft item and prepare it.
CurrentMailDraftItem = message.MailItemViewModel;
CurrentMailDraftItem = draftMailItemViewModel;
await UpdatePendingOperationStateAsync();
await LoadEmailTemplatesAsync();
await TryPrepareComposeAsync(true);
@@ -591,7 +592,6 @@ public partial class ComposePageViewModel : MailBaseViewModel,
{
base.RegisterRecipients();
Messenger.Register<ReaderItemRefreshRequestedEvent>(this);
Messenger.Register<SynchronizationActionsAdded>(this);
Messenger.Register<SynchronizationActionsCompleted>(this);
Messenger.Register<AccountSynchronizerStateChanged>(this);
@@ -601,7 +601,6 @@ public partial class ComposePageViewModel : MailBaseViewModel,
{
base.UnregisterRecipients();
Messenger.Unregister<ReaderItemRefreshRequestedEvent>(this);
Messenger.Unregister<SynchronizationActionsAdded>(this);
Messenger.Unregister<SynchronizationActionsCompleted>(this);
Messenger.Unregister<AccountSynchronizerStateChanged>(this);
@@ -754,9 +753,12 @@ public partial class ComposePageViewModel : MailBaseViewModel,
IsCCBCCVisible = true;
Subject = replyingMime.Subject;
Messenger.Send(new CreateNewComposeMailRequested(renderModel));
});
if (RenderHtmlBodyAsyncFunc != null)
{
await ExecuteUIThread(async () => await RenderHtmlBodyAsyncFunc(renderModel.RenderHtml));
}
}
private void LoadAttachments()
@@ -891,6 +893,19 @@ public partial class ComposePageViewModel : MailBaseViewModel,
}
}
protected override async void OnMailRemoved(MailCopy removedMail, EntityUpdateSource source)
{
base.OnMailRemoved(removedMail, source);
if (CurrentMailDraftItem?.MailCopy == null)
return;
if (CurrentMailDraftItem.MailCopy.UniqueId != removedMail.UniqueId)
return;
await ExecuteUIThread(() => CloseRequested?.Invoke(this, EventArgs.Empty));
}
private void NotifyComposeActionStateChanged()
{
OnPropertyChanged(nameof(IsLocalDraft));
@@ -26,7 +26,7 @@ using Wino.Core.Domain.Models.Printing;
using Wino.Core.Domain.Models.Reader;
using Wino.Core.Services;
using Wino.Mail.ViewModels.Data;
using Wino.Mail.ViewModels.Messages;
using Wino.Mail.ViewModels.Models;
using Wino.Messaging.Client.Mails;
using Wino.Messaging.UI;
using IMailService = Wino.Core.Domain.Interfaces.IMailService;
@@ -34,10 +34,12 @@ using IMailService = Wino.Core.Domain.Interfaces.IMailService;
namespace Wino.Mail.ViewModels;
public partial class MailRenderingPageViewModel : MailBaseViewModel,
IRecipient<ReaderItemRefreshRequestedEvent>,
IRecipient<ThumbnailAdded>,
ITransferProgress // For listening IMAP message download progress.
{
public event EventHandler CloseRequested;
public event EventHandler<ComposeDraftRequestedEventArgs> ComposeRequested;
private readonly IMailDialogService _dialogService;
private readonly IUnderlyingThemeService _underlyingThemeService;
@@ -58,8 +60,9 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
// Func to get WebView2 to save current HTML as PDF to given location.
// Used in 'Save as' and 'Print' functionality.
public Func<string, Task<bool>> SaveHTMLasPDFFunc { get; set; }
public Func<WebView2PrintSettingsModel, Task<PrintingResult>> DirectPrintFuncAsync { get; set; }
public Func<string, Task> RenderHtmlAsyncFunc { get; set; }
public Func<Task> ClearRenderedHtmlAsyncFunc { get; set; }
#region Properties
@@ -319,6 +322,7 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
var draftPreparationRequest = new DraftPreparationRequest(initializedMailItemViewModel.MailCopy.AssignedAccount, draftMailCopy, draftBase64MimeMessage, draftOptions.Reason, initializedMailItemViewModel.MailCopy);
await _requestDelegator.ExecuteAsync(draftPreparationRequest);
ComposeRequested?.Invoke(this, new ComposeDraftRequestedEventArgs(draftMailCopy.UniqueId));
}
else if (initializedMailItemViewModel != null)
@@ -362,8 +366,10 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
initializedMimeMessageInformation = null;
CurrentMailItemDisplayInformation = null;
// Dispose existing content first.
Messenger.Send(new CancelRenderingContentRequested());
if (ClearRenderedHtmlAsyncFunc != null)
{
await ExecuteUIThread(async () => await ClearRenderedHtmlAsyncFunc());
}
// This page can be accessed for 2 purposes.
// 1. Rendering a mail item when the user selects.
@@ -509,8 +515,6 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
CurrentRenderModel = _mimeFileService.GetMailRenderModel(message, messagePath, renderingOptions);
Messenger.Send(new HtmlRenderingRequested(CurrentRenderModel.RenderHtml));
foreach (var attachment in CurrentRenderModel.Attachments)
{
Attachments.Add(new MailAttachmentViewModel(attachment));
@@ -520,6 +524,11 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
StatePersistenceService.IsReadingMail = true;
});
if (RenderHtmlAsyncFunc != null)
{
await ExecuteUIThread(async () => await RenderHtmlAsyncFunc(CurrentRenderModel.RenderHtml));
}
}
private async Task<List<AccountContactViewModel>> GetAccountContacts(InternetAddressList internetAddresses)
@@ -658,6 +667,19 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
await ExecuteUIThread(() => { InitializeCommandBarItems(); });
}
protected override async void OnMailRemoved(MailCopy removedMail, EntityUpdateSource source)
{
base.OnMailRemoved(removedMail, source);
if (initializedMailItemViewModel?.MailCopy == null)
return;
if (initializedMailItemViewModel.MailCopy.UniqueId != removedMail.UniqueId)
return;
await ExecuteUIThread(() => CloseRequested?.Invoke(this, EventArgs.Empty));
}
[RelayCommand]
private async Task OpenAttachmentAsync(MailAttachmentViewModel attachmentViewModel)
{
@@ -794,13 +816,13 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
// For upload.
void ITransferProgress.Report(long bytesTransferred) { }
public async void Receive(ReaderItemRefreshRequestedEvent message)
public async Task RefreshMailItemAsync(MailItemViewModel mailItemViewModel)
{
if (message.MailItemViewModel == null || message.MailItemViewModel.IsDraft) return;
if (mailItemViewModel == null || mailItemViewModel.IsDraft) return;
try
{
await RenderAsync(message.MailItemViewModel, renderCancellationTokenSource.Token);
await RenderAsync(mailItemViewModel, renderCancellationTokenSource.Token);
}
catch (OperationCanceledException)
{
@@ -907,7 +929,6 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
{
base.RegisterRecipients();
Messenger.Register<ReaderItemRefreshRequestedEvent>(this);
Messenger.Register<ThumbnailAdded>(this);
}
@@ -915,7 +936,6 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel,
{
base.UnregisterRecipients();
Messenger.Unregister<ReaderItemRefreshRequestedEvent>(this);
Messenger.Unregister<ThumbnailAdded>(this);
}
}
@@ -0,0 +1,13 @@
using System;
namespace Wino.Mail.ViewModels.Models;
public sealed class ComposeDraftRequestedEventArgs : EventArgs
{
public ComposeDraftRequestedEventArgs(Guid draftUniqueId)
{
DraftUniqueId = draftUniqueId;
}
public Guid DraftUniqueId { get; }
}