diff --git a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs
index e7a25c84..adf10667 100644
--- a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs
+++ b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs
@@ -81,8 +81,6 @@ namespace Wino.Mail.ViewModels
}
}
- public bool HasMultipleAttachments => Attachments.Count > 1;
-
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ShouldDisplayDownloadProgress))]
private bool isIndetermineProgress;
@@ -295,14 +293,14 @@ namespace Wino.Mail.ViewModels
{
base.OnNavigatedTo(mode, parameters);
- Attachments.CollectionChanged -= AttachmentsUpdated;
- Attachments.CollectionChanged += AttachmentsUpdated;
-
renderCancellationTokenSource.Cancel();
initializedMailItemViewModel = null;
initializedMimeMessageInformation = null;
+ // Dispose existing content first.
+ Messenger.Send(new CancelRenderingContentRequested());
+
// This page can be accessed for 2 purposes.
// 1. Rendering a mail item when the user selects.
// 2. Rendering an existing EML file with MimeMessage.
@@ -313,8 +311,6 @@ namespace Wino.Mail.ViewModels
// Configure common rendering properties first.
IsDarkWebviewRenderer = _underlyingThemeService.IsUnderlyingThemeDark();
- await ResetPagePropertiesAsync();
-
renderCancellationTokenSource = new CancellationTokenSource();
// Mime content might not be available for now and might require a download.
@@ -340,11 +336,6 @@ namespace Wino.Mail.ViewModels
}
}
- private async void AttachmentsUpdated(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
- {
- await ExecuteUIThread(() => { OnPropertyChanged(nameof(HasMultipleAttachments)); });
- }
-
private async Task HandleSingleItemDownloadAsync(MailItemViewModel mailItemViewModel)
{
try
@@ -371,6 +362,7 @@ namespace Wino.Mail.ViewModels
private async Task RenderAsync(MailItemViewModel mailItemViewModel, CancellationToken cancellationToken = default)
{
+ ResetProgress();
var isMimeExists = await _mimeFileService.IsMimeExistAsync(mailItemViewModel.AssignedAccount.Id, mailItemViewModel.MailCopy.FileId);
if (!isMimeExists)
@@ -460,8 +452,6 @@ namespace Wino.Mail.ViewModels
{
base.OnNavigatedFrom(mode, parameters);
- Attachments.CollectionChanged -= AttachmentsUpdated;
-
renderCancellationTokenSource.Cancel();
CurrentDownloadPercentage = 0d;
@@ -470,12 +460,6 @@ namespace Wino.Mail.ViewModels
forceImageLoading = false;
- ToItems.Clear();
- CCItemsItems.Clear();
- BCCItems.Clear();
- Attachments.Clear();
- MenuItems.Clear();
-
StatePersistenceService.IsReadingMail = false;
}
@@ -501,22 +485,6 @@ namespace Wino.Mail.ViewModels
IsIndetermineProgress = false;
}
- private async Task ResetPagePropertiesAsync()
- {
- await ExecuteUIThread(() =>
- {
- ResetProgress();
-
- ToItems.Clear();
- CCItemsItems.Clear();
- BCCItems.Clear();
- Attachments.Clear();
-
- // Dispose existing content first.
- Messenger.Send(new CancelRenderingContentRequested());
- });
- }
-
private void InitializeCommandBarItems()
{
MenuItems.Clear();
diff --git a/Wino.Mail/Helpers/XamlHelpers.cs b/Wino.Mail/Helpers/XamlHelpers.cs
index 4157b2ae..275185a6 100644
--- a/Wino.Mail/Helpers/XamlHelpers.cs
+++ b/Wino.Mail/Helpers/XamlHelpers.cs
@@ -28,21 +28,17 @@ namespace Wino.Helpers
public static bool CountToBooleanConverter(int value) => value > 0;
public static bool ObjectEquals(object obj1, object obj2) => object.Equals(obj1, obj2);
public static Visibility CountToVisibilityConverter(int value) => value > 0 ? Visibility.Visible : Visibility.Collapsed;
+ public static Visibility CountToVisibilityConverterWithThreshold(int value, int threshold) => value > threshold ? Visibility.Visible : Visibility.Collapsed;
public static InfoBarSeverity InfoBarSeverityConverter(InfoBarMessageType messageType)
{
- switch (messageType)
+ return messageType switch
{
- case InfoBarMessageType.Information:
- return InfoBarSeverity.Informational;
- case InfoBarMessageType.Success:
- return InfoBarSeverity.Success;
- case InfoBarMessageType.Warning:
- return InfoBarSeverity.Warning;
- case InfoBarMessageType.Error:
- return InfoBarSeverity.Error;
- default:
- return InfoBarSeverity.Informational;
- }
+ InfoBarMessageType.Information => InfoBarSeverity.Informational,
+ InfoBarMessageType.Success => InfoBarSeverity.Success,
+ InfoBarMessageType.Warning => InfoBarSeverity.Warning,
+ InfoBarMessageType.Error => InfoBarSeverity.Error,
+ _ => InfoBarSeverity.Informational,
+ };
}
public static SolidColorBrush GetSolidColorBrushFromHex(string colorHex) => string.IsNullOrEmpty(colorHex) ? new SolidColorBrush(Colors.Transparent) : new SolidColorBrush(colorHex.ToColor());
public static Visibility IsSelectionModeMultiple(ListViewSelectionMode mode) => mode == ListViewSelectionMode.Multiple ? Visibility.Visible : Visibility.Collapsed;
@@ -177,95 +173,59 @@ namespace Wino.Helpers
public static WinoIconGlyph GetPathGeometry(FolderOperation operation)
{
- switch (operation)
+ return operation switch
{
- case FolderOperation.None:
- return WinoIconGlyph.None;
- case FolderOperation.Pin:
- return WinoIconGlyph.Pin;
- case FolderOperation.Unpin:
- return WinoIconGlyph.UnPin;
- case FolderOperation.MarkAllAsRead:
- return WinoIconGlyph.MarkRead;
- case FolderOperation.DontSync:
- return WinoIconGlyph.DontSync;
- case FolderOperation.Empty:
- return WinoIconGlyph.EmptyFolder;
- case FolderOperation.Rename:
- return WinoIconGlyph.Rename;
- case FolderOperation.Delete:
- return WinoIconGlyph.Delete;
- case FolderOperation.Move:
- return WinoIconGlyph.Forward;
- case FolderOperation.TurnOffNotifications:
- return WinoIconGlyph.TurnOfNotifications;
- case FolderOperation.CreateSubFolder:
- return WinoIconGlyph.CreateFolder;
- }
-
- return WinoIconGlyph.None;
+ FolderOperation.None => WinoIconGlyph.None,
+ FolderOperation.Pin => WinoIconGlyph.Pin,
+ FolderOperation.Unpin => WinoIconGlyph.UnPin,
+ FolderOperation.MarkAllAsRead => WinoIconGlyph.MarkRead,
+ FolderOperation.DontSync => WinoIconGlyph.DontSync,
+ FolderOperation.Empty => WinoIconGlyph.EmptyFolder,
+ FolderOperation.Rename => WinoIconGlyph.Rename,
+ FolderOperation.Delete => WinoIconGlyph.Delete,
+ FolderOperation.Move => WinoIconGlyph.Forward,
+ FolderOperation.TurnOffNotifications => WinoIconGlyph.TurnOfNotifications,
+ FolderOperation.CreateSubFolder => WinoIconGlyph.CreateFolder,
+ _ => WinoIconGlyph.None,
+ };
}
public static WinoIconGlyph GetSpecialFolderPathIconGeometry(SpecialFolderType specialFolderType)
{
- switch (specialFolderType)
+ return specialFolderType switch
{
- case SpecialFolderType.Inbox:
- return WinoIconGlyph.SpecialFolderInbox;
- case SpecialFolderType.Starred:
- return WinoIconGlyph.SpecialFolderStarred;
- case SpecialFolderType.Important:
- return WinoIconGlyph.SpecialFolderImportant;
- case SpecialFolderType.Sent:
- return WinoIconGlyph.SpecialFolderSent;
- case SpecialFolderType.Draft:
- return WinoIconGlyph.SpecialFolderDraft;
- case SpecialFolderType.Archive:
- return WinoIconGlyph.SpecialFolderArchive;
- case SpecialFolderType.Deleted:
- return WinoIconGlyph.SpecialFolderDeleted;
- case SpecialFolderType.Junk:
- return WinoIconGlyph.SpecialFolderJunk;
- case SpecialFolderType.Chat:
- return WinoIconGlyph.SpecialFolderChat;
- case SpecialFolderType.Category:
- return WinoIconGlyph.SpecialFolderCategory;
- case SpecialFolderType.Unread:
- return WinoIconGlyph.SpecialFolderUnread;
- case SpecialFolderType.Forums:
- return WinoIconGlyph.SpecialFolderForums;
- case SpecialFolderType.Updates:
- return WinoIconGlyph.SpecialFolderUpdated;
- case SpecialFolderType.Personal:
- return WinoIconGlyph.SpecialFolderPersonal;
- case SpecialFolderType.Promotions:
- return WinoIconGlyph.SpecialFolderPromotions;
- case SpecialFolderType.Social:
- return WinoIconGlyph.SpecialFolderSocial;
- case SpecialFolderType.Other:
- return WinoIconGlyph.SpecialFolderOther;
- case SpecialFolderType.More:
- return WinoIconGlyph.SpecialFolderMore;
- }
-
- return WinoIconGlyph.None;
+ SpecialFolderType.Inbox => WinoIconGlyph.SpecialFolderInbox,
+ SpecialFolderType.Starred => WinoIconGlyph.SpecialFolderStarred,
+ SpecialFolderType.Important => WinoIconGlyph.SpecialFolderImportant,
+ SpecialFolderType.Sent => WinoIconGlyph.SpecialFolderSent,
+ SpecialFolderType.Draft => WinoIconGlyph.SpecialFolderDraft,
+ SpecialFolderType.Archive => WinoIconGlyph.SpecialFolderArchive,
+ SpecialFolderType.Deleted => WinoIconGlyph.SpecialFolderDeleted,
+ SpecialFolderType.Junk => WinoIconGlyph.SpecialFolderJunk,
+ SpecialFolderType.Chat => WinoIconGlyph.SpecialFolderChat,
+ SpecialFolderType.Category => WinoIconGlyph.SpecialFolderCategory,
+ SpecialFolderType.Unread => WinoIconGlyph.SpecialFolderUnread,
+ SpecialFolderType.Forums => WinoIconGlyph.SpecialFolderForums,
+ SpecialFolderType.Updates => WinoIconGlyph.SpecialFolderUpdated,
+ SpecialFolderType.Personal => WinoIconGlyph.SpecialFolderPersonal,
+ SpecialFolderType.Promotions => WinoIconGlyph.SpecialFolderPromotions,
+ SpecialFolderType.Social => WinoIconGlyph.SpecialFolderSocial,
+ SpecialFolderType.Other => WinoIconGlyph.SpecialFolderOther,
+ SpecialFolderType.More => WinoIconGlyph.SpecialFolderMore,
+ _ => WinoIconGlyph.None,
+ };
}
public static WinoIconGlyph GetProviderIcon(MailProviderType providerType)
{
- switch (providerType)
+ return providerType switch
{
- case MailProviderType.Outlook:
- return WinoIconGlyph.Microsoft;
- case MailProviderType.Gmail:
- return WinoIconGlyph.Google;
- case MailProviderType.Office365:
- return WinoIconGlyph.Microsoft;
- case MailProviderType.IMAP4:
- return WinoIconGlyph.Mail;
- }
-
- return WinoIconGlyph.None;
+ MailProviderType.Outlook => WinoIconGlyph.Microsoft,
+ MailProviderType.Gmail => WinoIconGlyph.Google,
+ MailProviderType.Office365 => WinoIconGlyph.Microsoft,
+ MailProviderType.IMAP4 => WinoIconGlyph.Mail,
+ _ => WinoIconGlyph.None,
+ };
}
public static Geometry GetPathGeometry(string pathMarkup)
diff --git a/Wino.Mail/JS/editor.js b/Wino.Mail/JS/editor.js
index fb244cc6..454bf50b 100644
--- a/Wino.Mail/JS/editor.js
+++ b/Wino.Mail/JS/editor.js
@@ -8,7 +8,7 @@ const joditConfig = {
"showCharsCounter": false,
"showWordsCounter": false,
"showXPathInStatusbar": false,
- "disablePlugins": "add-new-line",
+ "disablePlugins": "add-new-line,backspace",
"showPlaceholder": false,
"uploader": {
"insertImageAsBase64URI": true
diff --git a/Wino.Mail/Views/MailRenderingPage.xaml b/Wino.Mail/Views/MailRenderingPage.xaml
index 11d8d8b7..f99b9ece 100644
--- a/Wino.Mail/Views/MailRenderingPage.xaml
+++ b/Wino.Mail/Views/MailRenderingPage.xaml
@@ -3,9 +3,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:abstract="using:Wino.Views.Abstract"
- xmlns:controls="using:Microsoft.UI.Xaml.Controls"
- xmlns:controls1="using:Wino.Controls"
- xmlns:controls2="using:CommunityToolkit.WinUI.Controls"
+ xmlns:controls="using:Wino.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:domain="using:Wino.Core.Domain"
xmlns:entities="using:Wino.Core.Domain.Entities"
@@ -14,8 +12,7 @@
xmlns:local="using:Wino.Behaviors"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
- xmlns:selectors="using:Wino.Selectors"
- xmlns:ui="using:Microsoft.Toolkit.Uwp.UI"
+ xmlns:toolkit="using:CommunityToolkit.WinUI.Controls"
xmlns:viewModelData="using:Wino.Mail.ViewModels.Data"
x:Name="root"
muxc:BackdropMaterial.ApplyToRootOrPageBackground="{ThemeResource UseMica}"
@@ -23,12 +20,6 @@
mc:Ignorable="d">
-
-
-
-
-
@@ -142,7 +131,7 @@
BorderBrush="{StaticResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="7">
-
+
@@ -150,7 +139,7 @@
-
+
@@ -165,14 +154,17 @@
-
-
+
+
+
+
@@ -199,7 +191,7 @@
-
-
+
@@ -261,7 +249,7 @@
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.ToItems.Count), Mode=OneWay}">
-
+
@@ -283,7 +271,7 @@
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.CCItemsItems.Count), Mode=OneWay}">
-
+
@@ -307,7 +295,7 @@
Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(ViewModel.BCCItems.Count), Mode=OneWay}">
-
+
@@ -332,7 +320,7 @@
SelectionMode="None">
-
+
@@ -342,14 +330,12 @@
VerticalAlignment="Center"
Command="{x:Bind ViewModel.SaveAllAttachmentsCommand}"
Content="{x:Bind domain:Translator.Reader_SaveAllAttachmentButtonText}"
- Visibility="{x:Bind ViewModel.HasMultipleAttachments, Mode=OneWay}" />
+ Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverterWithThreshold(ViewModel.Attachments.Count, 1), Mode=OneWay}" />
-
-
@@ -397,18 +383,6 @@
IsActive="{x:Bind ViewModel.ShouldDisplayDownloadProgress, Mode=OneWay}" />
-
-
-
-
-
-
-
-
-
-
-
-