From c97619115b0918740c55d37f9ff16c48470f8f99 Mon Sep 17 00:00:00 2001 From: Richasy Date: Sun, 26 Jun 2022 17:55:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8A=A8=E6=80=81=E5=8F=8A?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=9D=A1=E7=9B=AE=E7=9A=84=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#1244)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommunityAdapter.cs | 6 ++-- src/App/Controls/User/UserSpaceView.xaml | 17 +++-------- .../UserItemViewModel.Properties.cs | 1 + .../UserItemViewModel/UserItemViewModel.cs | 10 ++++++- .../UserSpaceViewModel.Properties.cs | 13 ++++++++ .../UserSpaceViewModel/UserSpaceViewModel.cs | 30 +++++++++++++++++++ .../DynamicModuleViewModelBase.Properties.cs | 1 + .../DynamicModuleViewModelBase.cs | 4 ++- .../CommentDetailModuleViewModel.cs | 2 ++ .../Community/DynamicAllModuleViewModel.cs | 3 +- .../DynamicPageViewModel.cs | 5 +++- .../Community/DynamicVideoModuleViewModel.cs | 3 +- .../LivePlayerPageViewModel.Methods.cs | 6 ++++ .../PgcPlayerPageViewModel.Methods.cs | 6 ++++ .../VideoPlayerPageViewModel.Methods.cs | 7 ++++- 15 files changed, 92 insertions(+), 22 deletions(-) diff --git a/src/Adapter/Adapter.Implementation/CommunityAdapter.cs b/src/Adapter/Adapter.Implementation/CommunityAdapter.cs index 5b4d894cc..5d0d47c98 100644 --- a/src/Adapter/Adapter.Implementation/CommunityAdapter.cs +++ b/src/Adapter/Adapter.Implementation/CommunityAdapter.cs @@ -442,7 +442,7 @@ public MessageInformation ConvertToMessageInformation(LikeMessageItem messageIte messageItem.Item.Business); } - var publishTime = DateTimeOffset.FromUnixTimeSeconds(messageItem.LikeTime).ToLocalTime().DateTime; + var publishTime = DateTimeOffset.FromUnixTimeSeconds(messageItem.LikeTime).DateTime; var id = messageItem.Id.ToString(); var sourceContent = string.IsNullOrEmpty(messageItem.Item.Title) ? messageItem.Item.Description @@ -475,7 +475,7 @@ public MessageInformation ConvertToMessageInformation(AtMessageItem messageItem) var sourceContent = string.IsNullOrEmpty(messageItem.Item.Title) ? _resourceToolkit.GetLocaleString(Models.Enums.LanguageNames.NoSpecificData) : messageItem.Item.Title; - var publishTime = DateTimeOffset.FromUnixTimeSeconds(messageItem.AtTime).ToLocalTime().DateTime; + var publishTime = DateTimeOffset.FromUnixTimeSeconds(messageItem.AtTime).DateTime; var id = messageItem.Id.ToString(); var sourceId = messageItem.Item.Uri; @@ -507,7 +507,7 @@ public MessageInformation ConvertToMessageInformation(ReplyMessageItem messageIt var sourceContent = string.IsNullOrEmpty(messageItem.Item.Title) ? messageItem.Item.Description : messageItem.Item.Title; - var publishTime = DateTimeOffset.FromUnixTimeSeconds(messageItem.ReplyTime).ToLocalTime().DateTime; + var publishTime = DateTimeOffset.FromUnixTimeSeconds(messageItem.ReplyTime).DateTime; var id = messageItem.Id.ToString(); var sourceId = messageItem.Item.SubjectId.ToString(); var properties = new Dictionary() diff --git a/src/App/Controls/User/UserSpaceView.xaml b/src/App/Controls/User/UserSpaceView.xaml index ad7718885..c72f8c26b 100644 --- a/src/App/Controls/User/UserSpaceView.xaml +++ b/src/App/Controls/User/UserSpaceView.xaml @@ -101,22 +101,13 @@ Command="{x:Bind ViewModel.UserViewModel.ToggleRelationCommand}" Content="{x:Bind ViewModel.UserViewModel.Relation, Mode=OneWay, Converter={StaticResource RelationTextConverter}}" Visibility="{x:Bind ViewModel.IsMe, Mode=OneWay, Converter={StaticResource BoolToVisibilityReverseConverter}}" /> - + Command="{x:Bind ViewModel.FixedCommand}" + Content="{x:Bind ViewModel.IsFixed, Mode=OneWay, Converter={StaticResource FixedContentConverter}}" /> _isRelationChanging; diff --git a/src/ViewModels/ViewModels.Uwp/Account/UserItemViewModel/UserItemViewModel.cs b/src/ViewModels/ViewModels.Uwp/Account/UserItemViewModel/UserItemViewModel.cs index 0070894cc..a7a60e8d5 100644 --- a/src/ViewModels/ViewModels.Uwp/Account/UserItemViewModel/UserItemViewModel.cs +++ b/src/ViewModels/ViewModels.Uwp/Account/UserItemViewModel/UserItemViewModel.cs @@ -24,12 +24,14 @@ public UserItemViewModel( INumberToolkit numberToolkit, IAccountProvider accountProvider, IResourceToolkit resourceToolkit, - AppViewModel appViewModel) + AppViewModel appViewModel, + AccountViewModel accountViewModel) { _numberToolkit = numberToolkit; _accountProvider = accountProvider; _resourceToolkit = resourceToolkit; _appViewModel = appViewModel; + _accountViewModel = accountViewModel; ToggleRelationCommand = ReactiveCommand.CreateFromTask(ToggleRelationAsync, outputScheduler: RxApp.MainThreadScheduler); InitializeRelationCommand = ReactiveCommand.CreateFromTask(InitializeRelationAsync, outputScheduler: RxApp.MainThreadScheduler); @@ -88,6 +90,12 @@ public void SetProfile(UserProfile profile) private async Task ToggleRelationAsync() { + if (_accountViewModel.State != AuthorizeState.SignedIn) + { + _appViewModel.ShowTip(_resourceToolkit.GetLocaleString(LanguageNames.NeedLoginFirst), Models.Enums.App.InfoType.Warning); + return; + } + bool? isFollow = null; if (Relation == UserRelationStatus.Unfollow || Relation == UserRelationStatus.BeFollowed) { diff --git a/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.Properties.cs b/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.Properties.cs index 79722db2e..7d2b8a923 100644 --- a/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.Properties.cs +++ b/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.Properties.cs @@ -20,6 +20,8 @@ public sealed partial class UserSpaceViewModel private readonly IAccountProvider _accountProvider; private readonly IResourceToolkit _resourceToolkit; private readonly NavigationViewModel _navigationViewModel; + private readonly AccountViewModel _accountViewModel; + private readonly AppViewModel _appViewModel; private readonly ObservableAsPropertyHelper _isSearching; private readonly ObservableAsPropertyHelper _canSearch; private UserProfile _userProfile; @@ -52,6 +54,11 @@ public sealed partial class UserSpaceViewModel /// public ReactiveCommand GotoFollowsPageCommand { get; } + /// + /// 固定条目的命令. + /// + public ReactiveCommand FixedCommand { get; } + /// /// 搜索的视频结果. /// @@ -93,6 +100,12 @@ public sealed partial class UserSpaceViewModel [Reactive] public bool IsSearchVideoEmpty { get; set; } + /// + /// 该用户是否已经被固定在首页. + /// + [Reactive] + public bool IsFixed { get; set; } + /// /// 是否正在搜索. /// diff --git a/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.cs b/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.cs index b6d8a4c4c..11d8aa658 100644 --- a/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.cs +++ b/src/ViewModels/ViewModels.Uwp/Account/UserSpaceViewModel/UserSpaceViewModel.cs @@ -5,6 +5,7 @@ using System.Reactive.Linq; using System.Threading.Tasks; using Bili.Lib.Interfaces; +using Bili.Models.Data.Local; using Bili.Models.Data.User; using Bili.Models.Data.Video; using Bili.Toolkit.Interfaces; @@ -29,12 +30,16 @@ public UserSpaceViewModel( IAccountProvider accountProvider, IResourceToolkit resourceToolkit, NavigationViewModel navigationViewModel, + AccountViewModel accountViewModel, + AppViewModel appViewModel, CoreDispatcher dispatcher) : base(dispatcher) { _accountProvider = accountProvider; _resourceToolkit = resourceToolkit; _navigationViewModel = navigationViewModel; + _accountViewModel = accountViewModel; + _appViewModel = appViewModel; SearchVideos = new ObservableCollection(); @@ -46,6 +51,7 @@ public UserSpaceViewModel( SearchCommand = ReactiveCommand.CreateFromTask(SearchAsync, canSearch, RxApp.MainThreadScheduler); GotoFollowsPageCommand = ReactiveCommand.Create(GotoFollowsPage, outputScheduler: RxApp.MainThreadScheduler); GotoFansPageCommand = ReactiveCommand.Create(GotoFansPage, outputScheduler: RxApp.MainThreadScheduler); + FixedCommand = ReactiveCommand.Create(Fix, outputScheduler: RxApp.MainThreadScheduler); _isSearching = SearchCommand.IsExecuting.ToProperty(this, x => x.IsSearching, scheduler: RxApp.MainThreadScheduler); _canSearch = canSearch.ToProperty(this, x => x.CanSearch, scheduler: RxApp.MainThreadScheduler); @@ -183,5 +189,29 @@ private void GotoFollowsPage() _navigationViewModel.NavigateToSecondaryView(Models.Enums.PageIds.Follows, UserViewModel.User); } } + + private void Fix() + { + if (_accountViewModel.State != Models.Enums.AuthorizeState.SignedIn) + { + _appViewModel.ShowTip(_resourceToolkit.GetLocaleString(Models.Enums.LanguageNames.NeedLoginFirst), Models.Enums.App.InfoType.Warning); + return; + } + + if (IsFixed) + { + _accountViewModel.RemoveFixedItemCommand.Execute(UserViewModel.User.Id).Subscribe(); + IsFixed = false; + } + else + { + _accountViewModel.AddFixedItemCommand.Execute(new FixedItem( + UserViewModel.User.Avatar.Uri, + UserViewModel.User.Name, + UserViewModel.User.Id, + Models.Enums.App.FixedType.Publisher)).Subscribe(); + IsFixed = true; + } + } } } diff --git a/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.Properties.cs b/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.Properties.cs index 6234d3b79..c6502fe7d 100644 --- a/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.Properties.cs +++ b/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.Properties.cs @@ -14,6 +14,7 @@ public partial class DynamicModuleViewModelBase private readonly ICommunityProvider _communityProvider; private readonly IResourceToolkit _resourceToolkit; private readonly ISettingsToolkit _settingsToolkit; + private readonly IAuthorizeProvider _authorizeProvider; private readonly bool _isOnlyVideo; private bool _isEnd; diff --git a/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.cs b/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.cs index 732a30848..9adf5ab8d 100644 --- a/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.cs +++ b/src/ViewModels/ViewModels.Uwp/Base/DynamicModuleViewModelBase/DynamicModuleViewModelBase.cs @@ -22,6 +22,7 @@ internal DynamicModuleViewModelBase( ICommunityProvider communityProvider, IResourceToolkit resourceToolkit, ISettingsToolkit settingsToolkit, + IAuthorizeProvider authorizeProvider, bool isOnlyVideo, CoreDispatcher dispatcher) : base(dispatcher) @@ -29,6 +30,7 @@ internal DynamicModuleViewModelBase( _communityProvider = communityProvider; _resourceToolkit = resourceToolkit; _settingsToolkit = settingsToolkit; + _authorizeProvider = authorizeProvider; _isOnlyVideo = isOnlyVideo; } @@ -55,7 +57,7 @@ protected override string FormatException(string errorMsg) /// protected override async Task GetDataAsync() { - if (_isEnd) + if (_isEnd || _authorizeProvider.State != Models.Enums.AuthorizeState.SignedIn) { return; } diff --git a/src/ViewModels/ViewModels.Uwp/Community/CommentDetailModuleViewModel/CommentDetailModuleViewModel.cs b/src/ViewModels/ViewModels.Uwp/Community/CommentDetailModuleViewModel/CommentDetailModuleViewModel.cs index 78341a003..6fdb134c2 100644 --- a/src/ViewModels/ViewModels.Uwp/Community/CommentDetailModuleViewModel/CommentDetailModuleViewModel.cs +++ b/src/ViewModels/ViewModels.Uwp/Community/CommentDetailModuleViewModel/CommentDetailModuleViewModel.cs @@ -35,6 +35,8 @@ public CommentDetailModuleViewModel( SendCommentCommand = ReactiveCommand.CreateFromTask(SendCommentAsync, outputScheduler: RxApp.MainThreadScheduler); BackCommand = ReactiveCommand.Create(Back, outputScheduler: RxApp.MainThreadScheduler); + ResetSelectedCommentCommand = ReactiveCommand.Create(UnselectComment, outputScheduler: RxApp.MainThreadScheduler); + _isSending = SendCommentCommand.IsExecuting.ToProperty(this, x => x.IsSending, scheduler: RxApp.MainThreadScheduler); } diff --git a/src/ViewModels/ViewModels.Uwp/Community/DynamicAllModuleViewModel.cs b/src/ViewModels/ViewModels.Uwp/Community/DynamicAllModuleViewModel.cs index fbab0de03..7bd67531a 100644 --- a/src/ViewModels/ViewModels.Uwp/Community/DynamicAllModuleViewModel.cs +++ b/src/ViewModels/ViewModels.Uwp/Community/DynamicAllModuleViewModel.cs @@ -19,8 +19,9 @@ public DynamicAllModuleViewModel( ICommunityProvider communityProvider, IResourceToolkit resourceToolkit, ISettingsToolkit settingsToolkit, + IAuthorizeProvider authorizeProvider, CoreDispatcher dispatcher) - : base(communityProvider, resourceToolkit, settingsToolkit, false, dispatcher) + : base(communityProvider, resourceToolkit, settingsToolkit, authorizeProvider, false, dispatcher) { } } diff --git a/src/ViewModels/ViewModels.Uwp/Community/DynamicPageViewModel/DynamicPageViewModel.cs b/src/ViewModels/ViewModels.Uwp/Community/DynamicPageViewModel/DynamicPageViewModel.cs index 3b1268ab4..429ee8d10 100644 --- a/src/ViewModels/ViewModels.Uwp/Community/DynamicPageViewModel/DynamicPageViewModel.cs +++ b/src/ViewModels/ViewModels.Uwp/Community/DynamicPageViewModel/DynamicPageViewModel.cs @@ -67,6 +67,9 @@ private void SelectHeader(DynamicHeader header) } private void OnAuthorizeStateChanged(object sender, AuthorizeStateChangedEventArgs e) - => NeedSignIn = e.NewState != Models.Enums.AuthorizeState.SignedIn; + { + NeedSignIn = e.NewState != Models.Enums.AuthorizeState.SignedIn; + RefreshModuleCommand.Execute().Subscribe(); + } } } diff --git a/src/ViewModels/ViewModels.Uwp/Community/DynamicVideoModuleViewModel.cs b/src/ViewModels/ViewModels.Uwp/Community/DynamicVideoModuleViewModel.cs index e5a192f56..28b291eeb 100644 --- a/src/ViewModels/ViewModels.Uwp/Community/DynamicVideoModuleViewModel.cs +++ b/src/ViewModels/ViewModels.Uwp/Community/DynamicVideoModuleViewModel.cs @@ -19,8 +19,9 @@ public DynamicVideoModuleViewModel( ICommunityProvider communityProvider, IResourceToolkit resourceToolkit, ISettingsToolkit settingsToolkit, + IAuthorizeProvider authorizeProvider, CoreDispatcher dispatcher) - : base(communityProvider, resourceToolkit, settingsToolkit, true, dispatcher) + : base(communityProvider, resourceToolkit, settingsToolkit, authorizeProvider, true, dispatcher) { } } diff --git a/src/ViewModels/ViewModels.Uwp/Live/LivePlayerPageViewModel/LivePlayerPageViewModel.Methods.cs b/src/ViewModels/ViewModels.Uwp/Live/LivePlayerPageViewModel/LivePlayerPageViewModel.Methods.cs index 0a42c3451..a29f0040f 100644 --- a/src/ViewModels/ViewModels.Uwp/Live/LivePlayerPageViewModel/LivePlayerPageViewModel.Methods.cs +++ b/src/ViewModels/ViewModels.Uwp/Live/LivePlayerPageViewModel/LivePlayerPageViewModel.Methods.cs @@ -63,6 +63,12 @@ private void Share() private void Fix() { + if (_accountViewModel.State != AuthorizeState.SignedIn) + { + _appViewModel.ShowTip(_resourceToolkit.GetLocaleString(LanguageNames.NeedLoginFirst), Models.Enums.App.InfoType.Warning); + return; + } + if (IsLiveFixed) { _accountViewModel.RemoveFixedItemCommand.Execute(View.Information.Identifier.Id).Subscribe(); diff --git a/src/ViewModels/ViewModels.Uwp/Pgc/PgcPlayerPageViewModel/PgcPlayerPageViewModel.Methods.cs b/src/ViewModels/ViewModels.Uwp/Pgc/PgcPlayerPageViewModel/PgcPlayerPageViewModel.Methods.cs index 5a8635f20..42fdaa211 100644 --- a/src/ViewModels/ViewModels.Uwp/Pgc/PgcPlayerPageViewModel/PgcPlayerPageViewModel.Methods.cs +++ b/src/ViewModels/ViewModels.Uwp/Pgc/PgcPlayerPageViewModel/PgcPlayerPageViewModel.Methods.cs @@ -115,6 +115,12 @@ private void ShowSeasonDetail() private void Fix() { + if (_accountViewModel.State != AuthorizeState.SignedIn) + { + _appViewModel.ShowTip(_resourceToolkit.GetLocaleString(LanguageNames.NeedLoginFirst), Models.Enums.App.InfoType.Warning); + return; + } + if (IsVideoFixed) { _accountViewModel.RemoveFixedItemCommand.Execute(View.Information.Identifier.Id).Subscribe(); diff --git a/src/ViewModels/ViewModels.Uwp/Video/VideoPlayerPageViewModel/VideoPlayerPageViewModel.Methods.cs b/src/ViewModels/ViewModels.Uwp/Video/VideoPlayerPageViewModel/VideoPlayerPageViewModel.Methods.cs index 44a545e1e..206bc1f23 100644 --- a/src/ViewModels/ViewModels.Uwp/Video/VideoPlayerPageViewModel/VideoPlayerPageViewModel.Methods.cs +++ b/src/ViewModels/ViewModels.Uwp/Video/VideoPlayerPageViewModel/VideoPlayerPageViewModel.Methods.cs @@ -2,7 +2,6 @@ using System; using System.Linq; -using System.Threading.Tasks; using Bili.Models.App.Args; using Bili.Models.Data.Community; using Bili.Models.Data.Local; @@ -65,6 +64,12 @@ private void Share() private void Fix() { + if (_accountViewModel.State != AuthorizeState.SignedIn) + { + _appViewModel.ShowTip(_resourceToolkit.GetLocaleString(LanguageNames.NeedLoginFirst), Models.Enums.App.InfoType.Warning); + return; + } + if (IsVideoFixed) { _accountViewModel.RemoveFixedItemCommand.Execute(View.Information.Identifier.Id).Subscribe();