This commit is contained in:
2025-10-27 17:39:18 -04:00
commit 31f723bea4
1579 changed files with 642409 additions and 0 deletions

View File

@@ -0,0 +1,197 @@
using Microsoft.AspNetCore.Components;
using Prefab.Web.Client.Models.Catalog;
using Prefab.Web.Client.Models.Home;
using Prefab.Web.Client.Services;
using Prefab.Web.Client.ViewModels.Catalog;
namespace Prefab.Web.Client.Pages;
public class HomeComponent : ResultComponentBase<HomePageModel>
{
private const int CategorySkeletonSlots = 4;
private readonly List<ProductCardModel> _featuredProducts = [];
private readonly List<CategoryCardModel> _latestCategories = [];
[Inject]
protected IHomePageService HomePageService { get; set; } = null!;
public IEnumerable<Slide> Slides => new List<Slide>
{
new()
{
Number = 1,
Text = "Take on more work, without adding more people.",
TextWidth = "full",
TextPosition = "top-right"
},
new()
{
Number = 4,
Text = "Real-time visibility to your assemblies.",
TextWidth = "half",
TextPosition = "center-right"
},
new()
{
Number = 2,
Text = "Explore, configure, order, install.",
TextWidth = "full",
TextPosition = "top-left"
}
};
protected IReadOnlyList<ProductCardModel> FeaturedProducts => _featuredProducts;
protected bool IsFeaturedProductsLoading { get; private set; } = true;
protected bool FeaturedProductsHaveItemsToShow => _featuredProducts.Count > 0;
protected int NumberOfFeaturedProductCardsPerGroup { get; private set; } = 4;
protected IReadOnlyList<CategoryCardModel> LatestCategories => _latestCategories;
protected bool AreCategoriesLoading { get; private set; } = true;
protected bool CategoriesHaveItemsToShow => _latestCategories.Count > 0;
protected int NumberOfCategorySkeletons => CategorySkeletonSlots;
protected override async Task OnInitializedAsync()
{
await LoadHomeContentAsync();
}
protected IReadOnlyList<IReadOnlyList<ProductCardModel>> GetProductCardGroups()
{
if (!FeaturedProductsHaveItemsToShow)
{
return Array.Empty<IReadOnlyList<ProductCardModel>>();
}
var groupSize = Math.Max(1, NumberOfFeaturedProductCardsPerGroup);
var groups = new List<IReadOnlyList<ProductCardModel>>();
for (var index = 0; index < _featuredProducts.Count; index += groupSize)
{
var segment = _featuredProducts
.Skip(index)
.Take(groupSize)
.ToList();
if (segment.Count > 0)
{
groups.Add(segment);
}
}
return groups;
}
protected string CalculateWidthOfFeaturedProductCard()
{
var groupSize = Math.Max(1, NumberOfFeaturedProductCardsPerGroup);
var width = 100d / groupSize;
return $"width: {width:0.##}%; padding: 0 10px; box-sizing: border-box;";
}
#region Media Query Handlers
protected void OnExtraSmallChange(bool matches)
{
if (!matches)
{
return;
}
NumberOfFeaturedProductCardsPerGroup = 1;
StateHasChanged();
}
protected void OnSmallChange(bool matches)
{
if (!matches)
{
return;
}
NumberOfFeaturedProductCardsPerGroup = 2;
StateHasChanged();
}
protected void OnMediumChange(bool matches)
{
if (!matches)
{
return;
}
NumberOfFeaturedProductCardsPerGroup = 2;
StateHasChanged();
}
protected void OnLargeChange(bool matches)
{
if (!matches)
{
return;
}
NumberOfFeaturedProductCardsPerGroup = 3;
StateHasChanged();
}
protected void OnExtraLargeChange(bool matches)
{
if (!matches)
{
return;
}
NumberOfFeaturedProductCardsPerGroup = 4;
StateHasChanged();
}
#endregion
private async Task LoadHomeContentAsync()
{
IsFeaturedProductsLoading = true;
AreCategoriesLoading = true;
_featuredProducts.Clear();
_latestCategories.Clear();
try
{
var result = await Execute(HomePageService.Get, CancellationToken.None);
if (result.IsSuccess && result.Value is { } payload)
{
if (payload.FeaturedProducts.Count > 0)
{
_featuredProducts.AddRange(payload.FeaturedProducts);
}
if (payload.LatestCategories.Count > 0)
{
_latestCategories.AddRange(payload.LatestCategories);
}
}
}
finally
{
IsFeaturedProductsLoading = false;
AreCategoriesLoading = false;
}
}
public class Slide
{
public int Number { get; set; }
public string Text { get; set; } = string.Empty;
public string TextWidth { get; set; } = string.Empty;
public string TextPosition { get; set; } = string.Empty;
public string AltText { get; set; } = string.Empty;
public string GoToUrl { get; set; } = string.Empty;
}
}