From 7761cf6dbee7ff72139ce5dc4e080030170d6c52 Mon Sep 17 00:00:00 2001 From: Tiktack Date: Tue, 10 Sep 2024 10:14:13 +0200 Subject: [PATCH] Code Quality: Fixed multiple paddings, disabled backspace addon (#354) * Changed paddings and size for unsubscribe button to avoid shifts * Fix bottom paddings * Disable backspace addon, simplify attachments logic, convert switches * Remove redundant code from Mail Rendering page * Replace Font Icon to Path --- .../MailRenderingPageViewModel.cs | 40 +---- Wino.Mail/Helpers/XamlHelpers.cs | 140 +++++++----------- Wino.Mail/JS/editor.js | 2 +- Wino.Mail/Views/MailRenderingPage.xaml | 68 +++------ 4 files changed, 76 insertions(+), 174 deletions(-) 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}" /> - - - - - - - - - - - -