diff --git a/src/FrontOffice.Main/ConfigureServices.cs b/src/FrontOffice.Main/ConfigureServices.cs index d04c3c7..d240d33 100644 --- a/src/FrontOffice.Main/ConfigureServices.cs +++ b/src/FrontOffice.Main/ConfigureServices.cs @@ -6,6 +6,7 @@ using MudBlazor.Services; using System.Text.Json; using System.Text.Json.Serialization; using FrontOffice.BFF.Package.Protobuf.Protos.Package; +using FrontOffice.BFF.Transaction.Protobuf.Protos.Transaction; using FrontOffice.BFF.User.Protobuf.Protos.User; using FrontOffice.BFF.UserAddress.Protobuf.Protos.UserAddress; using FrontOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; diff --git a/src/FrontOffice.Main/Pages/Checkout.razor.cs b/src/FrontOffice.Main/Pages/Checkout.razor.cs index aba6eb3..4fa5192 100644 --- a/src/FrontOffice.Main/Pages/Checkout.razor.cs +++ b/src/FrontOffice.Main/Pages/Checkout.razor.cs @@ -1,6 +1,9 @@ using FrontOffice.BFF.Package.Protobuf.Protos.Package; +using FrontOffice.BFF.Transaction.Protobuf.Protos.Transaction; using FrontOffice.BFF.UserAddress.Protobuf.Protos.UserAddress; +using FrontOffice.BFF.UserOrder.Protobuf.Protos.UserOrder; using FrontOffice.Main.Utilities; +using Google.Protobuf.WellKnownTypes; using Microsoft.AspNetCore.Components; using MudBlazor; using Severity = MudBlazor.Severity; @@ -11,6 +14,8 @@ public partial class Checkout { [Inject] private PackageContract.PackageContractClient PackageClient { get; set; } = default!; [Inject] private UserAddressContract.UserAddressContractClient UserAddressContract { get; set; } = default!; + [Inject] private UserOrderContract.UserOrderContractClient UserOrderContract { get; set; } = default!; + [Inject] private TransactionContract.TransactionContractClient TransactionContract { get; set; } = default!; [Parameter] public long? PackageId { get; set; } @@ -154,14 +159,35 @@ public partial class Checkout try { - // TODO: Implement payment processing with backend - // This is a placeholder for payment integration - await Task.Delay(2000); // Simulate payment processing + // Step 1: Create payment request + var paymentRequest = new PaymentRequestRequest + { + Amount = _finalPrice, + CallbackUrl = $"{Navigation.BaseUri}checkout/callback", + Description = $"خرید پکیج {_selectedPackage.Title}", + Currency = CurrencyEnum.Irt, + Type = TransactionTypeEnum.Real + }; - Snackbar.Add("پرداخت با موفقیت انجام شد!", Severity.Success); + var paymentResponse = await TransactionContract.PaymentRequestAsync(paymentRequest); - // Navigate to success page or order details - Navigation.NavigateTo("/order/success"); + if (string.IsNullOrEmpty(paymentResponse.PaymentGWUrl)) + { + throw new Exception("آدرس درگاه پرداخت دریافت نشد."); + } + + // Step 2: Create user order + var orderRequest = new CreateNewUserOrderRequest + { + Price = _finalPrice, + PackageId = _selectedPackage.Id, + PaymentStatus = false // Will be updated after payment verification + }; + + var orderResponse = await UserOrderContract.CreateNewUserOrderAsync(orderRequest); + + // Step 3: Redirect to payment gateway + Navigation.NavigateTo(paymentResponse.PaymentGWUrl); } catch (Exception ex) { diff --git a/src/FrontOffice.Main/Pages/PackageDetail.razor.cs b/src/FrontOffice.Main/Pages/PackageDetail.razor.cs index beace9a..2cf5251 100644 --- a/src/FrontOffice.Main/Pages/PackageDetail.razor.cs +++ b/src/FrontOffice.Main/Pages/PackageDetail.razor.cs @@ -150,14 +150,12 @@ public partial class PackageDetail : IDisposable try { - // TODO: Implement purchase logic - await Task.Delay(2000); // Simulate API call - - Snackbar.Add("پکیج با موفقیت خریداری شد!", Severity.Success); + // Navigate to checkout page with package ID + Navigation.NavigateTo($"{RouteConstants.Checkout.Index}/{_package.Id}"); } catch (Exception ex) { - Snackbar.Add($"خطا در خرید پکیج: {ex.Message}", Severity.Error); + Snackbar.Add($"خطا در انتقال به صفحه پرداخت: {ex.Message}", Severity.Error); } finally {