From b64d99c5b3da88e1d069cf30a7c5ee0d19bad45a Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Thu, 6 Aug 2026 23:59:42 +0330 Subject: [PATCH] feat(profile): enhance ChargeCreditWallet and Wallet components with club membership checks - Added logic to display alerts and buttons based on club membership status in the ChargeCreditWallet and Wallet components. - Implemented user authentication checks to determine if the user is a club member and has purchased a package before allowing wallet charging. - Updated UI to guide users on purchasing packages or signing club contracts if they are not eligible to charge their wallet. These changes improve user experience by providing clear instructions and preventing unauthorized wallet charges. --- .../Pages/Profile/ChargeCreditWallet.razor | 35 ++++++++++ .../Pages/Profile/ChargeCreditWallet.razor.cs | 33 ++++++++- .../Pages/Profile/Wallet.razor | 58 ++++++++++++--- .../Pages/Profile/Wallet.razor.cs | 16 +++++ .../Pages/Store/CheckoutSummary.razor.cs | 19 ++++- .../Shared/InsufficientCreditDialog.razor | 70 ++++++++++++++++--- 6 files changed, 209 insertions(+), 22 deletions(-) diff --git a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor index 611ecab..d55b8bc 100644 --- a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor +++ b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor @@ -35,6 +35,40 @@ } + @if (_authLoaded && !_isClubMemberActive) + { + + + + برای شارژ کیف پول اصلی ابتدا باید پکیج را خریداری کرده و قرارداد باشگاه مشتریان را امضا کنید. + + + @if (!_hasPurchasedPackage) + { + + مشاهده پکیج‌ها + + } + else + { + + امضای قرارداد باشگاه + + } + + بازگشت به کیف پول + + + + + } + else if (_authLoaded) + { @@ -122,5 +156,6 @@ + } diff --git a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs index 4237af7..816aada 100644 --- a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs +++ b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs @@ -7,10 +7,15 @@ namespace FrontOffice.Main.Pages.Profile; public partial class ChargeCreditWallet : ComponentBase { + [Inject] private AuthService AuthService { get; set; } = default!; + private bool _isProcessing; private long _chargeAmount; private string? _paymentResult; private string? _pendingReturnUrl; + private bool _isClubMemberActive; + private bool _hasPurchasedPackage; + private bool _authLoaded; private readonly long[] _presetAmounts = { 500_000, 1_000_000, 5_000_000, 10_000_000, 20_000_000, 50_000_000 }; @@ -23,7 +28,7 @@ public partial class ChargeCreditWallet : ComponentBase [SupplyParameterFromQuery(Name = "returnUrl")] public string? ReturnUrlQueryParam { get; set; } - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { _paymentResult = PaymentQueryParam; @@ -32,11 +37,27 @@ public partial class ChargeCreditWallet : ComponentBase if (CreditChargeNavigation.IsValidReturnUrl(ReturnUrlQueryParam)) _pendingReturnUrl = ReturnUrlQueryParam; + + try + { + var userInfo = await AuthService.GetUserAuthInfo(); + _isClubMemberActive = userInfo.IsClubMemberActive; + _hasPurchasedPackage = userInfo.HasPurchasedPackage; + } + catch + { + _isClubMemberActive = false; + _hasPurchasedPackage = false; + } + finally + { + _authLoaded = true; + } } protected override async Task OnAfterRenderAsync(bool firstRender) { - if (firstRender && !string.IsNullOrEmpty(_pendingReturnUrl)) + if (firstRender && !string.IsNullOrEmpty(_pendingReturnUrl) && _isClubMemberActive) { await CreditChargeNavigation.SaveReturnUrlAsync(JSRuntime, _pendingReturnUrl); } @@ -46,6 +67,14 @@ public partial class ChargeCreditWallet : ComponentBase private async Task StartCreditCharge() { + if (!_isClubMemberActive) + { + Snackbar.Add( + "برای شارژ کیف پول اصلی ابتدا باید پکیج را خریداری کرده و قرارداد باشگاه مشتریان را امضا کنید.", + Severity.Warning); + return; + } + if (_chargeAmount <= 0 || _isProcessing) return; _isProcessing = true; diff --git a/src/FrontOffice.Main/Pages/Profile/Wallet.razor b/src/FrontOffice.Main/Pages/Profile/Wallet.razor index 6670c39..d52d737 100644 --- a/src/FrontOffice.Main/Pages/Profile/Wallet.razor +++ b/src/FrontOffice.Main/Pages/Profile/Wallet.razor @@ -39,15 +39,55 @@ - - شارژ کیف‌پول اصلی - + @if (_isClubMemberActive) + { + + شارژ کیف‌پول اصلی + + } + else + { + + + + شارژ کیف‌پول اصلی + + + برای شارژ کیف پول اصلی ابتدا باید پکیج را خریداری کرده و قرارداد باشگاه مشتریان را امضا کنید. + + + @if (!_hasPurchasedPackage) + { + + مشاهده پکیج‌ها + + } + else + { + + امضای قرارداد باشگاه + + } + + + + } _txs = new(); private string? _filterReferenceId; private string _filterType = "all"; + private bool _isClubMemberActive; + private bool _hasPurchasedPackage; protected override async Task OnInitializedAsync() { + try + { + var userInfo = await AuthService.GetUserAuthInfo(); + _isClubMemberActive = userInfo.IsClubMemberActive; + _hasPurchasedPackage = userInfo.HasPurchasedPackage; + } + catch + { + _isClubMemberActive = false; + _hasPurchasedPackage = false; + } + var b = await WalletService.GetBalancesAsync(); _balances = (FormatPrice(b.CreditBalance), FormatPrice(b.DiscountBalance), FormatPrice(b.NetworkBalance)); _txs = await WalletService.GetTransactionsAsync(); diff --git a/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs b/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs index 19805ec..d199997 100644 --- a/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs +++ b/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs @@ -125,11 +125,26 @@ public partial class CheckoutSummary : ComponentBase return false; var shortfall = totalRequired - walletBalance; + var allowCharge = false; + var hasPurchasedPackage = false; + try + { + var userInfo = await AuthService.GetUserAuthInfo(); + allowCharge = userInfo.IsClubMemberActive; + hasPurchasedPackage = userInfo.HasPurchasedPackage; + } + catch + { + allowCharge = false; + } + var parameters = new DialogParameters { { x => x.CurrentBalance, walletBalance }, { x => x.RequiredAmount, totalRequired }, - { x => x.ShortfallAmount, shortfall } + { x => x.ShortfallAmount, shortfall }, + { x => x.AllowChargeCredit, allowCharge }, + { x => x.HasPurchasedPackage, hasPurchasedPackage } }; var dialog = await DialogService.ShowAsync( @@ -143,7 +158,7 @@ public partial class CheckoutSummary : ComponentBase }); var result = await dialog.Result; - if (result is { Canceled: false } && result.Data is long chargeShortfall) + if (allowCharge && result is { Canceled: false } && result.Data is long chargeShortfall) { var chargeAmount = CreditChargeNavigation.NormalizeChargeAmount(chargeShortfall); Navigation.NavigateTo(CreditChargeNavigation.BuildChargeUrl( diff --git a/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor b/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor index da14999..b55951d 100644 --- a/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor +++ b/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor @@ -1,3 +1,5 @@ +@using FrontOffice.Main.Utilities + @@ -7,9 +9,19 @@ - - برای تکمیل این سفارش، موجودی اصلی شما کافی نیست. می‌توانید کیف پول را شارژ کنید و سپس سفارش را ثبت کنید. - + @if (AllowChargeCredit) + { + + برای تکمیل این سفارش، موجودی اصلی شما کافی نیست. می‌توانید کیف پول را شارژ کنید و سپس سفارش را ثبت کنید. + + } + else + { + + برای شارژ کیف پول اصلی ابتدا باید پکیج را خریداری کرده و قرارداد باشگاه مشتریان را امضا کنید. + + } + @@ -31,12 +43,33 @@ بستن - - شارژ حساب اصلی - + @if (AllowChargeCredit) + { + + شارژ حساب اصلی + + } + else if (!HasPurchasedPackage) + { + + مشاهده پکیج‌ها + + } + else + { + + امضای قرارداد باشگاه + + } @@ -53,9 +86,28 @@ [Parameter] public long ShortfallAmount { get; set; } + /// اگر false باشد، به صفحه شارژ هدایت نمی‌شود. + [Parameter] + public bool AllowChargeCredit { get; set; } = true; + + [Parameter] + public bool HasPurchasedPackage { get; set; } + private void Cancel() => MudDialog.Cancel(); private void GoToCharge() => MudDialog.Close(DialogResult.Ok(ShortfallAmount)); + private void GoToPackages() + { + MudDialog.Cancel(); + Navigation.NavigateTo(RouteConstants.Package.List); + } + + private void GoToClubMembership() + { + MudDialog.Cancel(); + Navigation.NavigateTo(RouteConstants.Club.Membership); + } + private static string FormatPrice(long price) => string.Format("{0:N0} تومان", price); }