feat: full FrontOffice updates - discount store, blog, payment gateway, UI improvements
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 4m55s
Build and Deploy to Kubernetes / build-and-deploy (push) Failing after 4m55s
- Discount store pages (products, cart, orders, order detail) - Blog pages and services - Payment gateway callback page - AppImage component, EmptyState, LoadingState, PageHeader - DiscountCartService, DiscountOrderService, DiscountProductService - BlogCategoryService, BlogPostService, SitePageService, ImageCacheService - PhoneVerifyForm component - Profile Hub page - UI/UX improvements across all pages - landing.js for homepage - Config and routing updates
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
@attribute [Route(RouteConstants.Gateway.CartChooser)]
|
||||
|
||||
<PageTitle>سبد خرید</PageTitle>
|
||||
|
||||
<MudContainer MaxWidth="MaxWidth.Medium" Class="py-6 py-md-10">
|
||||
<PageHeader Title="سبد خرید" BackHref="@RouteConstants.Profile.Index" />
|
||||
<MudStack AlignItems="AlignItems.Center" Spacing="4">
|
||||
<MudIcon Icon="@Icons.Material.Filled.ShoppingCart" Size="Size.Large" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.body1" Align="Align.Center" Class="mud-text-secondary">
|
||||
سبد خرید کدام فروشگاه را میخواهید مشاهده کنید؟
|
||||
</MudText>
|
||||
|
||||
<MudGrid Spacing="4" Justify="Justify.Center" Class="mt-4">
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudLink Href="@RouteConstants.Store.Cart" Underline="Underline.None" Class="store-chooser-link">
|
||||
<MudPaper Elevation="2" Class="pa-6 rounded-xl text-center store-chooser-card store-chooser-regular">
|
||||
<MudAvatar Size="Size.Large" Class="mx-auto mb-3 gateway-avatar-sm-store">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Storefront" Size="Size.Large" Class="text-brand-store" />
|
||||
</MudAvatar>
|
||||
<MudText Typo="Typo.h6" Class="fw-semibold">سبد خرید فروشگاه</MudText>
|
||||
@if (_cartCount > 0)
|
||||
{
|
||||
<MudChip T="string" Color="Color.Success" Variant="Variant.Filled" Size="Size.Small" Class="mt-2">
|
||||
@_cartCount محصول
|
||||
</MudChip>
|
||||
}
|
||||
else
|
||||
{
|
||||
<MudText Typo="Typo.caption" Class="mud-text-secondary mt-1">سبد خالی</MudText>
|
||||
}
|
||||
</MudPaper>
|
||||
</MudLink>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudLink Href="@RouteConstants.DiscountStore.Cart" Underline="Underline.None" Class="store-chooser-link">
|
||||
<MudPaper Elevation="2" Class="pa-6 rounded-xl text-center store-chooser-card store-chooser-discount">
|
||||
<MudAvatar Size="Size.Large" Class="mx-auto mb-3 gateway-avatar-sm-discount">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Loyalty" Size="Size.Large" Class="text-brand-discount" />
|
||||
</MudAvatar>
|
||||
<MudText Typo="Typo.h6" Class="fw-semibold">سبد خرید تخفیفی</MudText>
|
||||
@if (_discountCartCount > 0)
|
||||
{
|
||||
<MudChip T="string" Color="Color.Error" Variant="Variant.Filled" Size="Size.Small" Class="mt-2">
|
||||
@_discountCartCount محصول
|
||||
</MudChip>
|
||||
}
|
||||
else
|
||||
{
|
||||
<MudText Typo="Typo.caption" Class="mud-text-secondary mt-1">سبد خالی</MudText>
|
||||
}
|
||||
</MudPaper>
|
||||
</MudLink>
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
|
||||
<MudButton Variant="Variant.Text" StartIcon="@Icons.Material.Filled.ArrowBack"
|
||||
OnClick="GoBack" Class="mt-4">
|
||||
بازگشت به داشبورد
|
||||
</MudButton>
|
||||
</MudStack>
|
||||
</MudContainer>
|
||||
@@ -0,0 +1,47 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using FrontOffice.Main.Utilities;
|
||||
|
||||
namespace FrontOffice.Main.Pages.Gateway;
|
||||
|
||||
public partial class CartChooser : IDisposable
|
||||
{
|
||||
[Inject] private CartService CartService { get; set; } = default!;
|
||||
[Inject] private DiscountCartService DiscountCartService { get; set; } = default!;
|
||||
[Inject] private IJSRuntime JS { get; set; } = default!;
|
||||
|
||||
private int _cartCount;
|
||||
private int _discountCartCount;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await CartService.EnsureInitializedAsync();
|
||||
await DiscountCartService.EnsureInitializedAsync();
|
||||
|
||||
_cartCount = CartService.Count;
|
||||
_discountCartCount = DiscountCartService.Count;
|
||||
|
||||
CartService.OnChange += OnCartChanged;
|
||||
DiscountCartService.OnChange += OnDiscountCartChanged;
|
||||
}
|
||||
|
||||
private void OnCartChanged()
|
||||
{
|
||||
_cartCount = CartService.Count;
|
||||
InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private void OnDiscountCartChanged()
|
||||
{
|
||||
_discountCartCount = DiscountCartService.Count;
|
||||
InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
CartService.OnChange -= OnCartChanged;
|
||||
DiscountCartService.OnChange -= OnDiscountCartChanged;
|
||||
}
|
||||
|
||||
private async Task GoBack() => await JS.InvokeVoidAsync("history.back");
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
@attribute [Route(RouteConstants.Gateway.OrdersChooser)]
|
||||
@inject IJSRuntime JS
|
||||
|
||||
<PageTitle>سفارشات من</PageTitle>
|
||||
|
||||
<MudContainer MaxWidth="MaxWidth.Medium" Class="py-6 py-md-10">
|
||||
<PageHeader Title="سفارشات من" BackHref="@RouteConstants.Profile.Index" />
|
||||
<MudStack AlignItems="AlignItems.Center" Spacing="4">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Receipt" Size="Size.Large" Color="Color.Primary" />
|
||||
<MudText Typo="Typo.body1" Align="Align.Center" Class="mud-text-secondary">
|
||||
سفارشات کدام فروشگاه را میخواهید مشاهده کنید؟
|
||||
</MudText>
|
||||
|
||||
<MudGrid Spacing="4" Justify="Justify.Center" Class="mt-4">
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudLink Href="@RouteConstants.Store.Orders" Underline="Underline.None" Class="store-chooser-link">
|
||||
<MudPaper Elevation="2" Class="pa-6 rounded-xl text-center store-chooser-card store-chooser-regular">
|
||||
<MudAvatar Size="Size.Large" Class="mx-auto mb-3 gateway-avatar-sm-store">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Storefront" Size="Size.Large" Class="text-brand-store" />
|
||||
</MudAvatar>
|
||||
<MudText Typo="Typo.h6" Class="fw-semibold">سفارشات فروشگاه</MudText>
|
||||
<MudText Typo="Typo.caption" Class="mud-text-secondary mt-1">سفارشات خرید معمولی</MudText>
|
||||
</MudPaper>
|
||||
</MudLink>
|
||||
</MudItem>
|
||||
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudLink Href="@RouteConstants.DiscountStore.Orders" Underline="Underline.None" Class="store-chooser-link">
|
||||
<MudPaper Elevation="2" Class="pa-6 rounded-xl text-center store-chooser-card store-chooser-discount">
|
||||
<MudAvatar Size="Size.Large" Class="mx-auto mb-3 gateway-avatar-sm-discount">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Loyalty" Size="Size.Large" Class="text-brand-discount" />
|
||||
</MudAvatar>
|
||||
<MudText Typo="Typo.h6" Class="fw-semibold">سفارشات فروشگاه تخفیفی</MudText>
|
||||
<MudText Typo="Typo.caption" Class="mud-text-secondary mt-1">سفارشات خرید تخفیفی</MudText>
|
||||
</MudPaper>
|
||||
</MudLink>
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
|
||||
<MudButton Variant="Variant.Text" StartIcon="@Icons.Material.Filled.ArrowBack"
|
||||
OnClick="GoBack" Class="mt-4">
|
||||
بازگشت به داشبورد
|
||||
</MudButton>
|
||||
</MudStack>
|
||||
</MudContainer>
|
||||
|
||||
@code {
|
||||
private async Task GoBack() => await JS.InvokeVoidAsync("history.back");
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
@attribute [Route(RouteConstants.Gateway.StoreChooser)]
|
||||
|
||||
<PageTitle>فروشگاهها</PageTitle>
|
||||
|
||||
<MudContainer MaxWidth="MaxWidth.Medium" Class="py-6 py-md-10">
|
||||
<PageHeader Title="انتخاب فروشگاه" BackHref="@RouteConstants.Profile.Index" />
|
||||
<MudStack AlignItems="AlignItems.Center" Spacing="4">
|
||||
<MudText Typo="Typo.body1" Align="Align.Center" Class="mud-text-secondary" Style="max-width:500px;">
|
||||
برای خرید، یکی از فروشگاهها را انتخاب کنید. هر فروشگاه سبد خرید و سفارشات مجزای خود را دارد.
|
||||
</MudText>
|
||||
|
||||
<MudGrid Spacing="4" Justify="Justify.Center" Class="mt-4">
|
||||
<!-- Regular Store -->
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudLink Href="@RouteConstants.Store.Products" Underline="Underline.None" Class="store-chooser-link">
|
||||
<MudPaper Elevation="2" Class="pa-6 rounded-xl text-center store-chooser-card store-chooser-regular">
|
||||
<MudAvatar Size="Size.Large" Class="mx-auto mb-3 gateway-avatar-store">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Storefront" Size="Size.Large" Class="text-brand-store" />
|
||||
</MudAvatar>
|
||||
<MudText Typo="Typo.h5" Class="fw-bold">فروشگاه</MudText>
|
||||
<MudText Typo="Typo.body2" Class="mud-text-secondary mt-2">
|
||||
خرید محصولات با پرداخت از کیف پول اعتباری
|
||||
</MudText>
|
||||
@if (_cartCount > 0)
|
||||
{
|
||||
<MudChip T="string" Color="Color.Success" Variant="Variant.Filled" Size="Size.Small" Class="mt-3">
|
||||
@_cartCount محصول در سبد خرید
|
||||
</MudChip>
|
||||
}
|
||||
</MudPaper>
|
||||
</MudLink>
|
||||
</MudItem>
|
||||
|
||||
<!-- Discount Store -->
|
||||
<MudItem xs="12" sm="6">
|
||||
<MudLink Href="@RouteConstants.DiscountStore.Products" Underline="Underline.None" Class="store-chooser-link">
|
||||
<MudPaper Elevation="2" Class="pa-6 rounded-xl text-center store-chooser-card store-chooser-discount">
|
||||
<MudAvatar Size="Size.Large" Class="mx-auto mb-3 gateway-avatar-discount">
|
||||
<MudIcon Icon="@Icons.Material.Filled.Loyalty" Size="Size.Large" Class="text-brand-discount" />
|
||||
</MudAvatar>
|
||||
<MudText Typo="Typo.h5" Class="fw-bold">فروشگاه تخفیفی</MudText>
|
||||
<MudText Typo="Typo.body2" Class="mud-text-secondary mt-2">
|
||||
خرید با استفاده از موجودی کیف تخفیفی + درگاه پرداخت
|
||||
</MudText>
|
||||
@if (_discountCartCount > 0)
|
||||
{
|
||||
<MudChip T="string" Color="Color.Error" Variant="Variant.Filled" Size="Size.Small" Class="mt-3">
|
||||
@_discountCartCount محصول در سبد خرید
|
||||
</MudChip>
|
||||
}
|
||||
</MudPaper>
|
||||
</MudLink>
|
||||
</MudItem>
|
||||
</MudGrid>
|
||||
</MudStack>
|
||||
</MudContainer>
|
||||
@@ -0,0 +1,43 @@
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using FrontOffice.Main.Utilities;
|
||||
|
||||
namespace FrontOffice.Main.Pages.Gateway;
|
||||
|
||||
public partial class StoreChooser : IDisposable
|
||||
{
|
||||
[Inject] private CartService CartService { get; set; } = default!;
|
||||
[Inject] private DiscountCartService DiscountCartService { get; set; } = default!;
|
||||
|
||||
private int _cartCount;
|
||||
private int _discountCartCount;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await CartService.EnsureInitializedAsync();
|
||||
await DiscountCartService.EnsureInitializedAsync();
|
||||
|
||||
_cartCount = CartService.Count;
|
||||
_discountCartCount = DiscountCartService.Count;
|
||||
|
||||
CartService.OnChange += OnCartChanged;
|
||||
DiscountCartService.OnChange += OnDiscountCartChanged;
|
||||
}
|
||||
|
||||
private void OnCartChanged()
|
||||
{
|
||||
_cartCount = CartService.Count;
|
||||
InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private void OnDiscountCartChanged()
|
||||
{
|
||||
_discountCartCount = DiscountCartService.Count;
|
||||
InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
CartService.OnChange -= OnCartChanged;
|
||||
DiscountCartService.OnChange -= OnDiscountCartChanged;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user