diff --git a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor index eaab334..34a492a 100644 --- a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor +++ b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor @@ -83,7 +83,18 @@ } - else if (_authLoaded) + else if (_authLoaded && _needsMagicCeilingConsent && !_allowNormalDespiteMagic && !_redirectingToMagic) + { + + + + + سقف شارژ جادویی پر است. برای شارژ بدون ضریب باید تأیید کنید... + + + + } + else if (ShowChargeForm) { @@ -91,6 +102,13 @@ شارژ موجودی اصلی + @if (_allowNormalDespiteMagic) + { + + این شارژ بدون ضریب جادویی است (۱:۱). سقف واریز جادویی شما در این دور پر شده است. + + } + مبلغ وارد شده (به تومان) از طریق درگاه پرداخت به موجودی اصلی شما اضافه می‌شود. از موجودی اصلی برای خرید از فروشگاه عادی و پرداخت سفارش استفاده می‌شود. diff --git a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs index bac834d..8b7ffff 100644 --- a/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs +++ b/src/FrontOffice.Main/Pages/Profile/ChargeCreditWallet.razor.cs @@ -17,6 +17,9 @@ public partial class ChargeCreditWallet : ComponentBase private bool _hasPurchasedPackage; private bool _authLoaded; private bool _redirectingToMagic; + private bool _allowNormalDespiteMagic; + private bool _needsMagicCeilingConsent; + private bool _magicConsentPrompted; private readonly long[] _presetAmounts = { 500_000, 1_000_000, 5_000_000, 10_000_000, 20_000_000, 50_000_000 }; @@ -29,6 +32,12 @@ public partial class ChargeCreditWallet : ComponentBase [SupplyParameterFromQuery(Name = "returnUrl")] public string? ReturnUrlQueryParam { get; set; } + private bool ShowChargeForm => + _authLoaded + && _isClubMemberActive + && !_redirectingToMagic + && (!_needsMagicCeilingConsent || _allowNormalDespiteMagic); + protected override async Task OnInitializedAsync() { _paymentResult = PaymentQueryParam; @@ -55,16 +64,20 @@ public partial class ChargeCreditWallet : ComponentBase _authLoaded = true; } - // اگر کیف پول جادویی فعال است، فرم شارژ ۱:۱ نشان داده نشود - if (_isClubMemberActive && await TryRedirectIfMagicWalletAsync()) - return; + if (_isClubMemberActive) + await EvaluateMagicWalletGateAsync(promptConsent: false); } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && !string.IsNullOrEmpty(_pendingReturnUrl) && _isClubMemberActive && !_redirectingToMagic) - { await CreditChargeNavigation.SaveReturnUrlAsync(JSRuntime, _pendingReturnUrl); + + if (firstRender && _needsMagicCeilingConsent && !_allowNormalDespiteMagic && !_magicConsentPrompted) + { + _magicConsentPrompted = true; + await PromptMagicCeilingConsentAsync(); + StateHasChanged(); } await base.OnAfterRenderAsync(firstRender); @@ -80,7 +93,10 @@ public partial class ChargeCreditWallet : ComponentBase return; } - if (await TryRedirectIfMagicWalletAsync()) + if (await EvaluateMagicWalletGateAsync(promptConsent: true)) + return; + + if (!_allowNormalDespiteMagic && _needsMagicCeilingConsent) return; if (_chargeAmount <= 0 || _isProcessing) return; @@ -122,25 +138,47 @@ public partial class ChargeCreditWallet : ComponentBase } /// - /// اگر WalletMode جادویی باشد، پیام می‌دهد و به صفحه شارژ کیف جادویی هدایت می‌کند. + /// Magic با ظرفیت باقی‌مانده → ریدایرکت به MagicWallet. + /// Magic با سقف پر → نیاز به رضایت برای شارژ ۱:۱. + /// true یعنی مسیر شارژ فعلی باید متوقف شود. /// - private async Task TryRedirectIfMagicWalletAsync() + private async Task EvaluateMagicWalletGateAsync(bool promptConsent) { + if (_allowNormalDespiteMagic) + return false; + try { var status = await WalletService.GetMagicWalletStatusAsync(); if (status.WalletMode != 1) + { + _needsMagicCeilingConsent = false; return false; + } - var multiplier = status.MagicMultiplier > 0 ? status.MagicMultiplier : 2.5; - var multiplierText = multiplier.ToString("0.#"); + if (status.MagicRemainingDeposit > 0) + { + var multiplier = status.MagicMultiplier > 0 ? status.MagicMultiplier : 2.5; + var multiplierText = multiplier.ToString("0.#"); - _redirectingToMagic = true; - Snackbar.Add( - $"کیف پول شما در حالت جادویی است. شارژ از این صفحه موجودی را چندبرابر نمی‌کند. برای دریافت ضریب جادویی (×{multiplierText}) به صفحه شارژ کیف پول جادویی هدایت می‌شوید.", - Severity.Info); + _redirectingToMagic = true; + _needsMagicCeilingConsent = false; + Snackbar.Add( + $"کیف پول شما در حالت جادویی است. شارژ از این صفحه موجودی را چندبرابر نمی‌کند. برای دریافت ضریب جادویی (×{multiplierText}) به صفحه شارژ کیف پول جادویی هدایت می‌شوید.", + Severity.Info); + + Navigation.NavigateTo(RouteConstants.Profile.MagicWallet); + return true; + } + + _needsMagicCeilingConsent = true; + + if (promptConsent) + { + await PromptMagicCeilingConsentAsync(); + return !_allowNormalDespiteMagic; + } - Navigation.NavigateTo(RouteConstants.Profile.MagicWallet); return true; } catch @@ -150,6 +188,25 @@ public partial class ChargeCreditWallet : ComponentBase } } + private async Task PromptMagicCeilingConsentAsync() + { + var confirmed = await DialogService.ShowMessageBox( + "شارژ بدون ضریب جادویی", + "سقف شارژ کیف پول جادویی شما در این دور پر شده است. شارژ از این صفحه بدون ضریب (۱:۱) به موجودی اضافه می‌شود و ضریب جادویی اعمال نمی‌شود. آیا مایلید ادامه دهید؟", + yesText: "ادامه شارژ بدون ضریب", + cancelText: "انصراف"); + + if (confirmed == true) + { + _allowNormalDespiteMagic = true; + _redirectingToMagic = false; + return; + } + + _redirectingToMagic = true; + Navigation.NavigateTo(RouteConstants.Profile.MagicWallet); + } + private async Task ContinueShoppingAsync() { var returnUrl = await CreditChargeNavigation.GetReturnUrlAsync(JSRuntime); diff --git a/src/FrontOffice.Main/Pages/Profile/MagicWallet.razor b/src/FrontOffice.Main/Pages/Profile/MagicWallet.razor index 19d4e2d..89e973b 100644 --- a/src/FrontOffice.Main/Pages/Profile/MagicWallet.razor +++ b/src/FrontOffice.Main/Pages/Profile/MagicWallet.razor @@ -166,8 +166,23 @@ else { - سقف شارژ جادویی در این دور پر شده است. - با خرج کردن موجودی و خرید مجدد پکیج، سقف ریست می‌شود. + + + سقف شارژ جادویی در این دور پر شده است. + با خرج کردن موجودی و خرید مجدد پکیج، سقف ریست می‌شود. + + + اگر برای تکمیل خرید به موجودی بیشتری نیاز دارید، می‌توانید به‌صورت استثنایی کیف اصلی را بدون ضریب (۱:۱) شارژ کنید. + + + شارژ عادی بدون ضریب + + } diff --git a/src/FrontOffice.Main/Pages/Profile/Wallet.razor b/src/FrontOffice.Main/Pages/Profile/Wallet.razor index e13abee..5da6575 100644 --- a/src/FrontOffice.Main/Pages/Profile/Wallet.razor +++ b/src/FrontOffice.Main/Pages/Profile/Wallet.razor @@ -52,9 +52,27 @@ Class="rounded-lg"> شارژ کیف‌پول جادویی - - کیف پول شما در حالت جادویی است؛ شارژ از مسیر جادویی با ضریب چندبرابر اعمال می‌شود. - + @if (_magicCeilingFull) + { + + سقف شارژ جادویی این دور پر است. در صورت نیاز می‌توانید به‌صورت استثنایی بدون ضریب شارژ کنید. + + + شارژ عادی بدون ضریب + + } + else + { + + کیف پول شما در حالت جادویی است؛ شارژ از مسیر جادویی با ضریب چندبرابر اعمال می‌شود. + + } } else { diff --git a/src/FrontOffice.Main/Pages/Profile/Wallet.razor.cs b/src/FrontOffice.Main/Pages/Profile/Wallet.razor.cs index f20a00c..491e09d 100644 --- a/src/FrontOffice.Main/Pages/Profile/Wallet.razor.cs +++ b/src/FrontOffice.Main/Pages/Profile/Wallet.razor.cs @@ -15,6 +15,7 @@ public partial class Wallet : ComponentBase private bool _isClubMemberActive; private bool _hasPurchasedPackage; private bool _isMagicWallet; + private bool _magicCeilingFull; protected override async Task OnInitializedAsync() { @@ -34,10 +35,12 @@ public partial class Wallet : ComponentBase { var magicStatus = await WalletService.GetMagicWalletStatusAsync(); _isMagicWallet = magicStatus.WalletMode == 1; + _magicCeilingFull = _isMagicWallet && magicStatus.MagicRemainingDeposit <= 0; } catch { _isMagicWallet = false; + _magicCeilingFull = false; } var b = await WalletService.GetBalancesAsync(); diff --git a/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs b/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs index d199997..8437093 100644 --- a/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs +++ b/src/FrontOffice.Main/Pages/Store/CheckoutSummary.razor.cs @@ -127,6 +127,8 @@ public partial class CheckoutSummary : ComponentBase var shortfall = totalRequired - walletBalance; var allowCharge = false; var hasPurchasedPackage = false; + var isMagicWallet = false; + var magicCeilingFull = false; try { var userInfo = await AuthService.GetUserAuthInfo(); @@ -138,13 +140,27 @@ public partial class CheckoutSummary : ComponentBase allowCharge = false; } + try + { + var magicStatus = await WalletService.GetMagicWalletStatusAsync(); + isMagicWallet = magicStatus.WalletMode == 1; + magicCeilingFull = isMagicWallet && magicStatus.MagicRemainingDeposit <= 0; + } + catch + { + isMagicWallet = false; + magicCeilingFull = false; + } + var parameters = new DialogParameters { { x => x.CurrentBalance, walletBalance }, { x => x.RequiredAmount, totalRequired }, { x => x.ShortfallAmount, shortfall }, { x => x.AllowChargeCredit, allowCharge }, - { x => x.HasPurchasedPackage, hasPurchasedPackage } + { x => x.HasPurchasedPackage, hasPurchasedPackage }, + { x => x.IsMagicWallet, isMagicWallet }, + { x => x.MagicCeilingFull, magicCeilingFull } }; var dialog = await DialogService.ShowAsync( diff --git a/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor b/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor index b55951d..b0fb437 100644 --- a/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor +++ b/src/FrontOffice.Main/Shared/InsufficientCreditDialog.razor @@ -11,9 +11,24 @@ @if (AllowChargeCredit) { - - برای تکمیل این سفارش، موجودی اصلی شما کافی نیست. می‌توانید کیف پول را شارژ کنید و سپس سفارش را ثبت کنید. - + @if (IsMagicWallet && !MagicCeilingFull) + { + + برای تکمیل این سفارش موجودی شما کافی نیست. کیف پول شما در حالت جادویی است؛ برای دریافت ضریب، از مسیر شارژ جادویی اقدام کنید. + + } + else if (IsMagicWallet && MagicCeilingFull) + { + + سقف شارژ جادویی شما در این دور پر است. می‌توانید به‌صورت استثنایی کیف اصلی را بدون ضریب (۱:۱) شارژ کنید. + + } + else + { + + برای تکمیل این سفارش، موجودی اصلی شما کافی نیست. می‌توانید کیف پول را شارژ کنید و سپس سفارش را ثبت کنید. + + } } else { @@ -46,10 +61,10 @@ @if (AllowChargeCredit) { - شارژ حساب اصلی + @ChargeButtonLabel } else if (!HasPurchasedPackage) @@ -93,9 +108,33 @@ [Parameter] public bool HasPurchasedPackage { get; set; } + [Parameter] + public bool IsMagicWallet { get; set; } + + /// سقف واریز جادویی این دور پر شده است. + [Parameter] + public bool MagicCeilingFull { get; set; } + + private string ChargeButtonLabel => + IsMagicWallet && !MagicCeilingFull + ? "شارژ کیف جادویی" + : IsMagicWallet && MagicCeilingFull + ? "شارژ عادی بدون ضریب (سقف جادویی پر است)" + : "شارژ حساب اصلی"; + private void Cancel() => MudDialog.Cancel(); - private void GoToCharge() => MudDialog.Close(DialogResult.Ok(ShortfallAmount)); + private void GoToCharge() + { + if (IsMagicWallet && !MagicCeilingFull) + { + MudDialog.Cancel(); + Navigation.NavigateTo(RouteConstants.Profile.MagicWallet); + return; + } + + MudDialog.Close(DialogResult.Ok(ShortfallAmount)); + } private void GoToPackages() {