From 2f6eb335180b8be4be5facfdcba1622b75843725 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Wed, 30 Oct 2024 23:28:47 +0100 Subject: [PATCH] add header in profile page --- .../Accounts/AccountResponse.cs | 12 ++++ .../AccountsControllerService.cs | 6 ++ WatchIt.Website/WatchIt.Website/App.razor | 2 +- .../Panels/ItemPageHeaderPanelComponent.razor | 2 +- .../ItemPageHeaderPanelComponent.razor.css | 4 -- .../AccountPictureComponent.razor | 1 + .../AccountPictureComponent.razor.cs | 58 +++++++++++++++++++ .../DatabasePageComponent.razor.cs | 1 - .../Panels/UserPageHeaderPanelComponent.razor | 30 ++++++++++ .../UserPageHeaderPanelComponent.razor.cs | 50 ++++++++++++++++ .../UserPageHeaderPanelComponent.razor.css | 9 +++ .../WatchIt.Website/Layout/MainLayout.razor | 6 +- .../Layout/MainLayout.razor.cs | 18 +----- .../WatchIt.Website/Pages/MediaPage.razor | 2 +- .../WatchIt.Website/Pages/PersonPage.razor | 2 +- .../WatchIt.Website/Pages/UserPage.razor | 37 +++++++++++- .../WatchIt.Website/wwwroot/css/gaps.css | 4 ++ 17 files changed, 213 insertions(+), 31 deletions(-) create mode 100644 WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor create mode 100644 WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor.cs create mode 100644 WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.css diff --git a/WatchIt.Common/WatchIt.Common.Model/Accounts/AccountResponse.cs b/WatchIt.Common/WatchIt.Common.Model/Accounts/AccountResponse.cs index a87d407..fb3bc77 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Accounts/AccountResponse.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Accounts/AccountResponse.cs @@ -14,6 +14,15 @@ public class AccountResponse : Account [JsonPropertyName("gender")] public GenderResponse? Gender { get; set; } + [JsonPropertyName("last_active")] + public DateTime LastActive { get; set; } + + [JsonPropertyName("creation_date")] + public DateTime CreationDate { get; set; } + + [JsonPropertyName("is_admin")] + public bool IsAdmin { get; set; } + #endregion @@ -31,6 +40,9 @@ public class AccountResponse : Account Email = account.Email; Description = account.Description; Gender = account.Gender is not null ? new GenderResponse(account.Gender) : null; + LastActive = account.LastActive; + CreationDate = account.CreationDate; + IsAdmin = account.IsAdmin; } #endregion diff --git a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Accounts/AccountsControllerService.cs b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Accounts/AccountsControllerService.cs index df37957..af69597 100644 --- a/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Accounts/AccountsControllerService.cs +++ b/WatchIt.WebAPI/WatchIt.WebAPI.Services/WatchIt.WebAPI.Services.Controllers/WatchIt.WebAPI.Services.Controllers.Accounts/AccountsControllerService.cs @@ -62,6 +62,9 @@ public class AccountsControllerService( RefreshToken = await refreshTokenTask, }; + account.LastActive = DateTime.UtcNow; + await database.SaveChangesAsync(); + logger.LogInformation($"Account with ID {account.Id} was authenticated"); return RequestResult.Ok(response); } @@ -91,6 +94,9 @@ public class AccountsControllerService( string accessToken = await tokensService.CreateAccessTokenAsync(token.Account); + token.Account.LastActive = DateTime.UtcNow; + await database.SaveChangesAsync(); + logger.LogInformation($"Account with ID {token.AccountId} was authenticated by token refreshing"); return RequestResult.Ok(new AuthenticateResponse { diff --git a/WatchIt.Website/WatchIt.Website/App.razor b/WatchIt.Website/WatchIt.Website/App.razor index e5cba46..502723d 100644 --- a/WatchIt.Website/WatchIt.Website/App.razor +++ b/WatchIt.Website/WatchIt.Website/App.razor @@ -13,7 +13,7 @@ - + diff --git a/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor b/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor index 689936a..12bbc20 100644 --- a/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor @@ -1,4 +1,4 @@ -
+
diff --git a/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor.css index 8d33a8c..5baade5 100644 --- a/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor.css +++ b/WatchIt.Website/WatchIt.Website/Components/Common/Panels/ItemPageHeaderPanelComponent.razor.css @@ -1,9 +1,5 @@ /* CLASSES */ -.mt-grid { - margin-top: 9rem !important; -} - .title-shadow { text-shadow: 2px 2px 2px #000; } diff --git a/WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor b/WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor new file mode 100644 index 0000000..ee75eef --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor @@ -0,0 +1 @@ +avatar \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor.cs new file mode 100644 index 0000000..21e0402 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/Common/Subcomponents/AccountPictureComponent.razor.cs @@ -0,0 +1,58 @@ +using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Accounts; +using WatchIt.Website.Services.Client.Accounts; + +namespace WatchIt.Website.Components.Common.Subcomponents; + +public partial class AccountPictureComponent : ComponentBase +{ + #region SERVICES + + [Inject] private IAccountsClientService AccountsClientService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required long Id { get; set; } + [Parameter] public required int Size { get; set; } + + [Parameter] public string Class { get; set; } = string.Empty; + + #endregion + + + + #region FIELDS + + private AccountProfilePictureResponse? _picture; + + #endregion + + + + #region PRIVATE METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + endTasks.AddRange( + [ + AccountsClientService.GetAccountProfilePicture(Id, data => _picture = data) + ]); + + // END + await Task.WhenAll(endTasks); + + StateHasChanged(); + } + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/Pages/DatabasePage/DatabasePageComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/Pages/DatabasePage/DatabasePageComponent.razor.cs index 6d07ab9..85791ad 100644 --- a/WatchIt.Website/WatchIt.Website/Components/Pages/DatabasePage/DatabasePageComponent.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Components/Pages/DatabasePage/DatabasePageComponent.razor.cs @@ -33,7 +33,6 @@ public partial class DatabasePageComponent : ComponentBase where [Parameter] public Func? PutRatingMethod { get; set; } [Parameter] public Func? DeleteRatingMethod { get; set; } [Parameter] public required string PosterPlaceholder { get; set; } - #endregion diff --git a/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor b/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor index e69de29..86e41f1 100644 --- a/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor @@ -0,0 +1,30 @@ +
+ +
+
+
+
+

@(AccountData.Username)

+
+ @if (!string.IsNullOrWhiteSpace(AccountData.Description)) + { + + @(AccountData.Description) + + } + +
+
+
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.cs index 6df479a..acaaa99 100644 --- a/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.cs @@ -1,7 +1,57 @@ using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Accounts; +using WatchIt.Website.Services.Authentication; +using WatchIt.Website.Services.Client.Accounts; namespace WatchIt.Website.Components.Pages.UserPage.Panels; public partial class UserPageHeaderPanelComponent : ComponentBase { + #region SERVICES + + [Inject] private IAuthenticationService AuthenticationService { get; set; } = default!; + [Inject] private IAccountsClientService AccountsClientService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required AccountResponse AccountData { get; set; } + + #endregion + + + + #region FIELDS + + private AccountProfilePictureResponse? _accountProfilePicture; + + #endregion + + + + #region PRIVATE METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + endTasks.AddRange( + [ + AccountsClientService.GetAccountProfilePicture(AccountData.Id, data => _accountProfilePicture = data), + ]); + + // END + await Task.WhenAll(endTasks); + + StateHasChanged(); + } + } + + #endregion } \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.css new file mode 100644 index 0000000..1fcbf05 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/Pages/UserPage/Panels/UserPageHeaderPanelComponent.razor.css @@ -0,0 +1,9 @@ +/* IDS */ + +#base { + margin-top: 120px; +} + +#space { + height: 100px; +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor b/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor index c9b5833..ac67a74 100644 --- a/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor +++ b/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor @@ -53,14 +53,14 @@ else { - - + Your profile @if (_user.IsAdmin) { diff --git a/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor.cs b/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor.cs index 1f2f80b..10a09d8 100644 --- a/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Layout/MainLayout.razor.cs @@ -18,7 +18,6 @@ public partial class MainLayout : LayoutComponentBase [Inject] public NavigationManager NavigationManager { get; set; } = default!; [Inject] public ITokensService TokensService { get; set; } = default!; [Inject] public IAuthenticationService AuthenticationService { get; set; } = default!; - [Inject] public IAccountsClientService AccountsClientService { get; set; } = default!; [Inject] public IMediaClientService MediaClientService { get; set; } = default!; [Inject] public IPhotosClientService PhotosClientService { get; set; } = default!; @@ -32,7 +31,6 @@ public partial class MainLayout : LayoutComponentBase private User? _user; private PhotoResponse? _defaultBackgroundPhoto; - private AccountProfilePictureResponse? _userProfilePicture; private bool _searchbarVisible; private string _searchbarText = string.Empty; @@ -67,28 +65,14 @@ public partial class MainLayout : LayoutComponentBase if (firstRender) { List endTasks = new List(); - List step1Tasks = new List(); // STEP 0 - step1Tasks.AddRange( - [ - Task.Run(async () => _user = await AuthenticationService.GetUserAsync()) - ]); endTasks.AddRange( [ + Task.Run(async () => _user = await AuthenticationService.GetUserAsync()), PhotosClientService.GetPhotoRandomBackground(data => _defaultBackgroundPhoto = data) ]); - // STEP 1 - await Task.WhenAll(step1Tasks); - if (_user is not null) - { - endTasks.AddRange( - [ - AccountsClientService.GetAccountProfilePicture(_user.Id, data => _userProfilePicture = data) - ]); - } - // END await Task.WhenAll(endTasks); diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor index 34d068c..87b0359 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaPage.razor @@ -169,7 +169,7 @@ else + Class="panel panel-menu panel-background-menu justify-content-center"> Actors Creators diff --git a/WatchIt.Website/WatchIt.Website/Pages/PersonPage.razor b/WatchIt.Website/WatchIt.Website/Pages/PersonPage.razor index c98324f..bbd303c 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/PersonPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/PersonPage.razor @@ -44,7 +44,7 @@ + Class="panel panel-menu panel-background-menu justify-content-center"> Actor Creator diff --git a/WatchIt.Website/WatchIt.Website/Pages/UserPage.razor b/WatchIt.Website/WatchIt.Website/Pages/UserPage.razor index 1bbe594..430ada9 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/UserPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/UserPage.razor @@ -40,9 +40,42 @@ } else { -
+
- + +
+
+
+
+ + + Summary + Movies + TV Series + People + Roles + + + + + + + + + + + + + + + + + + +
} diff --git a/WatchIt.Website/WatchIt.Website/wwwroot/css/gaps.css b/WatchIt.Website/WatchIt.Website/wwwroot/css/gaps.css index 3b45259..a89f191 100644 --- a/WatchIt.Website/WatchIt.Website/wwwroot/css/gaps.css +++ b/WatchIt.Website/WatchIt.Website/wwwroot/css/gaps.css @@ -1,5 +1,9 @@ /* DEFAULT */ +.mt-header { + margin-top: 9rem !important; +} + .mt-default { margin-top: 1rem !important; }