From 2874b931df982f2396c417e1f7ec9556be1d730b Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Thu, 14 May 2026 19:58:28 +0330 Subject: [PATCH] feat: hide product prices from unauthenticated (guest) users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Guests can browse products and product details for presentation purposes, but prices are hidden behind a 'وارد شوید' prompt (lock icon). Authenticated users see prices as before. Affected pages: - Landing page (Index): top-selling regular + discount sections - Store/Products list - Store/ProductDetail (desktop price + mobile sticky bar) - DiscountStore/Products list - DiscountStore/ProductDetail (full price box) Each code-behind now checks AuthService.IsAuthenticatedAsync() on init and stores the result in _isAuthenticated for use in the template. Co-authored-by: Cursor --- .../Pages/DiscountStore/ProductDetail.razor | 87 ++++++++++--------- .../DiscountStore/ProductDetail.razor.cs | 4 + .../Pages/DiscountStore/Products.razor | 17 +++- .../Pages/DiscountStore/Products.razor.cs | 3 + src/FrontOffice.Main/Pages/Index.razor | 28 ++++-- src/FrontOffice.Main/Pages/Index.razor.cs | 3 + .../Pages/Store/ProductDetail.razor | 60 ++++++++----- .../Pages/Store/ProductDetail.razor.cs | 5 +- .../Pages/Store/Products.razor | 12 ++- .../Pages/Store/Products.razor.cs | 4 +- 10 files changed, 150 insertions(+), 73 deletions(-) diff --git a/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor b/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor index db89b9e..89be7bf 100644 --- a/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor +++ b/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor @@ -63,49 +63,58 @@ } - - - - قیمت محصول: - - @($"{_product.Price:N0}") تومان - - - @if (VAT.IsEnabled) - { + @if (_isAuthenticated) + { + + - مالیات ارزش افزوده (@VAT.VatPercentage%): - - @($"{VAT.CalculateVAT(_product.Price):N0}") تومان - - - - قیمت با مالیات: - - @($"{VAT.AddVAT(_product.Price):N0}") تومان - - - } - else - { - - قیمت نهایی: - + قیمت محصول: + @($"{_product.Price:N0}") تومان - } - @if (_product.MaxDiscountPercent > 0) - { - - اعتبار از کیف اعتباری: - - @_product.MaxDiscountPercent% (@($"{_product.Price * _product.MaxDiscountPercent / 100:N0}") تومان) - - - } - - + @if (VAT.IsEnabled) + { + + مالیات ارزش افزوده (@VAT.VatPercentage%): + + @($"{VAT.CalculateVAT(_product.Price):N0}") تومان + + + + قیمت با مالیات: + + @($"{VAT.AddVAT(_product.Price):N0}") تومان + + + } + else + { + + قیمت نهایی: + + @($"{_product.Price:N0}") تومان + + + } + @if (_product.MaxDiscountPercent > 0) + { + + اعتبار از کیف اعتباری: + + @_product.MaxDiscountPercent% (@($"{_product.Price * _product.MaxDiscountPercent / 100:N0}") تومان) + + + } + + + } + else + { + + برای مشاهده قیمت ابتدا وارد شوید + + } diff --git a/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor.cs b/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor.cs index 84d4d74..ba0715c 100644 --- a/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor.cs +++ b/src/FrontOffice.Main/Pages/DiscountStore/ProductDetail.razor.cs @@ -11,6 +11,9 @@ public partial class ProductDetail [Inject] private DiscountCartService DiscountCartService { get; set; } = default!; [Inject] private VATService VAT { get; set; } = default!; [Inject] private GuestActionGate GuestGate { get; set; } = default!; + [Inject] private AuthService AuthService { get; set; } = default!; + + private bool _isAuthenticated; private DiscountProductDetail? _product; private string _selectedImage = string.Empty; @@ -20,6 +23,7 @@ public partial class ProductDetail protected override async Task OnInitializedAsync() { + _isAuthenticated = await AuthService.IsAuthenticatedAsync(); await LoadProductAsync(); } diff --git a/src/FrontOffice.Main/Pages/DiscountStore/Products.razor b/src/FrontOffice.Main/Pages/DiscountStore/Products.razor index 5630c14..b05fa5f 100644 --- a/src/FrontOffice.Main/Pages/DiscountStore/Products.razor +++ b/src/FrontOffice.Main/Pages/DiscountStore/Products.razor @@ -103,10 +103,19 @@
@p.Title -
- @FormatPrice(p.Price) - (+ ارزش افزوده) -
+ @if (_isAuthenticated) + { +
+ @FormatPrice(p.Price) + (+ ارزش افزوده) +
+ } + else + { + + برای مشاهده قیمت وارد شوید + + }
diff --git a/src/FrontOffice.Main/Pages/DiscountStore/Products.razor.cs b/src/FrontOffice.Main/Pages/DiscountStore/Products.razor.cs index 183d8a4..84aef44 100644 --- a/src/FrontOffice.Main/Pages/DiscountStore/Products.razor.cs +++ b/src/FrontOffice.Main/Pages/DiscountStore/Products.razor.cs @@ -9,7 +9,9 @@ public partial class Products : ComponentBase, IDisposable [Inject] private DiscountProductService ProductService { get; set; } = default!; [Inject] private DiscountCartService DiscountCart { get; set; } = default!; [Inject] private GuestActionGate GuestGate { get; set; } = default!; + [Inject] private AuthService AuthService { get; set; } = default!; + private bool _isAuthenticated; private string _search = string.Empty; private long? _selectedCategoryId; private int _currentPage = 1; @@ -24,6 +26,7 @@ public partial class Products : ComponentBase, IDisposable protected override async Task OnInitializedAsync() { + _isAuthenticated = await AuthService.IsAuthenticatedAsync(); _loading = true; await DiscountCart.EnsureInitializedAsync(); DiscountCart.OnChange += StateHasChanged; diff --git a/src/FrontOffice.Main/Pages/Index.razor b/src/FrontOffice.Main/Pages/Index.razor index 1e00a1e..4650d14 100644 --- a/src/FrontOffice.Main/Pages/Index.razor +++ b/src/FrontOffice.Main/Pages/Index.razor @@ -144,7 +144,16 @@ else
@p.Title - @FormatPrice(p.Price) + @if (_isAuthenticated) + { + @FormatPrice(p.Price) + } + else + { + + برای مشاهده قیمت وارد شوید + + }
@@ -217,10 +226,19 @@ else
@p.Title -
- @FormatDiscountPrice(p.Price) - (+ ارزش افزوده) -
+ @if (_isAuthenticated) + { +
+ @FormatDiscountPrice(p.Price) + (+ ارزش افزوده) +
+ } + else + { + + برای مشاهده قیمت وارد شوید + + }
diff --git a/src/FrontOffice.Main/Pages/Index.razor.cs b/src/FrontOffice.Main/Pages/Index.razor.cs index c819d94..b362fd6 100644 --- a/src/FrontOffice.Main/Pages/Index.razor.cs +++ b/src/FrontOffice.Main/Pages/Index.razor.cs @@ -17,6 +17,8 @@ public partial class Index : IDisposable [Inject] private GuestActionGate GuestGate { get; set; } = default!; [Inject] private VATService VAT { get; set; } = default!; + private bool _isAuthenticated; + // ── CMS page data ── private PageSettingsDto? _pageData; private LandingSettings? _settings; @@ -44,6 +46,7 @@ public partial class Index : IDisposable protected override async Task OnInitializedAsync() { MainService.OnChangeHandler += OnStateChanged; + _isAuthenticated = await AuthService.IsAuthenticatedAsync(); // Load landing page settings from CMS try diff --git a/src/FrontOffice.Main/Pages/Store/ProductDetail.razor b/src/FrontOffice.Main/Pages/Store/ProductDetail.razor index 2b6a0a0..ec645bc 100644 --- a/src/FrontOffice.Main/Pages/Store/ProductDetail.razor +++ b/src/FrontOffice.Main/Pages/Store/ProductDetail.razor @@ -78,15 +78,24 @@ else @*
*@ @* } *@ - - @FormatPrice(_product.Price) - @if (VAT.IsEnabled) - { - - (شامل @VAT.VatPercentage% مالیات بر ارزش افزوده) - - } - + @if (_isAuthenticated) + { + + @FormatPrice(_product.Price) + @if (VAT.IsEnabled) + { + + (شامل @VAT.VatPercentage% مالیات بر ارزش افزوده) + + } + + } + else + { + + برای مشاهده قیمت ابتدا وارد شوید + + } @if (IsInStock) @@ -141,18 +150,27 @@ else { - - @if (HasDiscount && OriginalPrice is not null) - { - - @FormatPrice(OriginalPrice.Value) - @($"٪{_product!.Discount}") - - } - @FormatPrice(TotalPrice) - + @if (_isAuthenticated) + { + + @if (HasDiscount && OriginalPrice is not null) + { + + @FormatPrice(OriginalPrice.Value) + @($"٪{_product!.Discount}") + + } + @FormatPrice(TotalPrice) + + } + else + { + + برای مشاهده قیمت وارد شوید + + } @if (IsInCart) diff --git a/src/FrontOffice.Main/Pages/Store/ProductDetail.razor.cs b/src/FrontOffice.Main/Pages/Store/ProductDetail.razor.cs index a42c25e..4a5fb07 100644 --- a/src/FrontOffice.Main/Pages/Store/ProductDetail.razor.cs +++ b/src/FrontOffice.Main/Pages/Store/ProductDetail.razor.cs @@ -13,6 +13,9 @@ public partial class ProductDetail : ComponentBase, IDisposable [Inject] private CartService Cart { get; set; } = default!; [Inject] private VATService VAT { get; set; } = default!; [Inject] private GuestActionGate GuestGate { get; set; } = default!; + [Inject] private AuthService AuthService { get; set; } = default!; + + private bool _isAuthenticated; [Parameter] public long id { get; set; } @@ -52,7 +55,7 @@ public partial class ProductDetail : ComponentBase, IDisposable protected override async Task OnInitializedAsync() { - // لود سبد خرید (فقط اگر کاربر لاگین کرده باشد) + _isAuthenticated = await AuthService.IsAuthenticatedAsync(); await Cart.EnsureInitializedAsync(); Cart.OnChange += HandleCartChanged; diff --git a/src/FrontOffice.Main/Pages/Store/Products.razor b/src/FrontOffice.Main/Pages/Store/Products.razor index a00d6f3..cd1d3d8 100644 --- a/src/FrontOffice.Main/Pages/Store/Products.razor +++ b/src/FrontOffice.Main/Pages/Store/Products.razor @@ -141,8 +141,16 @@
@p.Title - @FormatPrice(p.Price) - + @if (_isAuthenticated) + { + @FormatPrice(p.Price) + } + else + { + + برای مشاهده قیمت وارد شوید + + }
diff --git a/src/FrontOffice.Main/Pages/Store/Products.razor.cs b/src/FrontOffice.Main/Pages/Store/Products.razor.cs index 7fa0517..1c8c8c5 100644 --- a/src/FrontOffice.Main/Pages/Store/Products.razor.cs +++ b/src/FrontOffice.Main/Pages/Store/Products.razor.cs @@ -22,7 +22,9 @@ public partial class Products : ComponentBase, IDisposable [Inject] private CartService Cart { get; set; } = default!; [Inject] private VATService VAT { get; set; } = default!; [Inject] private GuestActionGate GuestGate { get; set; } = default!; + [Inject] private AuthService AuthService { get; set; } = default!; + private bool _isAuthenticated; private string _query = string.Empty; private bool _loading; private bool _loadingMore; @@ -38,7 +40,7 @@ public partial class Products : ComponentBase, IDisposable protected override async Task OnInitializedAsync() { - // لود سبد خرید (فقط اگر کاربر لاگین کرده باشد) + _isAuthenticated = await AuthService.IsAuthenticatedAsync(); await Cart.EnsureInitializedAsync(); Cart.OnChange += StateHasChanged; Navigation.LocationChanged += HandleLocationChanged;