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
+
+Salta alla navigazione delle recensioni
+
@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)
{
}
+
+ @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 };