Add initial mail sync range selection

This commit is contained in:
Burak Kaan Köse
2026-04-14 00:03:48 +02:00
parent 2e36772a4c
commit c622858d2d
21 changed files with 378 additions and 73 deletions
@@ -55,6 +55,7 @@
<Grid MinWidth="400" RowSpacing="12">
<Grid Visibility="{x:Bind IsProviderSelectionVisible, Mode=OneWay}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
@@ -96,6 +97,48 @@
</Grid>
<Border
x:Name="InitialSynchronizationPanel"
Grid.Row="1"
Margin="0,12,0,0"
Padding="12"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="8"
Visibility="Collapsed">
<StackPanel Spacing="10">
<StackPanel Spacing="2">
<TextBlock FontWeight="SemiBold" Text="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_Title}" />
<TextBlock
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_Description}"
TextWrapping="WrapWholeWords" />
</StackPanel>
<ComboBox
x:Name="InitialSynchronizationComboBox"
HorizontalAlignment="Stretch"
ItemsSource="{x:Bind InitialSynchronizationRanges, Mode=OneWay}"
SelectionChanged="InitialSynchronizationSelectionChanged">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="accounts:InitialSynchronizationRangeOption">
<TextBlock Text="{x:Bind DisplayText}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<muxc:InfoBar
x:Name="InitialSynchronizationWarningBar"
IsOpen="True"
Message="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_EverythingWarning}"
Severity="Warning"
Title="{x:Bind domain:Translator.GeneralTitle_Warning}"
Visibility="Collapsed" />
</StackPanel>
</Border>
<ListView
Grid.Row="2"
@@ -15,7 +15,7 @@ namespace Wino.Mail.WinUI.Dialogs;
public sealed partial class NewAccountDialog : ContentDialog
{
private readonly Dictionary<SpecialImapProvider, string> helpingLinks = new Dictionary<SpecialImapProvider, string>()
private readonly Dictionary<SpecialImapProvider, string> helpingLinks = new()
{
{ SpecialImapProvider.iCloud, "https://support.apple.com/en-us/102654" },
{ SpecialImapProvider.Yahoo, "http://help.yahoo.com/kb/SLN15241.html" },
@@ -27,7 +27,6 @@ public sealed partial class NewAccountDialog : ContentDialog
public static readonly DependencyProperty SelectedColorProperty = DependencyProperty.Register(nameof(SelectedColor), typeof(AppColorViewModel), typeof(NewAccountDialog), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedColorChanged)));
public static readonly DependencyProperty SelectedCalendarModeIndexProperty = DependencyProperty.Register(nameof(SelectedCalendarModeIndex), typeof(int), typeof(NewAccountDialog), new PropertyMetadata(0));
public AppColorViewModel? SelectedColor
{
get { return (AppColorViewModel?)GetValue(SelectedColorProperty); }
@@ -49,7 +48,6 @@ public sealed partial class NewAccountDialog : ContentDialog
set { SetValue(SelectedMailProviderProperty, value); }
}
public bool IsProviderSelectionVisible
{
get { return (bool)GetValue(IsProviderSelectionVisibleProperty); }
@@ -63,10 +61,16 @@ public sealed partial class NewAccountDialog : ContentDialog
}
// List of available mail providers for now.
public List<IProviderDetail> Providers { get; set; } = [];
public List<AppColorViewModel> AvailableColors { get; set; } = [];
public List<InitialSynchronizationRangeOption> InitialSynchronizationRanges { get; } =
[
new(InitialSynchronizationRange.ThreeMonths, Translator.AccountCreation_InitialSynchronization_3Months),
new(InitialSynchronizationRange.SixMonths, Translator.AccountCreation_InitialSynchronization_6Months),
new(InitialSynchronizationRange.NineMonths, Translator.AccountCreation_InitialSynchronization_9Months),
new(InitialSynchronizationRange.OneYear, Translator.AccountCreation_InitialSynchronization_Year),
new(InitialSynchronizationRange.Everything, Translator.AccountCreation_InitialSynchronization_Everything)
];
public List<string> CalendarModeOptions { get; } =
[
Translator.ImapCalDavSettingsPage_CalendarModeCalDav,
@@ -74,7 +78,6 @@ public sealed partial class NewAccountDialog : ContentDialog
Translator.ImapCalDavSettingsPage_CalendarModeDisabled
];
public AccountCreationDialogResult? Result = null;
public NewAccountDialog()
@@ -85,6 +88,8 @@ public sealed partial class NewAccountDialog : ContentDialog
AvailableColors = themeService.Select(a => new AppColorViewModel(a)).ToList();
UpdateSelectedColor();
InitialSynchronizationComboBox.SelectedItem = InitialSynchronizationRanges.First(option => option.Range == InitialSynchronizationRange.SixMonths);
UpdateInitialSynchronizationState();
}
private static void OnSelectedProviderChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
@@ -105,6 +110,19 @@ public sealed partial class NewAccountDialog : ContentDialog
SelectedColorEllipse.Fill = SelectedColor == null ? null : XamlHelpers.GetSolidColorBrushFromHex(SelectedColor.Hex);
}
private void UpdateInitialSynchronizationState()
{
InitialSynchronizationPanel.Visibility = SelectedMailProvider == null ? Visibility.Collapsed : Visibility.Visible;
var selectedOption = InitialSynchronizationComboBox.SelectedItem as InitialSynchronizationRangeOption;
InitialSynchronizationWarningBar.Visibility = selectedOption?.IsEverything == true ? Visibility.Visible : Visibility.Collapsed;
}
private InitialSynchronizationRange GetInitialSynchronizationRange()
{
var selectedRange = (InitialSynchronizationComboBox.SelectedItem as InitialSynchronizationRangeOption)?.Range
?? InitialSynchronizationRange.SixMonths;
return selectedRange;
}
private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
@@ -116,9 +134,11 @@ public sealed partial class NewAccountDialog : ContentDialog
if (SelectedMailProvider == null)
return;
var initialSynchronizationRange = GetInitialSynchronizationRange();
if (IsSpecialImapServerPartVisible)
{
// Special imap detail input.
// Special IMAP detail input.
var calendarSupportMode = SelectedCalendarModeIndex switch
{
1 => ImapCalendarSupportMode.LocalOnly,
@@ -132,7 +152,12 @@ public sealed partial class NewAccountDialog : ContentDialog
DisplayNameTextBox.Text.Trim(),
SelectedMailProvider.SpecialImapProvider,
calendarSupportMode);
Result = new AccountCreationDialogResult(SelectedMailProvider.Type, AccountNameTextbox.Text.Trim(), details, SelectedColor?.Hex ?? string.Empty);
Result = new AccountCreationDialogResult(
SelectedMailProvider.Type,
AccountNameTextbox.Text.Trim(),
details,
SelectedColor?.Hex ?? string.Empty,
initialSynchronizationRange);
Hide();
return;
@@ -140,11 +165,11 @@ public sealed partial class NewAccountDialog : ContentDialog
Validate();
if (IsSecondaryButtonEnabled)
if (IsPrimaryButtonEnabled)
{
if (SelectedMailProvider.SpecialImapProvider != SpecialImapProvider.None)
{
// This step requires app-sepcific password login for some providers.
// This step requires app-specific password login for some providers.
args.Cancel = true;
IsProviderSelectionVisible = false;
@@ -154,7 +179,12 @@ public sealed partial class NewAccountDialog : ContentDialog
}
else
{
Result = new AccountCreationDialogResult(SelectedMailProvider.Type, AccountNameTextbox.Text.Trim(), null, SelectedColor?.Hex ?? string.Empty);
Result = new AccountCreationDialogResult(
SelectedMailProvider.Type,
AccountNameTextbox.Text.Trim(),
null,
SelectedColor?.Hex ?? string.Empty,
initialSynchronizationRange);
Hide();
}
}
@@ -167,6 +197,7 @@ public sealed partial class NewAccountDialog : ContentDialog
{
ValidateCreateButton();
ValidateNames();
UpdateInitialSynchronizationState();
}
// Returns whether we can create account or not.
@@ -199,6 +230,9 @@ public sealed partial class NewAccountDialog : ContentDialog
private void ImapPasswordChanged(object sender, RoutedEventArgs e) => Validate();
private void InitialSynchronizationSelectionChanged(object sender, SelectionChangedEventArgs e)
=> UpdateInitialSynchronizationState();
private async void AppSpecificHelpButtonClicked(object sender, RoutedEventArgs e)
{
if (SelectedMailProvider == null ||
@@ -210,6 +210,13 @@
</TransitionCollection>
</StackPanel.ChildrenTransitions>
<muxc:InfoBar
IsOpen="True"
Margin="0,0,0,8"
Message="{x:Bind ViewModel.InitialSynchronizationSummary, Mode=OneWay}"
Severity="Informational"
Title="{x:Bind domain:Translator.AccountDetailsPage_InitialSynchronization_Title}"
Visibility="{x:Bind ViewModel.IsInitialSynchronizationSummaryVisible, Mode=OneWay}" />
<controls:SettingsCard
Command="{x:Bind ViewModel.EditAliasesCommand}"
@@ -10,15 +10,12 @@
xmlns:helpers="using:Wino.Helpers"
xmlns:interfaces="using:Wino.Core.Domain.Interfaces"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
mc:Ignorable="d">
<ScrollViewer
HorizontalAlignment="Center"
VerticalAlignment="Center"
VerticalScrollBarVisibility="Auto">
<ScrollViewer HorizontalAlignment="Center" VerticalScrollBarVisibility="Auto">
<StackPanel
MaxWidth="480"
Margin="0,24,0,24"
Margin="0,12"
HorizontalAlignment="Stretch"
Spacing="20">
@@ -76,6 +73,50 @@
</Button>
</Grid>
<Border
MaxWidth="600"
Padding="12"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="8">
<StackPanel Spacing="10">
<StackPanel Spacing="2">
<TextBlock FontWeight="SemiBold" Text="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_Title}" />
<TextBlock
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_Description}"
TextWrapping="WrapWholeWords" />
</StackPanel>
<ListView
HorizontalAlignment="Center"
HorizontalContentAlignment="Stretch"
ItemsSource="{x:Bind ViewModel.InitialSynchronizationRanges, Mode=OneWay}"
SelectedItem="{x:Bind ViewModel.SelectedInitialSynchronizationRange, Mode=TwoWay}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="accounts:InitialSynchronizationRangeOption">
<TextBlock Text="{x:Bind DisplayText}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<muxc:InfoBar
Title="{x:Bind domain:Translator.GeneralTitle_Warning}"
Margin="0,2,0,0"
IsOpen="True"
Message="{x:Bind domain:Translator.AccountCreation_InitialSynchronization_EverythingWarning}"
Severity="Warning"
Visibility="{x:Bind ViewModel.IsInitialSynchronizationWarningVisible, Mode=OneWay}" />
</StackPanel>
</Border>
<!-- Provider List -->
<ItemsView
HorizontalContentAlignment="Stretch"