XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEToolBox

【WPF】XFE工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using XFEToolBox.Client.Model;
using XFEToolBox.Client.Utilities.Server;
using XFEToolBox.Client.Views.Windows;

namespace XFEToolBox.Client.Views.Pages.Popups;

public partial class ChangePasswordPopupPage : Page, IPopupPage
{
    public PopupWindow? PopupWindow { get; set; }

    public ChangePasswordPopupPage()
    {
        InitializeComponent();
    }

    private void Page_Loaded(object sender, RoutedEventArgs e) =>
        Dispatcher.BeginInvoke(CurrentPasswordBox.Focus);

    private async void SubmitButton_Click(object sender, RoutedEventArgs e) => await ChangePasswordAsync();

    private async void ConfirmPasswordBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            e.Handled = true;
            await ChangePasswordAsync();
        }
    }

    private async Task ChangePasswordAsync()
    {
        if (!SubmitButton.IsEnabled)
            return;

        if (string.IsNullOrEmpty(CurrentPasswordBox.Password) || string.IsNullOrEmpty(NewPasswordBox.Password))
        {
            ShowError("请输入当前密码和新密码。");
            return;
        }

        if (NewPasswordBox.Password.Length < 8)
        {
            ShowError("新密码至少需要 8 位。");
            return;
        }

        if (NewPasswordBox.Password != ConfirmPasswordBox.Password)
        {
            ShowError("两次输入的新密码不一致。");
            return;
        }

        SubmitButton.IsEnabled = false;
        SubmitButton.Content = "正在修改…";
        StatusText.Foreground = new SolidColorBrush(Color.FromRgb(104, 104, 126));
        StatusText.Text = "正在验证并更新密码";

        var result = await ClientSession.ChangePasswordAsync(CurrentPasswordBox.Password, NewPasswordBox.Password);
        StatusText.Text = result.Message;
        StatusText.Foreground = new SolidColorBrush(result.Success
            ? Color.FromRgb(63, 145, 96)
            : Color.FromRgb(198, 83, 83));

        if (result.Success)
        {
            CurrentPasswordBox.Clear();
            NewPasswordBox.Clear();
            ConfirmPasswordBox.Clear();
            await Task.Delay(220);
            if (PopupWindow is not null)
                await PopupWindow.CloseWithResultAsync(MessageBoxResult.OK);
            return;
        }

        SubmitButton.IsEnabled = true;
        SubmitButton.Content = "确认修改";
        ShakeSurface();
    }

    private void ShowError(string message)
    {
        StatusText.Foreground = new SolidColorBrush(Color.FromRgb(198, 83, 83));
        StatusText.Text = message;
        ShakeSurface();
    }

    private void ShakeSurface()
    {
        if (PasswordSurface.RenderTransform is not TranslateTransform translation)
            return;

        var animation = new DoubleAnimationUsingKeyFrames { Duration = TimeSpan.FromMilliseconds(280) };
        animation.KeyFrames.Add(new EasingDoubleKeyFrame(0, KeyTime.FromPercent(0)));
        animation.KeyFrames.Add(new EasingDoubleKeyFrame(-7, KeyTime.FromPercent(0.2)));
        animation.KeyFrames.Add(new EasingDoubleKeyFrame(6, KeyTime.FromPercent(0.4)));
        animation.KeyFrames.Add(new EasingDoubleKeyFrame(-4, KeyTime.FromPercent(0.6)));
        animation.KeyFrames.Add(new EasingDoubleKeyFrame(2, KeyTime.FromPercent(0.8)));
        animation.KeyFrames.Add(new EasingDoubleKeyFrame(0, KeyTime.FromPercent(1)));
        translation.BeginAnimation(TranslateTransform.XProperty, animation);
    }
}