fix: address CodeRabbit review feedback

This commit is contained in:
Forte11Cuba
2026-03-29 04:06:56 -06:00
parent 0ed49789d0
commit d91a40c41d
26 changed files with 105 additions and 24 deletions
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "Bezahle...",
"paymentRequestSuccess": "Zahlung erfolgreich gesendet",
"paymentRequestNoTransport": "Diese Anfrage hat keine konfigurierte Zustellmethode",
"paymentRequestTransport": "Transport",
"paymentRequestMintNotAccepted": "Dein aktiver Mint ist nicht in der Liste der akzeptierten Mints",
"paymentRequestUnitMismatch": "Inkompatible Einheit: Anfrage erfordert {unit}",
"paymentRequestInsufficientBalance": "Unzureichendes Guthaben",
+6
View File
@@ -400,8 +400,14 @@
"paymentRequestPaying": "Paying...",
"paymentRequestSuccess": "Payment sent successfully",
"paymentRequestNoTransport": "This request has no delivery method configured",
"paymentRequestTransport": "Transport",
"paymentRequestMintNotAccepted": "Your active mint is not in the list of accepted mints",
"paymentRequestUnitMismatch": "Incompatible unit: request requires {unit}",
"@paymentRequestUnitMismatch": {
"placeholders": {
"unit": { "type": "String" }
}
},
"paymentRequestInsufficientBalance": "Insufficient balance",
"paymentRequestErrorParsing": "Error reading payment request",
+1
View File
@@ -520,6 +520,7 @@
"paymentRequestPaying": "Pagando...",
"paymentRequestSuccess": "Pago enviado correctamente",
"paymentRequestNoTransport": "Esta solicitud no tiene método de entrega configurado",
"paymentRequestTransport": "Transporte",
"paymentRequestMintNotAccepted": "Tu mint activo no está en la lista de mints aceptados",
"paymentRequestUnitMismatch": "Unidad incompatible: la solicitud requiere {unit}",
"@paymentRequestUnitMismatch": {
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "Paiement en cours...",
"paymentRequestSuccess": "Paiement envoyé avec succès",
"paymentRequestNoTransport": "Cette demande n'a pas de méthode de livraison configurée",
"paymentRequestTransport": "Transport",
"paymentRequestMintNotAccepted": "Votre mint actif n'est pas dans la liste des mints acceptés",
"paymentRequestUnitMismatch": "Unité incompatible : la demande nécessite {unit}",
"paymentRequestInsufficientBalance": "Solde insuffisant",
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "Pagamento in corso...",
"paymentRequestSuccess": "Pagamento inviato con successo",
"paymentRequestNoTransport": "Questa richiesta non ha un metodo di consegna configurato",
"paymentRequestTransport": "Trasporto",
"paymentRequestMintNotAccepted": "Il tuo mint attivo non è nella lista dei mint accettati",
"paymentRequestUnitMismatch": "Unità incompatibile: la richiesta richiede {unit}",
"paymentRequestInsufficientBalance": "Saldo insufficiente",
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "支払い中...",
"paymentRequestSuccess": "支払いが正常に送信されました",
"paymentRequestNoTransport": "このリクエストには配信方法が設定されていません",
"paymentRequestTransport": "トランスポート",
"paymentRequestMintNotAccepted": "アクティブなミントは対応ミントリストにありません",
"paymentRequestUnitMismatch": "単位が互換性がありません:リクエストには{unit}が必要です",
"paymentRequestInsufficientBalance": "残高不足",
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "결제 중...",
"paymentRequestSuccess": "결제가 성공적으로 전송되었습니다",
"paymentRequestNoTransport": "이 요청에는 전달 방법이 설정되지 않았습니다",
"paymentRequestTransport": "전송 방식",
"paymentRequestMintNotAccepted": "활성 민트가 허용된 민트 목록에 없습니다",
"paymentRequestUnitMismatch": "호환되지 않는 단위: 요청에 {unit}이(가) 필요합니다",
"paymentRequestInsufficientBalance": "잔액 부족",
+6
View File
@@ -2077,6 +2077,12 @@ abstract class L10n {
/// **'Esta solicitud no tiene método de entrega configurado'**
String get paymentRequestNoTransport;
/// No description provided for @paymentRequestTransport.
///
/// In es, this message translates to:
/// **'Transporte'**
String get paymentRequestTransport;
/// No description provided for @paymentRequestMintNotAccepted.
///
/// In es, this message translates to:
+3
View File
@@ -1093,6 +1093,9 @@ class L10nDe extends L10n {
String get paymentRequestNoTransport =>
'Diese Anfrage hat keine konfigurierte Zustellmethode';
@override
String get paymentRequestTransport => 'Transport';
@override
String get paymentRequestMintNotAccepted =>
'Dein aktiver Mint ist nicht in der Liste der akzeptierten Mints';
+3
View File
@@ -1080,6 +1080,9 @@ class L10nEn extends L10n {
String get paymentRequestNoTransport =>
'This request has no delivery method configured';
@override
String get paymentRequestTransport => 'Transport';
@override
String get paymentRequestMintNotAccepted =>
'Your active mint is not in the list of accepted mints';
+3
View File
@@ -1085,6 +1085,9 @@ class L10nEs extends L10n {
String get paymentRequestNoTransport =>
'Esta solicitud no tiene método de entrega configurado';
@override
String get paymentRequestTransport => 'Transporte';
@override
String get paymentRequestMintNotAccepted =>
'Tu mint activo no está en la lista de mints aceptados';
+3
View File
@@ -1098,6 +1098,9 @@ class L10nFr extends L10n {
String get paymentRequestNoTransport =>
'Cette demande n\'a pas de méthode de livraison configurée';
@override
String get paymentRequestTransport => 'Transport';
@override
String get paymentRequestMintNotAccepted =>
'Votre mint actif n\'est pas dans la liste des mints acceptés';
+3
View File
@@ -1088,6 +1088,9 @@ class L10nIt extends L10n {
String get paymentRequestNoTransport =>
'Questa richiesta non ha un metodo di consegna configurato';
@override
String get paymentRequestTransport => 'Trasporto';
@override
String get paymentRequestMintNotAccepted =>
'Il tuo mint attivo non è nella lista dei mint accettati';
+3
View File
@@ -1067,6 +1067,9 @@ class L10nJa extends L10n {
@override
String get paymentRequestNoTransport => 'このリクエストには配信方法が設定されていません';
@override
String get paymentRequestTransport => 'トランスポート';
@override
String get paymentRequestMintNotAccepted => 'アクティブなミントは対応ミントリストにありません';
+3
View File
@@ -1069,6 +1069,9 @@ class L10nKo extends L10n {
@override
String get paymentRequestNoTransport => '이 요청에는 전달 방법이 설정되지 않았습니다';
@override
String get paymentRequestTransport => '전송 방식';
@override
String get paymentRequestMintNotAccepted => '활성 민트가 허용된 민트 목록에 없습니다';
+3
View File
@@ -1087,6 +1087,9 @@ class L10nPt extends L10n {
String get paymentRequestNoTransport =>
'Esta solicitação não tem método de entrega configurado';
@override
String get paymentRequestTransport => 'Transporte';
@override
String get paymentRequestMintNotAccepted =>
'Seu mint ativo não está na lista de mints aceitos';
+3
View File
@@ -1084,6 +1084,9 @@ class L10nRu extends L10n {
String get paymentRequestNoTransport =>
'В этом запросе не настроен метод доставки';
@override
String get paymentRequestTransport => 'Транспорт';
@override
String get paymentRequestMintNotAccepted =>
'Ваш активный минт не в списке принимаемых';
+3
View File
@@ -1087,6 +1087,9 @@ class L10nSw extends L10n {
String get paymentRequestNoTransport =>
'Ombi hili halina njia ya uwasilishaji iliyosanidiwa';
@override
String get paymentRequestTransport => 'Njia ya usafirishaji';
@override
String get paymentRequestMintNotAccepted =>
'Mint yako hai haiko kwenye orodha ya mint zinazokubaliwa';
+6 -3
View File
@@ -1046,10 +1046,10 @@ class L10nZh extends L10n {
String get paymentRequestDescription => '描述';
@override
String get paymentRequestMints => '接受的铸';
String get paymentRequestMints => '接受的铸';
@override
String get paymentRequestAnyMint => '任何铸';
String get paymentRequestAnyMint => '任何铸';
@override
String get paymentRequestPay => '支付';
@@ -1064,7 +1064,10 @@ class L10nZh extends L10n {
String get paymentRequestNoTransport => '此请求未配置交付方式';
@override
String get paymentRequestMintNotAccepted => '您的活跃铸币厂不在接受的铸币厂列表中';
String get paymentRequestTransport => '传输方式';
@override
String get paymentRequestMintNotAccepted => '您的活跃铸造厂不在接受的铸造厂列表中';
@override
String paymentRequestUnitMismatch(String unit) {
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "Pagando...",
"paymentRequestSuccess": "Pagamento enviado com sucesso",
"paymentRequestNoTransport": "Esta solicitação não tem método de entrega configurado",
"paymentRequestTransport": "Transporte",
"paymentRequestMintNotAccepted": "Seu mint ativo não está na lista de mints aceitos",
"paymentRequestUnitMismatch": "Unidade incompatível: a solicitação requer {unit}",
"paymentRequestInsufficientBalance": "Saldo insuficiente",
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "Оплата...",
"paymentRequestSuccess": "Платёж успешно отправлен",
"paymentRequestNoTransport": "В этом запросе не настроен метод доставки",
"paymentRequestTransport": "Транспорт",
"paymentRequestMintNotAccepted": "Ваш активный минт не в списке принимаемых",
"paymentRequestUnitMismatch": "Несовместимая единица: запрос требует {unit}",
"paymentRequestInsufficientBalance": "Недостаточный баланс",
+1
View File
@@ -512,6 +512,7 @@
"paymentRequestPaying": "Inalipa...",
"paymentRequestSuccess": "Malipo yametumwa kwa mafanikio",
"paymentRequestNoTransport": "Ombi hili halina njia ya uwasilishaji iliyosanidiwa",
"paymentRequestTransport": "Njia ya usafirishaji",
"paymentRequestMintNotAccepted": "Mint yako hai haiko kwenye orodha ya mint zinazokubaliwa",
"paymentRequestUnitMismatch": "Kitengo kisichooana: ombi linahitaji {unit}",
"paymentRequestInsufficientBalance": "Salio haitoshi",
+4 -3
View File
@@ -506,13 +506,14 @@
"paymentRequestFrom": "来自",
"paymentRequestAmount": "请求金额",
"paymentRequestDescription": "描述",
"paymentRequestMints": "接受的铸厂",
"paymentRequestAnyMint": "任何铸厂",
"paymentRequestMints": "接受的铸厂",
"paymentRequestAnyMint": "任何铸厂",
"paymentRequestPay": "支付",
"paymentRequestPaying": "支付中...",
"paymentRequestSuccess": "付款发送成功",
"paymentRequestNoTransport": "此请求未配置交付方式",
"paymentRequestMintNotAccepted": "您的活跃铸币厂不在接受的铸币厂列表中",
"paymentRequestTransport": "传输方式",
"paymentRequestMintNotAccepted": "您的活跃铸造厂不在接受的铸造厂列表中",
"paymentRequestUnitMismatch": "单位不兼容:请求需要 {unit}",
"paymentRequestInsufficientBalance": "余额不足",
"paymentRequestErrorParsing": "读取付款请求时出错",
@@ -158,18 +158,17 @@ class _PaymentRequestScreenState extends State<PaymentRequestScreen> {
: info.mints.map((m) => Uri.parse(m).host).join(', '),
),
const SizedBox(height: 12),
// Transporte
_buildDetailRow(
LucideIcons.send,
'Transport',
info.transports.isEmpty
? 'In-band'
: info.transports
.map((t) => t.transportType == 'nostr' ? 'Nostr (NIP-17)' : 'HTTP POST')
.join(', '),
),
// Transporte (solo mostrar si hay transporte configurado)
if (info.transports.isNotEmpty) ...[
const SizedBox(height: 12),
_buildDetailRow(
LucideIcons.send,
l10n.paymentRequestTransport,
info.transports
.map((t) => t.transportType == 'nostr' ? 'Nostr (NIP-17)' : 'HTTP POST')
.join(', '),
),
],
],
),
),
@@ -205,7 +204,7 @@ class _PaymentRequestScreenState extends State<PaymentRequestScreen> {
text: _isPaying ? l10n.paymentRequestPaying : l10n.paymentRequestPay,
icon: LucideIcons.zap,
isLoading: _isPaying,
onPressed: (unitMismatch || mintNotAccepted || !hasTransport || _isPaying)
onPressed: (!hasTransport || _isPaying)
? null
: _pay,
),
@@ -1000,6 +1000,7 @@ class _ReceiveScreenState extends State<ReceiveScreen> {
_isValidToken = false;
_tokenInfo = null;
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
Navigator.pushReplacement(
context,
MaterialPageRoute(
+31 -5
View File
@@ -98,20 +98,46 @@ fn parse_payment_request_inner(encoded: String) -> Result<PaymentRequestInfo, Er
/// Extract creq parameter from a BIP-321 bitcoin: URI.
/// e.g. "bitcoin:?creq=CREQB1...&lightning=lnbc..." → "CREQB1..."
/// Handles percent-encoding and case-insensitive key matching.
fn extract_creq_from_uri(input: &str) -> Option<String> {
let lower = input.to_lowercase();
if !lower.starts_with("bitcoin:") {
if !input
.get(..8)
.is_some_and(|scheme| scheme.eq_ignore_ascii_case("bitcoin:"))
{
return None;
}
let query = input.splitn(2, '?').nth(1)?;
let query = input.split_once('?')?.1;
for param in query.split('&') {
if param.len() > 5 && param[..5].eq_ignore_ascii_case("creq=") {
return Some(param[5..].to_string());
let (key, value) = param.split_once('=')?;
if key.eq_ignore_ascii_case("creq") {
return Some(percent_decode(value));
}
}
None
}
/// Simple percent-decoding for URI query values.
fn percent_decode(value: &str) -> String {
let bytes = value.as_bytes();
let mut out = Vec::with_capacity(bytes.len());
let mut i = 0;
while i < bytes.len() {
if bytes[i] == b'%' && i + 2 < bytes.len() {
if let Ok(byte) = u8::from_str_radix(
std::str::from_utf8(&bytes[i + 1..i + 3]).unwrap_or(""),
16,
) {
out.push(byte);
i += 3;
continue;
}
}
out.push(bytes[i]);
i += 1;
}
String::from_utf8(out).unwrap_or_else(|_| value.to_string())
}
// ========================================================================
// Payment execution
// ========================================================================