using FrontOffice.Main.Utilities; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using MudBlazor; namespace FrontOffice.Main.Pages.Profile; public partial class ChargeCreditWallet : ComponentBase { private bool _isProcessing; private long _chargeAmount; private string? _paymentResult; private string? _pendingReturnUrl; private readonly long[] _presetAmounts = { 500_000, 1_000_000, 5_000_000, 10_000_000, 20_000_000, 50_000_000 }; [SupplyParameterFromQuery(Name = "payment")] public string? PaymentQueryParam { get; set; } [SupplyParameterFromQuery(Name = "amount")] public long? AmountQueryParam { get; set; } [SupplyParameterFromQuery(Name = "returnUrl")] public string? ReturnUrlQueryParam { get; set; } protected override void OnInitialized() { _paymentResult = PaymentQueryParam; if (AmountQueryParam is > 0) _chargeAmount = CreditChargeNavigation.NormalizeChargeAmount(AmountQueryParam.Value); if (CreditChargeNavigation.IsValidReturnUrl(ReturnUrlQueryParam)) _pendingReturnUrl = ReturnUrlQueryParam; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && !string.IsNullOrEmpty(_pendingReturnUrl)) { await CreditChargeNavigation.SaveReturnUrlAsync(JSRuntime, _pendingReturnUrl); } await base.OnAfterRenderAsync(firstRender); } private async Task StartCreditCharge() { if (_chargeAmount <= 0 || _isProcessing) return; _isProcessing = true; StateHasChanged(); try { if (!string.IsNullOrEmpty(_pendingReturnUrl)) await CreditChargeNavigation.SaveReturnUrlAsync(JSRuntime, _pendingReturnUrl); else { var storedReturnUrl = await CreditChargeNavigation.GetReturnUrlAsync(JSRuntime); if (CreditChargeNavigation.IsValidReturnUrl(storedReturnUrl)) _pendingReturnUrl = storedReturnUrl; } var (success, gatewayUrl, error) = await WalletService.InitiateCreditChargeAsync(_chargeAmount); if (success && !string.IsNullOrEmpty(gatewayUrl)) { Navigation.NavigateTo(gatewayUrl, forceLoad: true); } else { Snackbar.Add(error ?? "خطا در ایجاد درخواست پرداخت", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"خطا: {ex.Message}", Severity.Error); } finally { _isProcessing = false; StateHasChanged(); } } private async Task ContinueShoppingAsync() { var returnUrl = await CreditChargeNavigation.GetReturnUrlAsync(JSRuntime); await CreditChargeNavigation.ClearReturnUrlAsync(JSRuntime); if (CreditChargeNavigation.IsValidReturnUrl(returnUrl)) Navigation.NavigateTo(returnUrl!); } private static string FormatToman(long toman) => string.Format("{0:N0} تومان", toman); }