diff --git a/BTCPayServer/Controllers/UIInvoiceController.UI.cs b/BTCPayServer/Controllers/UIInvoiceController.UI.cs index dc5444209..d8ae2de74 100644 --- a/BTCPayServer/Controllers/UIInvoiceController.UI.cs +++ b/BTCPayServer/Controllers/UIInvoiceController.UI.cs @@ -726,7 +726,7 @@ namespace BTCPayServer.Controllers bool isDefaultPaymentId = false; var storeBlob = store.GetStoreBlob(); - var displayedPaymentMethods = invoice.GetPaymentPrompts().Select(p => p.PaymentMethodId).ToList(); + var displayedPaymentMethods = invoice.GetPaymentPrompts().Select(p => p.PaymentMethodId).ToHashSet(); var btcId = PaymentTypes.CHAIN.GetPaymentMethodId("BTC"); @@ -916,33 +916,21 @@ namespace BTCPayServer.Controllers var handler = _handlers[kv.PaymentMethodId]; return new PaymentModel.AvailableCrypto { - Handler = handler, Displayed = displayedPaymentMethods.Contains(kv.PaymentMethodId), PaymentMethodId = kv.PaymentMethodId, - CryptoCode = kv.Currency, - PaymentMethodName = _prettyName.PrettyName(kv.PaymentMethodId), - IsLightning = handler is ILightningPaymentHandler, - CryptoImage = Request.GetRelativePathOrAbsolute(GetPaymentMethodImage(kv.PaymentMethodId)), - Link = Url.Action(nameof(Checkout), - new - { - invoiceId, - paymentMethodId = kv.PaymentMethodId.ToString() - }) + Order = kv.PaymentMethodId switch + { + _ when PaymentTypes.CHAIN.GetPaymentMethodId(_NetworkProvider.DefaultNetwork.CryptoCode) == kv.PaymentMethodId => 0, + _ when PaymentTypes.LN.GetPaymentMethodId(_NetworkProvider.DefaultNetwork.CryptoCode) == kv.PaymentMethodId => 1, + _ when handler is ILightningPaymentHandler => 2, + _ => 3 + } }; - }).Where(c => c.CryptoImage != "/") - .OrderByDescending(a => a.CryptoCode == _NetworkProvider.DefaultNetwork.CryptoCode).ThenBy(a => a.PaymentMethodName).ThenBy(a => a.IsLightning ? 1 : 0) + }) + .OrderBy(a => a.Order) .ToList() }; - foreach (var kv in invoice.GetPaymentPrompts()) - { - if (_paymentModelExtensions.TryGetValue(kv.PaymentMethodId, out var extension) && - _handlers.TryGetValue(kv.PaymentMethodId, out var h)) - { - extension.ModifyPaymentModel(new PaymentModelContext(model, store, storeBlob, invoice, Url, kv, h, paymentMethodId == kv.PaymentMethodId)); - } - } model.PaymentMethodId = paymentMethodId.ToString(); model.OrderAmountFiat = OrderAmountFromInvoice(model.CryptoCode, invoice, DisplayFormatter.CurrencyFormat.Symbol); @@ -957,6 +945,12 @@ namespace BTCPayServer.Controllers var expiration = TimeSpan.FromSeconds(model.ExpirationSeconds); model.TimeLeft = expiration.PrettyPrint(); + + if (_paymentModelExtensions.TryGetValue(paymentMethodId, out var extension) && + _handlers.TryGetValue(paymentMethodId, out var h)) + { + extension.ModifyPaymentModel(new PaymentModelContext(model, store, storeBlob, invoice, Url, prompt, h)); + } return model; } diff --git a/BTCPayServer/Models/InvoicingModels/PaymentModel.cs b/BTCPayServer/Models/InvoicingModels/PaymentModel.cs index 586dd74ad..3170fb04f 100644 --- a/BTCPayServer/Models/InvoicingModels/PaymentModel.cs +++ b/BTCPayServer/Models/InvoicingModels/PaymentModel.cs @@ -14,15 +14,8 @@ namespace BTCPayServer.Models.InvoicingModels { [JsonConverter(typeof(PaymentMethodIdJsonConverter))] public PaymentMethodId PaymentMethodId { get; set; } - public string CryptoImage { get; set; } - public string Link { get; set; } - public string PaymentMethodName { get; set; } - public bool IsLightning { get; set; } - public string CryptoCode { get; set; } public bool Displayed { get; set; } - [JsonIgnore] - public IPaymentMethodHandler Handler { get; internal set; } - + public string Order { get; set; } [JsonExtensionData] public Dictionary AdditionalData { get; set; } = new(); } diff --git a/BTCPayServer/Payments/Bitcoin/BitcoinPaymentModelExtension.cs b/BTCPayServer/Payments/Bitcoin/BitcoinPaymentModelExtension.cs index 25e1fb59c..c0d20cfe0 100644 --- a/BTCPayServer/Payments/Bitcoin/BitcoinPaymentModelExtension.cs +++ b/BTCPayServer/Payments/Bitcoin/BitcoinPaymentModelExtension.cs @@ -47,7 +47,7 @@ namespace BTCPayServer.Payments.Bitcoin public PaymentMethodId PaymentMethodId { get; } public void ModifyPaymentModel(PaymentModelContext context) { - if (context is not { IsSelected: true, Handler: BitcoinLikePaymentHandler handler}) + if (context is not { Handler: BitcoinLikePaymentHandler handler}) return; var prompt = context.Prompt; var details = handler.ParsePaymentPromptDetails(prompt.Details); diff --git a/BTCPayServer/Payments/IPaymentModelExtension.cs b/BTCPayServer/Payments/IPaymentModelExtension.cs index a50755bbe..3881396e7 100644 --- a/BTCPayServer/Payments/IPaymentModelExtension.cs +++ b/BTCPayServer/Payments/IPaymentModelExtension.cs @@ -11,8 +11,7 @@ namespace BTCPayServer.Payments InvoiceEntity InvoiceEntity, IUrlHelper UrlHelper, PaymentPrompt Prompt, - IPaymentMethodHandler Handler, - bool IsSelected); + IPaymentMethodHandler Handler); public interface IPaymentModelExtension { public PaymentMethodId PaymentMethodId { get; } diff --git a/BTCPayServer/Payments/LNURLPay/LNURLPayPaymentModelExtension.cs b/BTCPayServer/Payments/LNURLPay/LNURLPayPaymentModelExtension.cs index d7c2c01f3..016af162f 100644 --- a/BTCPayServer/Payments/LNURLPay/LNURLPayPaymentModelExtension.cs +++ b/BTCPayServer/Payments/LNURLPay/LNURLPayPaymentModelExtension.cs @@ -39,7 +39,7 @@ namespace BTCPayServer.Payments.LNURLPay private const string UriScheme = "lightning:"; public void ModifyPaymentModel(PaymentModelContext context) { - if (context is not { IsSelected: true, Handler: LNURLPayPaymentHandler handler }) + if (context is not { Handler: LNURLPayPaymentHandler handler }) return; var lnurl = paymentLinkExtension.GetPaymentLink(context.Prompt, context.UrlHelper); if (lnurl is not null) diff --git a/BTCPayServer/Payments/Lightning/LightningPaymentModelExtension.cs b/BTCPayServer/Payments/Lightning/LightningPaymentModelExtension.cs index ab113585b..38f4ccb97 100644 --- a/BTCPayServer/Payments/Lightning/LightningPaymentModelExtension.cs +++ b/BTCPayServer/Payments/Lightning/LightningPaymentModelExtension.cs @@ -40,7 +40,7 @@ namespace BTCPayServer.Payments.Lightning public string Badge => "⚡"; public void ModifyPaymentModel(PaymentModelContext context) { - if (context is not { IsSelected: true, Handler: LightningLikePaymentHandler handler }) + if (context is not { Handler: LightningLikePaymentHandler handler }) return; var paymentPrompt = context.InvoiceEntity.GetPaymentPrompt(PaymentMethodId); if (paymentPrompt is null) diff --git a/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroPaymentModelExtension.cs b/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroPaymentModelExtension.cs index cb1c52a9f..734b68776 100644 --- a/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroPaymentModelExtension.cs +++ b/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroPaymentModelExtension.cs @@ -34,7 +34,7 @@ namespace BTCPayServer.Services.Altcoins.Monero.Payments public void ModifyPaymentModel(PaymentModelContext context) { - if (context is not { IsSelected: true, Handler: MoneroLikePaymentMethodHandler handler }) + if (context is not { Handler: MoneroLikePaymentMethodHandler handler }) return; context.Model.CheckoutBodyComponentName = BitcoinPaymentModelExtension.CheckoutBodyComponentName; if (context.Model.Activated) diff --git a/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashPaymentModelExtension.cs b/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashPaymentModelExtension.cs index 6e824274a..aa9d5a14c 100644 --- a/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashPaymentModelExtension.cs +++ b/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashPaymentModelExtension.cs @@ -34,7 +34,7 @@ namespace BTCPayServer.Services.Altcoins.Zcash.Payments public void ModifyPaymentModel(PaymentModelContext context) { - if (context is not { IsSelected: true, Handler: ZcashLikePaymentMethodHandler handler }) + if (context is not { Handler: ZcashLikePaymentMethodHandler handler }) return; context.Model.CheckoutBodyComponentName = BitcoinPaymentModelExtension.CheckoutBodyComponentName; if (context.Model.Activated)