125 lines
3.8 KiB
C#
125 lines
3.8 KiB
C#
|
|
using System;
|
||
|
|
using Microsoft.UI.Xaml;
|
||
|
|
using Microsoft.UI.Xaml.Controls;
|
||
|
|
using Wino.Core.Domain;
|
||
|
|
using Wino.Core.Domain.Interfaces;
|
||
|
|
using Wino.Mail.Api.Contracts.Auth;
|
||
|
|
using Wino.Mail.WinUI.Services;
|
||
|
|
|
||
|
|
namespace Wino.Dialogs;
|
||
|
|
|
||
|
|
public sealed partial class WinoAccountEmailConfirmationRequiredDialog : ContentDialog
|
||
|
|
{
|
||
|
|
private readonly IWinoAccountProfileService _profileService;
|
||
|
|
private readonly DispatcherTimer _countdownTimer;
|
||
|
|
private readonly string _email;
|
||
|
|
private readonly string _endpoint;
|
||
|
|
private readonly string _ticket;
|
||
|
|
private DateTimeOffset _resendAvailableAtUtc;
|
||
|
|
|
||
|
|
public WinoAccountEmailConfirmationRequiredDialog(IWinoAccountProfileService profileService, string email, EmailConfirmationRequiredDetailsDto details)
|
||
|
|
{
|
||
|
|
_profileService = profileService;
|
||
|
|
_email = email;
|
||
|
|
_endpoint = details.ResendConfirmationEndpoint;
|
||
|
|
_ticket = details.ResendConfirmationTicket;
|
||
|
|
_resendAvailableAtUtc = details.ResendAvailableAtUtc;
|
||
|
|
|
||
|
|
InitializeComponent();
|
||
|
|
|
||
|
|
MessageTextBlock.Text = string.Format(Translator.WinoAccount_EmailConfirmationPendingDialog_Message, email);
|
||
|
|
|
||
|
|
_countdownTimer = new DispatcherTimer
|
||
|
|
{
|
||
|
|
Interval = TimeSpan.FromSeconds(1)
|
||
|
|
};
|
||
|
|
_countdownTimer.Tick += CountdownTimer_Tick;
|
||
|
|
|
||
|
|
Closing += DialogClosing;
|
||
|
|
|
||
|
|
UpdateCountdown();
|
||
|
|
_countdownTimer.Start();
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool ResendSucceeded { get; private set; }
|
||
|
|
|
||
|
|
private async void ResendClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args)
|
||
|
|
{
|
||
|
|
args.Cancel = true;
|
||
|
|
|
||
|
|
if (DateTimeOffset.UtcNow < _resendAvailableAtUtc)
|
||
|
|
{
|
||
|
|
UpdateCountdown();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var deferral = args.GetDeferral();
|
||
|
|
|
||
|
|
try
|
||
|
|
{
|
||
|
|
SetBusyState(true);
|
||
|
|
HideError();
|
||
|
|
|
||
|
|
var response = await _profileService.ResendEmailConfirmationAsync(_endpoint, _ticket);
|
||
|
|
if (!response.IsSuccess)
|
||
|
|
{
|
||
|
|
ShowError(WinoAccountAuthErrorTranslator.Translate(response.ErrorCode));
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
ResendSucceeded = true;
|
||
|
|
Hide();
|
||
|
|
}
|
||
|
|
finally
|
||
|
|
{
|
||
|
|
SetBusyState(false);
|
||
|
|
deferral.Complete();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void CountdownTimer_Tick(object? sender, object e) => UpdateCountdown();
|
||
|
|
|
||
|
|
private void UpdateCountdown()
|
||
|
|
{
|
||
|
|
var remaining = _resendAvailableAtUtc - DateTimeOffset.UtcNow;
|
||
|
|
if (remaining <= TimeSpan.Zero)
|
||
|
|
{
|
||
|
|
IsPrimaryButtonEnabled = true;
|
||
|
|
CountdownTextBlock.Text = Translator.WinoAccount_EmailConfirmationPendingDialog_ReadyToResend;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
IsPrimaryButtonEnabled = false;
|
||
|
|
CountdownTextBlock.Text = string.Format(
|
||
|
|
Translator.WinoAccount_EmailConfirmationPendingDialog_Countdown,
|
||
|
|
$"{Math.Max(0, (int)remaining.TotalMinutes):00}:{Math.Max(0, remaining.Seconds):00}");
|
||
|
|
}
|
||
|
|
|
||
|
|
private void SetBusyState(bool isBusy)
|
||
|
|
{
|
||
|
|
IsPrimaryButtonEnabled = !isBusy && DateTimeOffset.UtcNow >= _resendAvailableAtUtc;
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
|
||
|
|
private void DialogClosing(ContentDialog sender, ContentDialogClosingEventArgs args)
|
||
|
|
{
|
||
|
|
_countdownTimer.Stop();
|
||
|
|
_countdownTimer.Tick -= CountdownTimer_Tick;
|
||
|
|
Closing -= DialogClosing;
|
||
|
|
}
|
||
|
|
}
|