From d91a40c41df624486338897d07efdc9e28c5deef Mon Sep 17 00:00:00 2001 From: Forte11Cuba Date: Sun, 29 Mar 2026 04:06:56 -0600 Subject: [PATCH] fix: address CodeRabbit review feedback --- lib/l10n/app_de.arb | 1 + lib/l10n/app_en.arb | 6 ++++ lib/l10n/app_es.arb | 1 + lib/l10n/app_fr.arb | 1 + lib/l10n/app_it.arb | 1 + lib/l10n/app_ja.arb | 1 + lib/l10n/app_ko.arb | 1 + lib/l10n/app_localizations.dart | 6 ++++ lib/l10n/app_localizations_de.dart | 3 ++ lib/l10n/app_localizations_en.dart | 3 ++ lib/l10n/app_localizations_es.dart | 3 ++ lib/l10n/app_localizations_fr.dart | 3 ++ lib/l10n/app_localizations_it.dart | 3 ++ lib/l10n/app_localizations_ja.dart | 3 ++ lib/l10n/app_localizations_ko.dart | 3 ++ lib/l10n/app_localizations_pt.dart | 3 ++ lib/l10n/app_localizations_ru.dart | 3 ++ lib/l10n/app_localizations_sw.dart | 3 ++ lib/l10n/app_localizations_zh.dart | 9 +++-- lib/l10n/app_pt.arb | 1 + lib/l10n/app_ru.arb | 1 + lib/l10n/app_sw.arb | 1 + lib/l10n/app_zh.arb | 7 ++-- .../payment_request_screen.dart | 25 +++++++------ lib/screens/4_receive/receive_screen.dart | 1 + rust/src/api/payment_request.rs | 36 ++++++++++++++++--- 26 files changed, 105 insertions(+), 24 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index a3238c6..663efed 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -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", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index efb0a24..8952211 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -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", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index c2bfde5..97f36ca 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -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": { diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 2c67c3f..cff0ba8 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -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", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index c176f5f..381be3d 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -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", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 23f4d76..51e1832 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -512,6 +512,7 @@ "paymentRequestPaying": "支払い中...", "paymentRequestSuccess": "支払いが正常に送信されました", "paymentRequestNoTransport": "このリクエストには配信方法が設定されていません", + "paymentRequestTransport": "トランスポート", "paymentRequestMintNotAccepted": "アクティブなミントは対応ミントリストにありません", "paymentRequestUnitMismatch": "単位が互換性がありません:リクエストには{unit}が必要です", "paymentRequestInsufficientBalance": "残高不足", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 8f304b3..20c06a3 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -512,6 +512,7 @@ "paymentRequestPaying": "결제 중...", "paymentRequestSuccess": "결제가 성공적으로 전송되었습니다", "paymentRequestNoTransport": "이 요청에는 전달 방법이 설정되지 않았습니다", + "paymentRequestTransport": "전송 방식", "paymentRequestMintNotAccepted": "활성 민트가 허용된 민트 목록에 없습니다", "paymentRequestUnitMismatch": "호환되지 않는 단위: 요청에 {unit}이(가) 필요합니다", "paymentRequestInsufficientBalance": "잔액 부족", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 4bdcd5c..3f08ba6 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -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: diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index b885a45..609766a 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -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'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index f4c28e1..a04bcda 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -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'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 4cc69fc..543722e 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -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'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 4a9907c..fb6f0e8 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -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'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index f04a892..2456ea9 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -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'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index c289e97..70fdb46 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -1067,6 +1067,9 @@ class L10nJa extends L10n { @override String get paymentRequestNoTransport => 'このリクエストには配信方法が設定されていません'; + @override + String get paymentRequestTransport => 'トランスポート'; + @override String get paymentRequestMintNotAccepted => 'アクティブなミントは対応ミントリストにありません'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 33e6d8c..a192140 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -1069,6 +1069,9 @@ class L10nKo extends L10n { @override String get paymentRequestNoTransport => '이 요청에는 전달 방법이 설정되지 않았습니다'; + @override + String get paymentRequestTransport => '전송 방식'; + @override String get paymentRequestMintNotAccepted => '활성 민트가 허용된 민트 목록에 없습니다'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 3100e6e..eed8d4d 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -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'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index c977578..a38050a 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -1084,6 +1084,9 @@ class L10nRu extends L10n { String get paymentRequestNoTransport => 'В этом запросе не настроен метод доставки'; + @override + String get paymentRequestTransport => 'Транспорт'; + @override String get paymentRequestMintNotAccepted => 'Ваш активный минт не в списке принимаемых'; diff --git a/lib/l10n/app_localizations_sw.dart b/lib/l10n/app_localizations_sw.dart index 9ee32cc..c9e0104 100644 --- a/lib/l10n/app_localizations_sw.dart +++ b/lib/l10n/app_localizations_sw.dart @@ -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'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 23e2635..8686cf0 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -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) { diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index b30a865..4d8e774 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -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", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 3cdbd2a..9142be0 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -512,6 +512,7 @@ "paymentRequestPaying": "Оплата...", "paymentRequestSuccess": "Платёж успешно отправлен", "paymentRequestNoTransport": "В этом запросе не настроен метод доставки", + "paymentRequestTransport": "Транспорт", "paymentRequestMintNotAccepted": "Ваш активный минт не в списке принимаемых", "paymentRequestUnitMismatch": "Несовместимая единица: запрос требует {unit}", "paymentRequestInsufficientBalance": "Недостаточный баланс", diff --git a/lib/l10n/app_sw.arb b/lib/l10n/app_sw.arb index 9b82e83..132742d 100644 --- a/lib/l10n/app_sw.arb +++ b/lib/l10n/app_sw.arb @@ -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", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index c65eb8c..1749b2c 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -506,13 +506,14 @@ "paymentRequestFrom": "来自", "paymentRequestAmount": "请求金额", "paymentRequestDescription": "描述", - "paymentRequestMints": "接受的铸币厂", - "paymentRequestAnyMint": "任何铸币厂", + "paymentRequestMints": "接受的铸造厂", + "paymentRequestAnyMint": "任何铸造厂", "paymentRequestPay": "支付", "paymentRequestPaying": "支付中...", "paymentRequestSuccess": "付款发送成功", "paymentRequestNoTransport": "此请求未配置交付方式", - "paymentRequestMintNotAccepted": "您的活跃铸币厂不在接受的铸币厂列表中", + "paymentRequestTransport": "传输方式", + "paymentRequestMintNotAccepted": "您的活跃铸造厂不在接受的铸造厂列表中", "paymentRequestUnitMismatch": "单位不兼容:请求需要 {unit}", "paymentRequestInsufficientBalance": "余额不足", "paymentRequestErrorParsing": "读取付款请求时出错", diff --git a/lib/screens/11_payment_request/payment_request_screen.dart b/lib/screens/11_payment_request/payment_request_screen.dart index 0386b84..7d9f417 100644 --- a/lib/screens/11_payment_request/payment_request_screen.dart +++ b/lib/screens/11_payment_request/payment_request_screen.dart @@ -158,18 +158,17 @@ class _PaymentRequestScreenState extends State { : 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 { text: _isPaying ? l10n.paymentRequestPaying : l10n.paymentRequestPay, icon: LucideIcons.zap, isLoading: _isPaying, - onPressed: (unitMismatch || mintNotAccepted || !hasTransport || _isPaying) + onPressed: (!hasTransport || _isPaying) ? null : _pay, ), diff --git a/lib/screens/4_receive/receive_screen.dart b/lib/screens/4_receive/receive_screen.dart index 1f8734c..7276321 100644 --- a/lib/screens/4_receive/receive_screen.dart +++ b/lib/screens/4_receive/receive_screen.dart @@ -1000,6 +1000,7 @@ class _ReceiveScreenState extends State { _isValidToken = false; _tokenInfo = null; WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; Navigator.pushReplacement( context, MaterialPageRoute( diff --git a/rust/src/api/payment_request.rs b/rust/src/api/payment_request.rs index 4faf393..c917b54 100644 --- a/rust/src/api/payment_request.rs +++ b/rust/src/api/payment_request.rs @@ -98,20 +98,46 @@ fn parse_payment_request_inner(encoded: String) -> Result Option { - 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 // ========================================================================