Files
Wino-Mail/Wino.Mail.WinUI/Dialogs/WinoAccountRegistrationDialog.xaml.cs
T
2026-03-19 16:41:35 +01:00

162 lines
4.4 KiB
C#

using System;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Input;
using Windows.System;
using Wino.Core.Domain;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Interfaces;
using Wino.Mail.WinUI.Services;
namespace Wino.Dialogs;
public sealed partial class WinoAccountRegistrationDialog : ContentDialog
{
private const string PrivacyPolicyUrl = "https://www.winomail.app/accounts_policy.html";
private readonly IWinoAccountProfileService _profileService;
public WinoAccountRegistrationDialog(IWinoAccountProfileService profileService)
{
_profileService = profileService;
InitializeComponent();
}
public WinoAccount? Result { get; private set; }
public string? ConfirmationEmailAddress { get; private set; }
private async void RegisterClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
args.Cancel = true;
var validationError = ValidateInput();
if (!string.IsNullOrWhiteSpace(validationError))
{
ShowError(validationError);
return;
}
var deferral = args.GetDeferral();
try
{
await PerformRegistrationAsync();
}
finally
{
deferral.Complete();
}
}
private async System.Threading.Tasks.Task PerformRegistrationAsync()
{
var validationError = ValidateInput();
if (!string.IsNullOrWhiteSpace(validationError))
{
ShowError(validationError);
return;
}
try
{
SetBusyState(true);
HideError();
var result = await _profileService.RegisterAsync(EmailTextBox.Text.Trim(), PasswordBox.Password);
if (!result.IsSuccess || result.Account == null)
{
ShowError(WinoAccountAuthErrorTranslator.Format(result.ErrorCode, result.ErrorMessage));
return;
}
ConfirmationEmailAddress = result.Account.Email;
Hide();
}
finally
{
SetBusyState(false);
}
}
private string ValidateInput()
{
if (string.IsNullOrWhiteSpace(EmailTextBox.Text))
{
return Translator.WinoAccount_Validation_EmailRequired;
}
if (string.IsNullOrWhiteSpace(PasswordBox.Password))
{
return Translator.WinoAccount_Validation_PasswordRequired;
}
if (!string.Equals(PasswordBox.Password, ConfirmPasswordBox.Password, StringComparison.Ordinal))
{
return Translator.WinoAccount_Validation_PasswordMismatch;
}
if (PrivacyPolicyCheckBox.IsChecked != true)
{
return Translator.WinoAccount_Validation_PrivacyConsentRequired;
}
return string.Empty;
}
private void EmailTextBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == VirtualKey.Enter)
{
PasswordBox.Focus(FocusState.Programmatic);
e.Handled = true;
}
}
private void PasswordBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == VirtualKey.Enter)
{
ConfirmPasswordBox.Focus(FocusState.Programmatic);
e.Handled = true;
}
}
private async void ConfirmPasswordBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key == VirtualKey.Enter)
{
e.Handled = true;
await PerformRegistrationAsync();
}
}
private async void PrivacyPolicyLink_Click(object sender, RoutedEventArgs e)
{
await Launcher.LaunchUriAsync(new Uri(PrivacyPolicyUrl));
}
private void InputChanged(TextBox sender, TextBoxTextChangingEventArgs args) => HideError();
private void InputChanged(object sender, RoutedEventArgs e) => HideError();
private void SetBusyState(bool isBusy)
{
IsPrimaryButtonEnabled = !isBusy;
IsSecondaryButtonEnabled = !isBusy;
BusyRing.IsActive = isBusy;
BusyRing.Visibility = isBusy ? Visibility.Visible : Visibility.Collapsed;
}
private void ShowError(string message)
{
ErrorTextBlock.Text = message;
ErrorTextBlock.Visibility = Visibility.Visible;
}
private void HideError()
{
ErrorTextBlock.Text = string.Empty;
ErrorTextBlock.Visibility = Visibility.Collapsed;
}
}