From ba4a7c1447146b40948ce2cc4e3a86d8917dcde8 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Sun, 29 Oct 2023 22:56:10 +0800 Subject: [PATCH] fix #903 --- .../Message/HutaoUserChangedMessage.cs | 8 +++++ .../Service/Hutao/HutaoUserOptions.cs | 35 ++++++++++++------- .../Service/Hutao/HutaoUserService.cs | 9 +---- .../ViewModel/GachaLog/HutaoCloudViewModel.cs | 9 ++++- .../Setting/HutaoPassportViewModel.cs | 10 ++---- 5 files changed, 42 insertions(+), 29 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Message/HutaoUserChangedMessage.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Message/HutaoUserChangedMessage.cs b/src/Snap.Hutao/Snap.Hutao/Message/HutaoUserChangedMessage.cs new file mode 100644 index 00000000..08084ad4 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Message/HutaoUserChangedMessage.cs @@ -0,0 +1,8 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Message; + +internal sealed class HutaoUserChangedMessage +{ +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs index e035b262..e56e4b81 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserOptions.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.Options; using Snap.Hutao.Web.Hutao; using System.Text.RegularExpressions; @@ -61,17 +62,25 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions public HutaoUserOptions Value { get => this; } - /// - /// 登录 - /// - /// 用户名 - /// 令牌 - public void LoginSucceed(string userName, string? token) + public async ValueTask PostLoginSucceedAsync(HomaPassportClient passportClient, ITaskContext taskContext, string username, string? token) { - UserName = userName; + await taskContext.SwitchToMainThreadAsync(); + UserName = username; this.token = token; IsLoggedIn = true; initializedTaskCompletionSource.TrySetResult(); + + await taskContext.SwitchToBackgroundAsync(); + Web.Response.Response userInfoResponse = await passportClient.GetUserInfoAsync(default).ConfigureAwait(false); + if (userInfoResponse.IsOk()) + { + await taskContext.SwitchToMainThreadAsync(); + UpdateUserInfo(userInfoResponse.Data); + Ioc.Default.GetRequiredService().Send(new Message.HutaoUserChangedMessage()); + return true; + } + + return false; } public void LogoutOrUnregister() @@ -109,6 +118,12 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions DateTimeOffset.Now; } + public async ValueTask GetTokenAsync() + { + await initializedTaskCompletionSource.Task.ConfigureAwait(false); + return token; + } + private void ClearUserInfo() { IsLicensedDeveloper = false; @@ -117,10 +132,4 @@ internal sealed class HutaoUserOptions : ObservableObject, IOptions GetTokenAsync() - { - await initializedTaskCompletionSource.Task.ConfigureAwait(false); - return token; - } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs index e6b8d46b..2fc444a0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Hutao/HutaoUserService.cs @@ -44,15 +44,8 @@ internal sealed partial class HutaoUserService : IHutaoUserService, IHutaoUserSe if (response.IsOk()) { - await taskContext.SwitchToMainThreadAsync(); - options.LoginSucceed(userName, response.Data); - - await taskContext.SwitchToBackgroundAsync(); - Web.Response.Response userInfoResponse = await passportClient.GetUserInfoAsync(token).ConfigureAwait(false); - if (userInfoResponse.IsOk()) + if (await options.PostLoginSucceedAsync(passportClient, taskContext, userName, response.Data).ConfigureAwait(false)) { - await taskContext.SwitchToMainThreadAsync(); - options.UpdateUserInfo(userInfoResponse.Data); isInitialized = true; } } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs index 89a250e2..fe2ee86a 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoCloudViewModel.cs @@ -1,9 +1,11 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using CommunityToolkit.Mvvm.Messaging; using Microsoft.UI.Xaml.Controls; using Snap.Hutao.Control.Extension; using Snap.Hutao.Factory.Abstraction; +using Snap.Hutao.Message; using Snap.Hutao.Model.Entity; using Snap.Hutao.Service.GachaLog; using Snap.Hutao.Service.Hutao; @@ -20,7 +22,7 @@ namespace Snap.Hutao.ViewModel.GachaLog; /// [ConstructorGenerated] [Injection(InjectAs.Scoped)] -internal sealed partial class HutaoCloudViewModel : Abstraction.ViewModel +internal sealed partial class HutaoCloudViewModel : Abstraction.ViewModel, IRecipient { private readonly INavigationService navigationService; private readonly IContentDialogFactory contentDialogFactory; @@ -47,6 +49,11 @@ internal sealed partial class HutaoCloudViewModel : Abstraction.ViewModel /// internal ICommand RetrieveCommand { get; set; } + public void Receive(HutaoUserChangedMessage message) + { + RefreshUidCollectionAsync().SafeForget(); + } + /// /// 异步获取祈愿记录 /// diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs index cfc00fbf..eb6bee68 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/HutaoPassportViewModel.cs @@ -58,9 +58,7 @@ internal sealed partial class HutaoPassportViewModel : Abstraction.ViewModel { SaveUserNameAndPassword(username, password); infoBarService.Information(response.Message); - - await taskContext.SwitchToMainThreadAsync(); - hutaoUserOptions.LoginSucceed(username, response.Data); + await hutaoUserOptions.PostLoginSucceedAsync(homaPassportClient, taskContext, username, response.Data).ConfigureAwait(false); } } } @@ -114,8 +112,7 @@ internal sealed partial class HutaoPassportViewModel : Abstraction.ViewModel SaveUserNameAndPassword(username, password); infoBarService.Information(response.Message); - await taskContext.SwitchToMainThreadAsync(); - hutaoUserOptions.LoginSucceed(username, response.Data); + await hutaoUserOptions.PostLoginSucceedAsync(homaPassportClient, taskContext, username, response.Data).ConfigureAwait(false); } } } @@ -148,8 +145,7 @@ internal sealed partial class HutaoPassportViewModel : Abstraction.ViewModel SaveUserNameAndPassword(username, password); infoBarService.Information(response.Message); - await taskContext.SwitchToMainThreadAsync(); - hutaoUserOptions.LoginSucceed(username, response.Data); + await hutaoUserOptions.PostLoginSucceedAsync(homaPassportClient, taskContext, username, response.Data).ConfigureAwait(false); } } }