Pretty names of payment methods isn't provided by CheckoutExtensions

This commit is contained in:
nicolas.dorier 2024-10-14 21:13:43 +09:00
parent 0bf75d52d7
commit c43721d489
No known key found for this signature in database
GPG key ID: 6618763EF09186FE
11 changed files with 26 additions and 22 deletions

View file

@ -297,6 +297,10 @@ namespace BTCPayServer
{
return services.AddDefaultTransactions(keyValues.Select(k => KeyValuePair.Create<string, string?>(k, string.Empty)).ToArray());
}
public static IServiceCollection AddDefaultPrettyName(this IServiceCollection services, PaymentMethodId paymentMethodId, string defaultPrettyName)
{
return services.AddDefaultTransactions(KeyValuePair.Create<string, string?>(PrettyNameProvider.GetTranslationKey(paymentMethodId), defaultPrettyName));
}
public static IServiceCollection AddDefaultTransactions(this IServiceCollection services, params KeyValuePair<string, string?>[] keyValues)
{
services.AddSingleton<IDefaultTransactionProvider>(new InMemoryDefaultTransactionProvider(keyValues));

View file

@ -624,6 +624,7 @@ o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.P
// BTC
{
var pmi = PaymentTypes.CHAIN.GetPaymentMethodId(network.CryptoCode);
services.AddDefaultPrettyName(pmi, network.DisplayName);
services.AddSingleton<BTCPayNetworkBase>(network);
services.AddSingleton<IPaymentMethodHandler>(provider =>
(BitcoinLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinLikePaymentHandler), new object[] { network, pmi }));
@ -631,7 +632,6 @@ o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.P
(IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentLinkExtension), new object[] { network, pmi }));
services.AddSingleton<ICheckoutModelExtension>(provider =>
(BitcoinCheckoutModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinCheckoutModelExtension), new object[] { network, pmi }));
services.AddDefaultTransactions(network.DisplayName);
services.AddSingleton<IPaymentMethodBitpayAPIExtension>(provider =>
(IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentMethodBitpayAPIExtension), new object[] { pmi }));
@ -647,6 +647,10 @@ o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.P
// LN
{
var pmi = PaymentTypes.LN.GetPaymentMethodId(network.CryptoCode);
if (network.IsBTC)
services.AddDefaultPrettyName(pmi, "Lightning");
else
services.AddDefaultPrettyName(pmi, $"Lightning ({network.DisplayName})");
services.AddSingleton<IPaymentMethodHandler>(provider =>
(LightningLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LightningLikePaymentHandler), new object[] { network, pmi }));
services.AddSingleton<IPaymentLinkExtension>(provider =>
@ -662,6 +666,10 @@ o.GetRequiredService<IEnumerable<IPaymentLinkExtension>>().ToDictionary(o => o.P
// LNURL
{
var pmi = PaymentTypes.LNURL.GetPaymentMethodId(network.CryptoCode);
if (network.IsBTC)
services.AddDefaultPrettyName(pmi, "Lightning (via LNURL)");
else
services.AddDefaultPrettyName(pmi, $"Lightning ({network.DisplayName} via LNURL)");
services.AddSingleton<IPaymentMethodHandler>(provider =>
(LNURLPayPaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentHandler), new object[] { network, pmi }));
services.AddSingleton<IPaymentLinkExtension>(provider =>

View file

@ -18,7 +18,6 @@ namespace BTCPayServer.Payments.Bitcoin
public const string CheckoutBodyComponentName = "BitcoinCheckoutBody";
private readonly PaymentMethodHandlerDictionary _handlers;
private readonly BTCPayNetwork _Network;
private readonly IStringLocalizer StringLocalizer;
private readonly DisplayFormatter _displayFormatter;
private readonly IPaymentLinkExtension paymentLinkExtension;
private readonly IPaymentLinkExtension? lnPaymentLinkExtension;
@ -28,7 +27,6 @@ namespace BTCPayServer.Payments.Bitcoin
public BitcoinCheckoutModelExtension(
PaymentMethodId paymentMethodId,
BTCPayNetwork network,
IStringLocalizer stringLocalizer,
IEnumerable<IPaymentLinkExtension> paymentLinkExtensions,
DisplayFormatter displayFormatter,
PaymentMethodHandlerDictionary handlers)
@ -36,7 +34,6 @@ namespace BTCPayServer.Payments.Bitcoin
PaymentMethodId = paymentMethodId;
_handlers = handlers;
_Network = network;
StringLocalizer = stringLocalizer;
_displayFormatter = displayFormatter;
paymentLinkExtension = paymentLinkExtensions.Single(p => p.PaymentMethodId == PaymentMethodId);
var lnPmi = PaymentTypes.LN.GetPaymentMethodId(network.CryptoCode);
@ -45,7 +42,6 @@ namespace BTCPayServer.Payments.Bitcoin
lnurlPaymentLinkExtension = paymentLinkExtensions.SingleOrDefault(p => p.PaymentMethodId == lnurlPmi);
_bech32Prefix = network.NBitcoinNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false) is { } enc ? Encoders.ASCII.EncodeData(enc.HumanReadablePart) : null;
}
public string DisplayName => StringLocalizer[_Network.DisplayName];
public string Image => _Network.CryptoImagePath;
public string Badge => "";
public PaymentMethodId PaymentMethodId { get; }

View file

@ -15,7 +15,6 @@ namespace BTCPayServer.Payments
public interface ICheckoutModelExtension
{
public PaymentMethodId PaymentMethodId { get; }
string DisplayName { get; }
string Image { get; }
string Badge { get; }
void ModifyCheckoutModel(CheckoutModelContext context);

View file

@ -23,7 +23,6 @@ namespace BTCPayServer.Payments.LNURLPay
paymentLinkExtension = paymentLinkExtensions.Single(p => p.PaymentMethodId == PaymentMethodId);
handler = (LNURLPayPaymentHandler)handlers[PaymentMethodId];
var isBTC = PaymentTypes.LNURL.GetPaymentMethodId("BTC") == paymentMethodId;
DisplayName = isBTC ? "Lightning (via LNURL)" : $"Lightning ({network.DisplayName} via LNURL)";
}
public PaymentMethodId PaymentMethodId { get; }
@ -32,7 +31,6 @@ namespace BTCPayServer.Payments.LNURLPay
private readonly IPaymentLinkExtension paymentLinkExtension;
private readonly LNURLPayPaymentHandler handler;
public string DisplayName { get; }
public string Image => _network.LightningImagePath;
public string Badge => "⚡";

View file

@ -15,7 +15,6 @@ namespace BTCPayServer.Payments.Lightning
public const string CheckoutBodyComponentName = "LightningCheckoutBody";
private readonly DisplayFormatter _displayFormatter;
IPaymentLinkExtension _PaymentLinkExtension;
private readonly bool isBTC;
public LNCheckoutModelExtension(
PaymentMethodId paymentMethodId,
@ -31,7 +30,6 @@ namespace BTCPayServer.Payments.Lightning
Handlers = handlers;
PaymentMethodId = paymentMethodId;
_PaymentLinkExtension = paymentLinkExtensions.Single(p => p.PaymentMethodId == PaymentMethodId);
isBTC = PaymentTypes.LN.GetPaymentMethodId("BTC") == paymentMethodId;
}
public BTCPayNetwork Network { get; }
@ -39,8 +37,6 @@ namespace BTCPayServer.Payments.Lightning
public PaymentMethodHandlerDictionary Handlers { get; }
public PaymentMethodId PaymentMethodId { get; }
public string DisplayName => isBTC ? StringLocalizer["Lightning"] : StringLocalizer["Lightning ({0})", Network.DisplayName];
public string Image => Network.LightningImagePath;
public string Badge => "⚡";
public void ModifyCheckoutModel(CheckoutModelContext context)
@ -55,7 +51,7 @@ namespace BTCPayServer.Payments.Lightning
if (context.Model.InvoiceBitcoinUrl is not null)
context.Model.InvoiceBitcoinUrlQR = $"lightning:{context.Model.InvoiceBitcoinUrl.ToUpperInvariant()?.Substring("LIGHTNING:".Length)}";
context.Model.PeerInfo = handler.ParsePaymentPromptDetails(paymentPrompt.Details).NodeInfo;
if (context.StoreBlob.LightningAmountInSatoshi && isBTC)
if (context.StoreBlob.LightningAmountInSatoshi && Network.IsBTC)
{
BitcoinCheckoutModelExtension.PreparePaymentModelForAmountInSats(context.Model, paymentPrompt.Rate, _displayFormatter);
}

View file

@ -40,6 +40,7 @@ public partial class AltcoinsPlugin
? "https://www.exploremonero.com/transaction/{0}"
: "https://testnet.xmrchain.net/tx/{0}";
var pmi = PaymentTypes.CHAIN.GetPaymentMethodId("XMR");
services.AddDefaultPrettyName(pmi, network.DisplayName);
services.AddBTCPayNetwork(network)
.AddTransactionLinkProvider(pmi, new SimpleTransactionLinkProvider(blockExplorerLink));

View file

@ -41,6 +41,7 @@ public partial class AltcoinsPlugin
? "https://www.exploreZcash.com/transaction/{0}"
: "https://testnet.xmrchain.net/tx/{0}";
var pmi = PaymentTypes.CHAIN.GetPaymentMethodId("ZEC");
services.AddDefaultPrettyName(pmi, network.DisplayName);
services.AddBTCPayNetwork(network)
.AddTransactionLinkProvider(pmi, new SimpleTransactionLinkProvider(blockExplorerLink));

View file

@ -27,8 +27,6 @@ namespace BTCPayServer.Services.Altcoins.Monero.Payments
}
public PaymentMethodId PaymentMethodId { get; }
public string DisplayName => _network.DisplayName;
public string Image => _network.CryptoImagePath;
public string Badge => "";

View file

@ -27,8 +27,6 @@ namespace BTCPayServer.Services.Altcoins.Zcash.Payments
}
public PaymentMethodId PaymentMethodId { get; }
public string DisplayName => _network.DisplayName;
public string Image => _network.CryptoImagePath;
public string Badge => "";

View file

@ -1,23 +1,28 @@
#nullable enable
using System.Collections.Generic;
using BTCPayServer.Payments;
using Microsoft.Extensions.Localization;
namespace BTCPayServer.Services
{
public class PrettyNameProvider
{
private readonly Dictionary<PaymentMethodId, ICheckoutModelExtension> _extensions;
public static string GetTranslationKey(PaymentMethodId paymentMethodId) => $"PrettyName({paymentMethodId})";
private readonly IStringLocalizer _stringLocalizer;
public PrettyNameProvider(Dictionary<PaymentMethodId, ICheckoutModelExtension> extensions)
public PrettyNameProvider(IStringLocalizer stringLocalizer)
{
_extensions = extensions;
_stringLocalizer = stringLocalizer;
}
public string PrettyName(PaymentMethodId paymentMethodId)
{
if (paymentMethodId is null)
return "<NULL>";
_extensions.TryGetValue(paymentMethodId, out var n);
return n?.DisplayName ?? paymentMethodId.ToString();
var key = GetTranslationKey(paymentMethodId);
var result = _stringLocalizer[key]?.Value;
if (string.IsNullOrEmpty(result) || result == key)
return paymentMethodId.ToString();
return result;
}
}
}