diff --git a/src/ClaudeClothes.Web/Pages/ClothingItemDetails.razor b/src/ClaudeClothes.Web/Pages/ClothingItemDetails.razor index 9eb4981..3c212c0 100644 --- a/src/ClaudeClothes.Web/Pages/ClothingItemDetails.razor +++ b/src/ClaudeClothes.Web/Pages/ClothingItemDetails.razor @@ -1,6 +1,7 @@ @page "/item/{id:int}" @using ClaudeClothes.Core.Models @using ClaudeClothes.Core.Interfaces +@using Microsoft.AspNetCore.Components.Web @inject IReviewService ReviewService @inject IClothingItemService ClothingItemService @inject NavigationManager Navigation @@ -8,6 +9,9 @@ @(clothingItem?.Name ?? "Dettagli Capo") - ClaudeClothes + + + @if (clothingItem == null) {
@@ -97,7 +101,7 @@ else @totalReviews
- @if (!reviews.Any()) + @if (pagedReviews == null || !pagedReviews.Items.Any()) {
@@ -108,7 +112,7 @@ else else {
- @foreach (var review in reviews) + @foreach (var review in pagedReviews.Items) {
@@ -139,6 +143,36 @@ else }
} + + @if (pagedReviews != null && pagedReviews.TotalPages > 1) + { + + }
@@ -240,6 +274,35 @@ else } @@ -988,33 +1063,106 @@ else [Parameter] public int Id { get; set; } + [SupplyParameterFromQuery(Name = "reviewPage")] + public int? ReviewPage { get; set; } + private ClothingItem? clothingItem; - private List reviews = new(); + private PagedResult? pagedReviews; private Review newReview = new(); private string successMessage = string.Empty; private bool isSubmitting = false; private string errorMessage = string.Empty; - private int totalReviews => reviews.Count; + private int currentReviewPage = 1; + private const int ReviewPageSize = 5; + + private int totalReviews => pagedReviews?.TotalCount ?? 0; protected override async Task OnInitializedAsync() { - await LoadData(); - } + if (ReviewPage.HasValue && ReviewPage.Value > 0) + { + currentReviewPage = ReviewPage.Value; + } - private async Task LoadData() - { - clothingItem = await ClothingItemService.GetByIdAsync(Id); + await LoadClothingItem(); + await LoadReviews(); if (clothingItem != null) { - await LoadReviews(); newReview = new Review { ClothingItemId = Id }; } } + protected override async Task OnParametersSetAsync() + { + if (ReviewPage.HasValue && ReviewPage.Value > 0 && ReviewPage.Value != currentReviewPage) + { + currentReviewPage = ReviewPage.Value; + await LoadReviews(); + } + } + + private async Task LoadClothingItem() + { + clothingItem = await ClothingItemService.GetByIdAsync(Id); + } + private async Task LoadReviews() { - reviews = (await ReviewService.GetReviewsAsync(Id)).ToList(); + pagedReviews = await ReviewService.GetReviewsPagedAsync(Id, currentReviewPage, ReviewPageSize); + } + + private async Task ChangeReviewPage(int newPage) + { + if (pagedReviews == null) + { + return; + } + + if (newPage < 1 || newPage > pagedReviews.TotalPages || newPage == currentReviewPage) + { + return; + } + + currentReviewPage = newPage; + Navigation.NavigateTo($"/item/{Id}?reviewPage={currentReviewPage}"); + await LoadReviews(); + } + + private async Task HandleReviewPageKeyDown(KeyboardEventArgs e) + { + if (pagedReviews == null) + { + return; + } + + switch (e.Key) + { + case "ArrowLeft": + if (pagedReviews.HasPreviousPage) + { + await ChangeReviewPage(currentReviewPage - 1); + } + break; + case "ArrowRight": + if (pagedReviews.HasNextPage) + { + await ChangeReviewPage(currentReviewPage + 1); + } + break; + case "Home": + if (currentReviewPage != 1) + { + await ChangeReviewPage(1); + } + break; + case "End": + if (currentReviewPage != pagedReviews.TotalPages) + { + await ChangeReviewPage(pagedReviews.TotalPages); + } + break; + } } private async Task HandleSubmit() @@ -1036,8 +1184,9 @@ else errorMessage = string.Empty; StateHasChanged(); // force the render to see the feedback message - // Ricarica i dati del capo - await LoadData(); + // Reload clothing item to update average rating, then reload current review page + await LoadClothingItem(); + await LoadReviews(); newReview = new Review { ClothingItemId = Id };