From 2765a2e7445da2bf0175f995b0613432b4b54ccb Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Mon, 18 Sep 2023 11:19:25 +0800 Subject: [PATCH] impl #875 --- .../Control/Helper/InfoBarHelper.cs | 1 + src/Snap.Hutao/Snap.Hutao/Control/Loading.cs | 1 + .../Resource/Localization/SH.Designer.cs | 13 +++- .../Snap.Hutao/Resource/Localization/SH.resx | 3 + .../Resource/Navigation/Documentation.png | Bin 0 -> 9680 bytes .../Metadata/MetadataService.Constants.cs | 2 - .../Navigation/DocumentationProvider.cs | 46 ++++++++++++ .../Navigation/IDocumentationProvider.cs | 9 +++ .../Service/Navigation/INavigationService.cs | 7 +- .../Service/Navigation/NavigationService.cs | 2 + src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 2 + .../Snap.Hutao/View/Control/WebViewer.xaml.cs | 1 + src/Snap.Hutao/Snap.Hutao/View/UserView.xaml | 70 ++++++++++++------ .../Snap.Hutao/ViewModel/SettingViewModel.cs | 12 +-- .../ViewModel/User/UserViewModel.cs | 8 ++ 15 files changed, 142 insertions(+), 35 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Resource/Navigation/Documentation.png create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Navigation/DocumentationProvider.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Navigation/IDocumentationProvider.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Helper/InfoBarHelper.cs b/src/Snap.Hutao/Snap.Hutao/Control/Helper/InfoBarHelper.cs index 320b242d..8f69a804 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Helper/InfoBarHelper.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Helper/InfoBarHelper.cs @@ -6,6 +6,7 @@ using Microsoft.UI.Xaml.Controls; namespace Snap.Hutao.Control.Helper; +[SuppressMessage("", "SH001")] [DependencyProperty("IsTextSelectionEnabled", typeof(bool), false, IsAttached = true, AttachedType = typeof(InfoBar))] public sealed partial class InfoBarHelper { diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Loading.cs b/src/Snap.Hutao/Snap.Hutao/Control/Loading.cs index bb443a05..a2cdec3f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Loading.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Loading.cs @@ -11,6 +11,7 @@ internal class Loading : Microsoft.UI.Xaml.Controls.ContentControl { public static readonly DependencyProperty IsLoadingProperty = DependencyProperty.Register(nameof(IsLoading), typeof(bool), typeof(Loading), new PropertyMetadata(default(bool), IsLoadingPropertyChanged)); + [SuppressMessage("", "IDE0052")] private FrameworkElement? presenter; public Loading() diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index 047429df..a7077536 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -439,7 +439,7 @@ namespace Snap.Hutao.Resource.Localization { } /// - /// 查找类似 刷新于 {0:yyyy/MM/dd HH:mm:ss} 的本地化字符串。 + /// 查找类似 刷新于 {0:yyyy.MM.dd HH:mm:ss} 的本地化字符串。 /// internal static string ModelEntityDailyNoteRefreshTimeFormat { get { @@ -2041,7 +2041,7 @@ namespace Snap.Hutao.Resource.Localization { } /// - /// 查找类似 祈愿记录上传服务有效期至\n{0:yyyy-MM-dd HH:mm:ss} 的本地化字符串。 + /// 查找类似 祈愿记录上传服务有效期至\n{0:yyyy.MM.dd HH:mm:ss} 的本地化字符串。 /// internal static string ServiceHutaoUserGachaLogExpiredAt { get { @@ -6486,6 +6486,15 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 文档 的本地化字符串。 + /// + internal static string ViewUserDocumentationHeader { + get { + return ResourceManager.GetString("ViewUserDocumentationHeader", resourceCulture); + } + } + /// /// 查找类似 刷新 CookieToken 成功 的本地化字符串。 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index ee5fff22..8adf9b18 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -2315,6 +2315,9 @@ 请先登录 + + 文档 + 刷新 CookieToken 成功 diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Navigation/Documentation.png b/src/Snap.Hutao/Snap.Hutao/Resource/Navigation/Documentation.png new file mode 100644 index 0000000000000000000000000000000000000000..6668b50dcce16b8960f72b46ef02893c3e25cb2f GIT binary patch literal 9680 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 S(Gx2G0000 internal partial class MetadataService { -#pragma warning disable CA1823 private const string FileNameAchievement = "Achievement"; private const string FileNameAchievementGoal = "AchievementGoal"; private const string FileNameAvatar = "Avatar"; @@ -31,5 +30,4 @@ internal partial class MetadataService private const string FileNameWeapon = "Weapon"; private const string FileNameWeaponCurve = "WeaponCurve"; private const string FileNameWeaponPromote = "WeaponPromote"; -#pragma warning restore } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/DocumentationProvider.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/DocumentationProvider.cs new file mode 100644 index 00000000..4d029580 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/DocumentationProvider.cs @@ -0,0 +1,46 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.View.Page; + +namespace Snap.Hutao.Service.Navigation; + +[Injection(InjectAs.Singleton, typeof(IDocumentationProvider))] +[ConstructorGenerated] +internal sealed partial class DocumentationProvider : IDocumentationProvider +{ + private const string Home = "https://hut.ao"; + + private static readonly Dictionary TypeDocumentations = new() + { + [typeof(AchievementPage)] = "https://hut.ao/features/achievements.html", + [typeof(AnnouncementPage)] = "https://hut.ao/features/dashboard.html", + [typeof(AvatarPropertyPage)] = "https://hut.ao/features/character-data.html", + [typeof(CultivationPage)] = "https://hut.ao/features/develop-plan.html", + [typeof(DailyNotePage)] = "https://hut.ao/features/real-time-notes.html", + [typeof(GachaLogPage)] = "https://hut.ao/features/wish-export.html", + [typeof(HutaoDatabasePage)] = "https://hut.ao/features/hutao-API.html", + [typeof(HutaoPassportPage)] = "https://hut.ao/zh/features/hutao-settings.html#%E8%83%A1%E6%A1%83%E5%B8%90%E5%8F%B7", + [typeof(LaunchGamePage)] = "https://hut.ao/features/game-launcher.html", + [typeof(LoginHoyoverseUserPage)] = "https://hut.ao/features/mhy-account-switch.html", + [typeof(LoginMihoyoUserPage)] = "https://hut.ao/features/mhy-account-switch.html", + [typeof(SettingPage)] = "https://hut.ao/features/hutao-settings.html", + [typeof(SpiralAbyssRecordPage)] = "https://hut.ao/features/dashboard.html", + [typeof(TestPage)] = Home, + [typeof(WikiAvatarPage)] = "https://hut.ao/features/character-wiki.html", + [typeof(WikiMonsterPage)] = "https://hut.ao/features/monster-wiki.html", + [typeof(WikiWeaponPage)] = "https://hut.ao/features/weapon-wiki.html", + }; + + private readonly INavigationService navigationService; + + public string GetDocumentation() + { + if (navigationService.Current is { } type) + { + return TypeDocumentations[type]; + } + + return Home; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/IDocumentationProvider.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/IDocumentationProvider.cs new file mode 100644 index 00000000..b5f2962f --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/IDocumentationProvider.cs @@ -0,0 +1,9 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Service.Navigation; + +internal interface IDocumentationProvider +{ + string GetDocumentation(); +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationService.cs index a098a5f3..b8e328e6 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/INavigationService.cs @@ -10,7 +10,7 @@ namespace Snap.Hutao.Service.Navigation; /// 导航服务 /// [HighQuality] -internal interface INavigationService : ICastService +internal interface INavigationService : ICastService, INavigationCurrent { /// /// 导航到指定类型的页面 @@ -48,3 +48,8 @@ internal interface INavigationService : ICastService /// void GoBack(); } + +internal interface INavigationCurrent +{ + Type? Current { get; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs index b2218f00..0d8f10dc 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Navigation/NavigationService.cs @@ -43,6 +43,8 @@ internal sealed class NavigationService : INavigationService, INavigationInitial paneClosedEventHandler = OnPaneStateChanged; } + public Type? Current { get => frame?.Content.GetType(); } + private NavigationView? NavigationView { get => navigationView; diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index adef38fd..03b93d4b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -96,6 +96,7 @@ + @@ -224,6 +225,7 @@ + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/WebViewer.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Control/WebViewer.xaml.cs index bdf8dcb7..6120b457 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/WebViewer.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/WebViewer.xaml.cs @@ -20,6 +20,7 @@ internal partial class WebViewer : UserControl, IRecipient private readonly RoutedEventHandler loadEventHandler; private readonly RoutedEventHandler unloadEventHandler; + [SuppressMessage("", "IDE0052")] private MiHoYoJSInterface? jsInterface; private bool isFirstNavigate = true; diff --git a/src/Snap.Hutao/Snap.Hutao/View/UserView.xaml b/src/Snap.Hutao/Snap.Hutao/View/UserView.xaml index bc7fdbf7..e867c237 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/UserView.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/UserView.xaml @@ -16,31 +16,52 @@ - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs index b49ab13e..a937c793 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs @@ -111,6 +111,12 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel AppInstance.Restart(string.Empty); } + [Command("StoreReviewCommand")] + private static async Task StoreReviewAsync() + { + await Launcher.LaunchUriAsync(new("ms-windows-store://review/?ProductId=9PH4NXJ2JN52")); + } + [Command("SetGamePathCommand")] private async Task SetGamePathAsync() { @@ -183,12 +189,6 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel } } - [Command("StoreReviewCommand")] - private async Task StoreReviewAsync() - { - await Launcher.LaunchUriAsync(new("ms-windows-store://review/?ProductId=9PH4NXJ2JN52")); - } - [Command("SetDataFolderCommand")] private async Task SetDataFolderAsync() { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs index 25c508b9..f38f4a7c 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs @@ -14,6 +14,7 @@ using Snap.Hutao.View.Page; using Snap.Hutao.Web.Hoyolab; using System.Collections.ObjectModel; using System.Text; +using Windows.System; namespace Snap.Hutao.ViewModel.User; @@ -25,6 +26,7 @@ namespace Snap.Hutao.ViewModel.User; [Injection(InjectAs.Singleton)] internal sealed partial class UserViewModel : ObservableObject { + private readonly IDocumentationProvider documentationProvider; private readonly INavigationService navigationService; private readonly IServiceProvider serviceProvider; private readonly IInfoBarService infoBarService; @@ -248,4 +250,10 @@ internal sealed partial class UserViewModel : ObservableObject } } } + + [Command("OpenDocumentationCommand")] + private async Task OpenDocumentationAsync() + { + await Launcher.LaunchUriAsync(new(documentationProvider.GetDocumentation())); + } } \ No newline at end of file