From 292ed05248ebb07ccd50f03d1e5f135adca981f0 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Wed, 21 Oct 2026 01:49:24 +0200 Subject: [PATCH 1/3] feat: label the payee as seller on shop requests --- .../wallets/send/SendConfirmScreenTest.kt | 36 +++++++++++++++++++ .../repositories/PaykitPaymentRequestRepo.kt | 6 ++++ .../IncomingPaymentRequestDetailsScreen.kt | 11 +++++- .../screens/wallets/send/SendConfirmScreen.kt | 16 ++++----- .../screens/wallets/usdt/PaykitUsdtReview.kt | 1 + .../screens/wallets/usdt/UsdtSendContent.kt | 19 ++++++++-- .../java/to/bitkit/viewmodels/AppViewModel.kt | 5 +++ app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-b+es+419/strings.xml | 1 + app/src/main/res/values-ca/strings.xml | 1 + app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../PaykitPaymentRequestRepoTest.kt | 10 ++++++ changelog.d/next/1625.changed.md | 1 + 25 files changed, 109 insertions(+), 12 deletions(-) create mode 100644 changelog.d/next/1625.changed.md diff --git a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt index 7c301dfdc9..89ad85d150 100644 --- a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt +++ b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt @@ -340,4 +340,40 @@ class SendConfirmScreenTest { assertEquals(amountBounds, amount.getUnclippedBoundsInRoot()) assertEquals(swipeBounds, swipe.getUnclippedBoundsInRoot()) } + + @Test + fun merchantRequestLabelsThePayeeAsSeller() { + val seller = PubkyProfile.placeholder("seller").copy(name = "Corner Shop") + val state = mutableStateOf( + SendUiState( + amount = 25_000u, + address = "bcrt1qkgfgyxyqhvkdqh04sklnzxphmcds6vft6y7h0r", + isAmountInputValid = true, + payMethod = SendMethod.ONCHAIN, + isPaymentRequest = true, + isMerchantPaymentRequest = true, + contactPaymentProfile = seller, + paymentRequestNote = "Pubky Shop order 1a2b3c4d", + ) + ) + composeTestRule.setContent { + AppThemeSurface { + SendConfirmContent( + uiState = state.value, + isNodeRunning = true, + isLoading = false, + showBiometrics = false, + modifier = Modifier.sheetHeight(), + ) + } + } + + composeTestRule.onNodeWithTag("SendConfirmToggleDetails").performClick() + composeTestRule.onNodeWithText("Seller", ignoreCase = true).performScrollTo().assertIsDisplayed() + composeTestRule.onNodeWithText("Contact", ignoreCase = true).assertDoesNotExist() + + composeTestRule.runOnIdle { state.value = state.value.copy(isMerchantPaymentRequest = false) } + composeTestRule.onNodeWithText("Contact", ignoreCase = true).performScrollTo().assertIsDisplayed() + composeTestRule.onNodeWithText("Seller", ignoreCase = true).assertDoesNotExist() + } } diff --git a/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt b/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt index 430448a937..344f4eb39d 100644 --- a/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt +++ b/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt @@ -103,6 +103,8 @@ data class PaykitPaymentRequest( val paymentDeadlineAt: Instant? = null, val isPaymentInFlight: Boolean = false, val proposalStreamItemId: ULong? = null, + /** Created by a Paykit server for a merchant, such as a Pubky Market order, not by a person's wallet. */ + val isMerchantRequest: Boolean = false, ) { val amountValue: String get() = amount.value @@ -2011,8 +2013,12 @@ private fun PaymentRequestRecord.toPaykitPaymentRequest( paymentProofKind = paymentProofs.lastOrNull()?.let { PaykitPaymentProofKind.fromPaymentEndpointIdentifier(it.paymentEndpointIdentifier) }, + isMerchantRequest = proposalAppId == PAYKIT_SERVER_APP_ID, ) +/** The app id a Paykit server stamps on requests it creates for merchants. */ +private const val PAYKIT_SERVER_APP_ID = "paykit-server" + internal fun PaymentRequestRecord.toPaykitPaymentRequestHistory(now: Instant): PaykitPaymentRequest? { val role = localRole ?: return null if (role == PaymentRequestLocalRole.UNKNOWN) return null diff --git a/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt b/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt index abd80bbfcd..5fc4ae725e 100644 --- a/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt @@ -187,7 +187,16 @@ internal fun IncomingPaymentRequestDetailsContent( ) } VerticalSpacer(20.dp) - Caption13Up(text = stringResource(R.string.wallet__payment_request_contact), color = Colors.White64) + Caption13Up( + text = stringResource( + if (request.isMerchantRequest) { + R.string.wallet__payment_request_seller + } else { + R.string.wallet__payment_request_contact + } + ), + color = Colors.White64, + ) VerticalSpacer(8.dp) Row( verticalAlignment = Alignment.CenterVertically, diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt index 9d9f3d6d11..4c6b22bf3b 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt @@ -602,10 +602,10 @@ private fun OnChainDetails( } SendCell( caption = stringResource( - if (uiState.isOneOffPaymentRequest) { - R.string.wallet__payment_request_contact - } else { - R.string.wallet__send_to + when { + !uiState.isOneOffPaymentRequest -> R.string.wallet__send_to + uiState.isMerchantPaymentRequest -> R.string.wallet__payment_request_seller + else -> R.string.wallet__payment_request_contact } ), modifier = Modifier.weight(1f) @@ -748,10 +748,10 @@ private fun LightningDetails( } SendCell( caption = stringResource( - if (uiState.isOneOffPaymentRequest) { - R.string.wallet__payment_request_contact - } else { - R.string.wallet__send_to + when { + !uiState.isOneOffPaymentRequest -> R.string.wallet__send_to + uiState.isMerchantPaymentRequest -> R.string.wallet__payment_request_seller + else -> R.string.wallet__payment_request_contact } ), modifier = Modifier.weight(1f) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/PaykitUsdtReview.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/PaykitUsdtReview.kt index fc5f533ded..9cb4f18f79 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/PaykitUsdtReview.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/PaykitUsdtReview.kt @@ -124,6 +124,7 @@ fun PaykitUsdtReview( amountEditable = false, isPaymentRequest = uiState.isPaymentRequest, paymentRequestNote = uiState.paymentRequestNote, + isMerchantRequest = uiState.isMerchantPaymentRequest, contact = uiState.contactPaymentProfile, ) } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt index ed5c1a4bfb..f3f88d0a39 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt @@ -123,6 +123,7 @@ internal fun UsdtPaymentContent( amountEditable: Boolean = true, isPaymentRequest: Boolean = false, paymentRequestNote: String? = null, + isMerchantRequest: Boolean = false, contact: PubkyProfile? = null, onDestinationChange: ((UsdtDestination) -> Unit)? = null, destinations: ImmutableList = Env.usdtDestinations.toImmutableList(), @@ -209,6 +210,7 @@ internal fun UsdtPaymentContent( state, isPaymentRequest, paymentRequestNote, + isMerchantRequest, contact, onConfirm, completed, @@ -536,6 +538,7 @@ private fun UsdtConfirmation( state: UsdtSendState, isPaymentRequest: Boolean, paymentRequestNote: String?, + isMerchantRequest: Boolean, contact: PubkyProfile?, onConfirm: () -> Unit, completed: Boolean, @@ -557,6 +560,7 @@ private fun UsdtConfirmation( contact, note, isPaymentRequest, + isMerchantRequest, showDetails, ) { if (!state.busy && !completed) onEditAmount() @@ -640,6 +644,7 @@ private fun UsdtReviewHeader( contact: PubkyProfile?, note: String?, isPaymentRequest: Boolean, + isMerchantRequest: Boolean, showDetails: Boolean, modifier: Modifier = Modifier, onEditAmount: () -> Unit, @@ -652,7 +657,7 @@ private fun UsdtReviewHeader( ) VerticalSpacer(24.dp) if (showDetails) { - UsdtQuoteDetails(quote, contact) + UsdtQuoteDetails(quote, contact, isMerchantRequest) note?.let { VerticalSpacer(16.dp) PaymentRequestInvoiceNote(it) @@ -665,7 +670,7 @@ private fun UsdtReviewHeader( } @Composable -private fun UsdtQuoteDetails(quote: UsdtQuote, contact: PubkyProfile?) { +private fun UsdtQuoteDetails(quote: UsdtQuote, contact: PubkyProfile?, isMerchantRequest: Boolean) { var showFullAddress by rememberSaveable(quote.recipient) { mutableStateOf(false) } Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) { UsdtDetailField(caption = stringResource(R.string.usdt__pay_from), modifier = Modifier.weight(1f)) { @@ -720,7 +725,15 @@ private fun UsdtQuoteDetails(quote: UsdtQuote, contact: PubkyProfile?) { VerticalSpacer(16.dp) } if (contact != null) { - SendCell(caption = stringResource(R.string.wallet__payment_request_contact)) { + SendCell( + caption = stringResource( + if (isMerchantRequest) { + R.string.wallet__payment_request_seller + } else { + R.string.wallet__payment_request_contact + } + ) + ) { Row(verticalAlignment = Alignment.CenterVertically) { PubkyContactAvatar(profile = contact, size = 20.dp) HorizontalSpacer(4.dp) diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index 89c3f602d1..f0c78d9e4a 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -1623,6 +1623,7 @@ class AppViewModel @Inject constructor( resetSendState( isPaymentRequest = true, paymentRequestNote = request.note, + isMerchantPaymentRequest = request.isMerchantRequest, hardwareWalletId = proof.onchainWalletId, incomingPaymentRequestId = request.id, selectedTags = requestedPaymentRequestTags, @@ -4246,6 +4247,7 @@ class AppViewModel @Inject constructor( contactPaymentProfile = contactPaymentProfile, isPaymentRequest = isPaymentRequest, paymentRequestNote = incomingPaymentRequest?.note, + isMerchantPaymentRequest = incomingPaymentRequest?.isMerchantRequest == true, isSubscriptionPayment = incomingPaymentRequest?.billingPeriod != null, isInitialSubscriptionPayment = synchronized(contactPaymentContextLock) { activeContactPaymentContext?.isInitialSubscriptionPayment == true @@ -6601,6 +6603,7 @@ class AppViewModel @Inject constructor( contactPaymentProfile: PubkyProfile? = null, isPaymentRequest: Boolean = false, paymentRequestNote: String? = null, + isMerchantPaymentRequest: Boolean = false, hardwareWalletId: String? = activeHardwareWalletId, isSubscriptionPayment: Boolean = false, isInitialSubscriptionPayment: Boolean = false, @@ -6627,6 +6630,7 @@ class AppViewModel @Inject constructor( contactPaymentProfile = contactPaymentProfile, isPaymentRequest = isPaymentRequest, paymentRequestNote = paymentRequestNote, + isMerchantPaymentRequest = isMerchantPaymentRequest, hardwareWalletId = hardwareWalletId, hardwareWalletName = hardwareWalletId?.let { walletId -> hwWalletRepo.wallets.value.find { it.id == walletId }?.name @@ -8088,6 +8092,7 @@ data class SendUiState( val contactPaymentProfile: PubkyProfile? = null, val isPaymentRequest: Boolean = false, val paymentRequestNote: String? = null, + val isMerchantPaymentRequest: Boolean = false, val paykitUsesUsdt: Boolean = false, val paykitRateUnavailable: Boolean = false, val paykitAmount: String = "", diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index a3729f4157..9f5a92b6c0 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1058,6 +1058,7 @@ رفض المستلم طلب فاتورة Lightning هذا. رفض المستلم دفعة Lightning هذه. تحقق من الفاتورة وحاول مرة أخرى. جهة الاتصال + البائع التاريخ ملاحظة مُرسل diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index 0a7214189c..1b93432695 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -1086,6 +1086,7 @@ El destinatario rechazó esta solicitud de factura Lightning. El destinatario rechazó este pago Lightning. Revise la factura e inténtelo de nuevo. Contacto + Vendedor Fecha Nota Enviado diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 12877bfec5..291cdbd942 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1078,6 +1078,7 @@ El destinatari ha rebutjat aquesta sol·licitud de factura Lightning. El destinatari ha rebutjat aquest pagament Lightning. Comprova la factura i torna-ho a provar. Contacte + Venedor Data Nota Enviat diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 057ac4e371..11a007d00f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1083,6 +1083,7 @@ Příjemce tuto žádost o Lightning fakturu odmítl. Příjemce tuto Lightning platbu odmítl. Zkontrolujte fakturu a zkuste to znovu. Kontakt + Prodejce Datum Poznámka Posláno diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 76f55ebcce..6a14dfd968 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -952,6 +952,7 @@ Der Empfänger hat diese Lightning-Rechnungsanfrage abgelehnt. Der Empfänger hat diese Lightning-Zahlung abgelehnt. Bitte prüfe die Rechnung und versuche es erneut. Kontakt + Verkäufer Datum Notiz Gesendet diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 7716ce9422..180db8db0f 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1065,6 +1065,7 @@ Ο παραλήπτης απέρριψε αυτό το αίτημα τιμολογίου Lightning. Ο παραλήπτης απέρριψε αυτήν την πληρωμή Lightning. Ελέγξτε το τιμολόγιο και δοκιμάστε ξανά. Επαφή + Πωλητής Ημερομηνία Σημείωση Στάλθηκε diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 625c9643ea..b300e42a41 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1079,6 +1079,7 @@ El destinatario ha rechazado esta solicitud de factura Lightning. El destinatario ha rechazado este pago Lightning. Comprueba la factura e inténtalo de nuevo. Contacto + Vendedor Fecha Nota Enviado diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d8e7343e9a..14d6084e2c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -940,6 +940,7 @@ El destinatario ha rechazado esta solicitud de factura Lightning. El destinatario ha rechazado este pago Lightning. Comprueba la factura e inténtalo de nuevo. Contacto + Vendedor Fecha Nota Enviado diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index fb5734cbb9..6f7a53a4fe 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1552,6 +1552,7 @@ Montant Choisir le destinataire Contact + Vendeur Date Ignorer Saisir un pubky diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c3b3b545e1..22ec033faa 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1082,6 +1082,7 @@ Il destinatario ha rifiutato questa richiesta di fattura Lightning. Il destinatario ha rifiutato questo pagamento Lightning. Controlla la fattura e riprova. Contatto + Venditore Data Inviato Orario diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 54dae1eec1..eb78ef22ea 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1554,6 +1554,7 @@ Bedrag Ontvanger kiezen Contact + Verkoper Negeren Voer pubky in Het betaalverzoek is verlopen. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 05f2d1755e..998572080f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -952,6 +952,7 @@ Odbiorca odrzucił to żądanie faktury Lightning. Odbiorca odrzucił tę płatność Lightning. Sprawdź fakturę i spróbuj ponownie. Kontakt + Sprzedawca Data Notatka Wysłano diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index fddc8c369f..2c7b2c3da3 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1086,6 +1086,7 @@ O destinatário rejeitou esta solicitação de fatura Lightning. O destinatário rejeitou este pagamento Lightning. Verifique a fatura e tente novamente. Contato + Vendedor Data Nota Enviado diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 275913a53f..8636549dbf 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -818,6 +818,7 @@ O destinatário rejeitou este pedido de fatura Lightning. O destinatário rejeitou este pagamento Lightning. Verifique a fatura e tente novamente. Contato + Vendedor Data Nota Enviado diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1eac79d7d3..7e79bede18 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1115,6 +1115,7 @@ Bitkit должен увеличить приёмную ёмкость ваше Получатель отклонил этот запрос счета Lightning. Получатель отклонил этот платеж Lightning. Проверьте счет и попробуйте снова. Контакт + Продавец Дата Заметка Исходящие diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d940bcf647..f9bc39db9b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1413,6 +1413,7 @@ Amount Choose Recipient Contact + Seller Date Dismiss Enter pubky diff --git a/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt b/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt index 6a89a8adb2..e3ea273c2b 100644 --- a/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt +++ b/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt @@ -984,6 +984,16 @@ class PaykitPaymentRequestRepoTest : BaseUnitTest(StandardTestDispatcher()) { assertEquals(listOf(MethodId.Bolt11.rawValue), request.acceptedPaymentEndpointIdentifiers) } + @Test + fun `requests created by a paykit server are merchant requests`() { + fun parse(record: PaymentRequestRecord) = + (record.parseIncomingPaykitPaymentRequest(START_TIME) as PaykitPaymentRequestParseResult.Parsed).request + + assertFalse(parse(paymentRequestRecord()).isMerchantRequest) + assertTrue(parse(paymentRequestRecord().copy(proposalAppId = "paykit-server")).isMerchantRequest) + assertFalse(parse(paymentRequestRecord().copy(proposalAppId = "marketplace")).isMerchantRequest) + } + @Test fun `absolute payment deadlines preserve fractional seconds and include the deadline instant`() { val deadline = START_TIME + 123.milliseconds diff --git a/changelog.d/next/1625.changed.md b/changelog.d/next/1625.changed.md new file mode 100644 index 0000000000..babbd0ba33 --- /dev/null +++ b/changelog.d/next/1625.changed.md @@ -0,0 +1 @@ +Payment requests from a shop now label the payee as Seller instead of Contact. From f0f57f64ef80450629c08f17398986c55a7ca726 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Wed, 21 Oct 2026 02:28:13 +0200 Subject: [PATCH 2/3] fix: label only incoming shop requests as seller --- .../java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt | 4 ++-- .../to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt | 2 ++ journeys/payment-requests/issuer-interoperability.xml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt b/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt index 344f4eb39d..cd6c44dd64 100644 --- a/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt +++ b/app/src/main/java/to/bitkit/repositories/PaykitPaymentRequestRepo.kt @@ -103,7 +103,7 @@ data class PaykitPaymentRequest( val paymentDeadlineAt: Instant? = null, val isPaymentInFlight: Boolean = false, val proposalStreamItemId: ULong? = null, - /** Created by a Paykit server for a merchant, such as a Pubky Market order, not by a person's wallet. */ + /** An incoming request a Paykit server created for a merchant, such as a Pubky Market order. */ val isMerchantRequest: Boolean = false, ) { val amountValue: String get() = amount.value @@ -2013,7 +2013,7 @@ private fun PaymentRequestRecord.toPaykitPaymentRequest( paymentProofKind = paymentProofs.lastOrNull()?.let { PaykitPaymentProofKind.fromPaymentEndpointIdentifier(it.paymentEndpointIdentifier) }, - isMerchantRequest = proposalAppId == PAYKIT_SERVER_APP_ID, + isMerchantRequest = expectedRole == PaymentRequestLocalRole.PAYER && proposalAppId == PAYKIT_SERVER_APP_ID, ) /** The app id a Paykit server stamps on requests it creates for merchants. */ diff --git a/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt b/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt index e3ea273c2b..b64b259ffb 100644 --- a/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt +++ b/app/src/test/java/to/bitkit/repositories/PaykitPaymentRequestRepoTest.kt @@ -992,6 +992,8 @@ class PaykitPaymentRequestRepoTest : BaseUnitTest(StandardTestDispatcher()) { assertFalse(parse(paymentRequestRecord()).isMerchantRequest) assertTrue(parse(paymentRequestRecord().copy(proposalAppId = "paykit-server")).isMerchantRequest) assertFalse(parse(paymentRequestRecord().copy(proposalAppId = "marketplace")).isMerchantRequest) + val outgoing = paymentRequestRecord(role = PaymentRequestLocalRole.PAYEE).copy(proposalAppId = "paykit-server") + assertFalse(requireNotNull(outgoing.toPaykitPaymentRequestHistory(START_TIME)).isMerchantRequest) } @Test diff --git a/journeys/payment-requests/issuer-interoperability.xml b/journeys/payment-requests/issuer-interoperability.xml index a2fa009c47..1ecc7becb2 100644 --- a/journeys/payment-requests/issuer-interoperability.xml +++ b/journeys/payment-requests/issuer-interoperability.xml @@ -13,6 +13,7 @@ Verify the one-time request row (testTag "PaymentRequestRow-71300000-0000-4000-8000-000000000001") shows 100,000 sats Tap the one-time request row (testTag "PaymentRequestRow-71300000-0000-4000-8000-000000000001") Verify Payment Request details (testTag "PaymentRequestDetailsScreen") shows an unsigned 100,000 sats amount (testTag "PaymentRequestDetailsAmount") and status "Waiting for payment" (testTag "PaymentRequestDetailsStatus") + Verify the requester heading on Payment Request details reads "Seller" Tap Back (testTag "NavigationBack") Tap the pending Payment Requests bell (testTag "PaymentRequestsBell") Verify the incoming Payment Requests sheet (testTag "PaymentRequestsSheet") appears @@ -21,6 +22,6 @@ Verify the Payment Request confirmation screen (testTag "PaymentRequestConfirm") shows 100,000 sats Wait for fresh validation and wallet preparation to finish; verify the same sheet stays open and its payment swipe control stops showing progress Tap Show details (testTag "SendConfirmToggleDetails") - Verify the recipient (testTag "ReviewContactRecipient") is the saved fixture issuer contact + Verify the recipient (testTag "ReviewContactRecipient") under Seller is the saved fixture issuer contact; the fixture is a Paykit server request, so the label reads "Seller" rather than "Contact" From 2ccec7898c941bb42c820f3399a2501e9dab0fbd Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Wed, 21 Oct 2026 02:56:45 +0200 Subject: [PATCH 3/3] fix: label the shop payee to, the existing send label --- .../wallets/send/SendConfirmScreenTest.kt | 6 +++--- .../IncomingPaymentRequestDetailsScreen.kt | 2 +- .../ui/screens/wallets/send/SendConfirmScreen.kt | 16 ++++++++-------- .../ui/screens/wallets/usdt/UsdtSendContent.kt | 2 +- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-b+es+419/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es-rES/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values/strings.xml | 1 - changelog.d/next/1625.changed.md | 2 +- .../payment-requests/issuer-interoperability.xml | 4 ++-- 22 files changed, 16 insertions(+), 32 deletions(-) diff --git a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt index 89ad85d150..b454ffddbf 100644 --- a/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt +++ b/app/src/androidTest/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreenTest.kt @@ -342,7 +342,7 @@ class SendConfirmScreenTest { } @Test - fun merchantRequestLabelsThePayeeAsSeller() { + fun merchantRequestLabelsThePayeeAsTo() { val seller = PubkyProfile.placeholder("seller").copy(name = "Corner Shop") val state = mutableStateOf( SendUiState( @@ -369,11 +369,11 @@ class SendConfirmScreenTest { } composeTestRule.onNodeWithTag("SendConfirmToggleDetails").performClick() - composeTestRule.onNodeWithText("Seller", ignoreCase = true).performScrollTo().assertIsDisplayed() + composeTestRule.onNodeWithText("To", ignoreCase = true).performScrollTo().assertIsDisplayed() composeTestRule.onNodeWithText("Contact", ignoreCase = true).assertDoesNotExist() composeTestRule.runOnIdle { state.value = state.value.copy(isMerchantPaymentRequest = false) } composeTestRule.onNodeWithText("Contact", ignoreCase = true).performScrollTo().assertIsDisplayed() - composeTestRule.onNodeWithText("Seller", ignoreCase = true).assertDoesNotExist() + composeTestRule.onNodeWithText("To", ignoreCase = true).assertDoesNotExist() } } diff --git a/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt b/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt index 5fc4ae725e..118618c4af 100644 --- a/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/paymentrequests/IncomingPaymentRequestDetailsScreen.kt @@ -190,7 +190,7 @@ internal fun IncomingPaymentRequestDetailsContent( Caption13Up( text = stringResource( if (request.isMerchantRequest) { - R.string.wallet__payment_request_seller + R.string.wallet__send_to } else { R.string.wallet__payment_request_contact } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt index 4c6b22bf3b..cf86a1d960 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendConfirmScreen.kt @@ -602,10 +602,10 @@ private fun OnChainDetails( } SendCell( caption = stringResource( - when { - !uiState.isOneOffPaymentRequest -> R.string.wallet__send_to - uiState.isMerchantPaymentRequest -> R.string.wallet__payment_request_seller - else -> R.string.wallet__payment_request_contact + if (uiState.isOneOffPaymentRequest && !uiState.isMerchantPaymentRequest) { + R.string.wallet__payment_request_contact + } else { + R.string.wallet__send_to } ), modifier = Modifier.weight(1f) @@ -748,10 +748,10 @@ private fun LightningDetails( } SendCell( caption = stringResource( - when { - !uiState.isOneOffPaymentRequest -> R.string.wallet__send_to - uiState.isMerchantPaymentRequest -> R.string.wallet__payment_request_seller - else -> R.string.wallet__payment_request_contact + if (uiState.isOneOffPaymentRequest && !uiState.isMerchantPaymentRequest) { + R.string.wallet__payment_request_contact + } else { + R.string.wallet__send_to } ), modifier = Modifier.weight(1f) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt index f3f88d0a39..1e3e459507 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/usdt/UsdtSendContent.kt @@ -728,7 +728,7 @@ private fun UsdtQuoteDetails(quote: UsdtQuote, contact: PubkyProfile?, isMerchan SendCell( caption = stringResource( if (isMerchantRequest) { - R.string.wallet__payment_request_seller + R.string.wallet__send_to } else { R.string.wallet__payment_request_contact } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 9f5a92b6c0..a3729f4157 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1058,7 +1058,6 @@ رفض المستلم طلب فاتورة Lightning هذا. رفض المستلم دفعة Lightning هذه. تحقق من الفاتورة وحاول مرة أخرى. جهة الاتصال - البائع التاريخ ملاحظة مُرسل diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index 1b93432695..0a7214189c 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -1086,7 +1086,6 @@ El destinatario rechazó esta solicitud de factura Lightning. El destinatario rechazó este pago Lightning. Revise la factura e inténtelo de nuevo. Contacto - Vendedor Fecha Nota Enviado diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 291cdbd942..12877bfec5 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1078,7 +1078,6 @@ El destinatari ha rebutjat aquesta sol·licitud de factura Lightning. El destinatari ha rebutjat aquest pagament Lightning. Comprova la factura i torna-ho a provar. Contacte - Venedor Data Nota Enviat diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 11a007d00f..057ac4e371 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1083,7 +1083,6 @@ Příjemce tuto žádost o Lightning fakturu odmítl. Příjemce tuto Lightning platbu odmítl. Zkontrolujte fakturu a zkuste to znovu. Kontakt - Prodejce Datum Poznámka Posláno diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6a14dfd968..76f55ebcce 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -952,7 +952,6 @@ Der Empfänger hat diese Lightning-Rechnungsanfrage abgelehnt. Der Empfänger hat diese Lightning-Zahlung abgelehnt. Bitte prüfe die Rechnung und versuche es erneut. Kontakt - Verkäufer Datum Notiz Gesendet diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 180db8db0f..7716ce9422 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1065,7 +1065,6 @@ Ο παραλήπτης απέρριψε αυτό το αίτημα τιμολογίου Lightning. Ο παραλήπτης απέρριψε αυτήν την πληρωμή Lightning. Ελέγξτε το τιμολόγιο και δοκιμάστε ξανά. Επαφή - Πωλητής Ημερομηνία Σημείωση Στάλθηκε diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index b300e42a41..625c9643ea 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1079,7 +1079,6 @@ El destinatario ha rechazado esta solicitud de factura Lightning. El destinatario ha rechazado este pago Lightning. Comprueba la factura e inténtalo de nuevo. Contacto - Vendedor Fecha Nota Enviado diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 14d6084e2c..d8e7343e9a 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -940,7 +940,6 @@ El destinatario ha rechazado esta solicitud de factura Lightning. El destinatario ha rechazado este pago Lightning. Comprueba la factura e inténtalo de nuevo. Contacto - Vendedor Fecha Nota Enviado diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6f7a53a4fe..fb5734cbb9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1552,7 +1552,6 @@ Montant Choisir le destinataire Contact - Vendeur Date Ignorer Saisir un pubky diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 22ec033faa..c3b3b545e1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1082,7 +1082,6 @@ Il destinatario ha rifiutato questa richiesta di fattura Lightning. Il destinatario ha rifiutato questo pagamento Lightning. Controlla la fattura e riprova. Contatto - Venditore Data Inviato Orario diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index eb78ef22ea..54dae1eec1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1554,7 +1554,6 @@ Bedrag Ontvanger kiezen Contact - Verkoper Negeren Voer pubky in Het betaalverzoek is verlopen. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 998572080f..05f2d1755e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -952,7 +952,6 @@ Odbiorca odrzucił to żądanie faktury Lightning. Odbiorca odrzucił tę płatność Lightning. Sprawdź fakturę i spróbuj ponownie. Kontakt - Sprzedawca Data Notatka Wysłano diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2c7b2c3da3..fddc8c369f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1086,7 +1086,6 @@ O destinatário rejeitou esta solicitação de fatura Lightning. O destinatário rejeitou este pagamento Lightning. Verifique a fatura e tente novamente. Contato - Vendedor Data Nota Enviado diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8636549dbf..275913a53f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -818,7 +818,6 @@ O destinatário rejeitou este pedido de fatura Lightning. O destinatário rejeitou este pagamento Lightning. Verifique a fatura e tente novamente. Contato - Vendedor Data Nota Enviado diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7e79bede18..1eac79d7d3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1115,7 +1115,6 @@ Bitkit должен увеличить приёмную ёмкость ваше Получатель отклонил этот запрос счета Lightning. Получатель отклонил этот платеж Lightning. Проверьте счет и попробуйте снова. Контакт - Продавец Дата Заметка Исходящие diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9bc39db9b..d940bcf647 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1413,7 +1413,6 @@ Amount Choose Recipient Contact - Seller Date Dismiss Enter pubky diff --git a/changelog.d/next/1625.changed.md b/changelog.d/next/1625.changed.md index babbd0ba33..56bf5f63a0 100644 --- a/changelog.d/next/1625.changed.md +++ b/changelog.d/next/1625.changed.md @@ -1 +1 @@ -Payment requests from a shop now label the payee as Seller instead of Contact. +Payment requests from a shop now show the payee under To instead of Contact. diff --git a/journeys/payment-requests/issuer-interoperability.xml b/journeys/payment-requests/issuer-interoperability.xml index 1ecc7becb2..1c9e9d3358 100644 --- a/journeys/payment-requests/issuer-interoperability.xml +++ b/journeys/payment-requests/issuer-interoperability.xml @@ -13,7 +13,7 @@ Verify the one-time request row (testTag "PaymentRequestRow-71300000-0000-4000-8000-000000000001") shows 100,000 sats Tap the one-time request row (testTag "PaymentRequestRow-71300000-0000-4000-8000-000000000001") Verify Payment Request details (testTag "PaymentRequestDetailsScreen") shows an unsigned 100,000 sats amount (testTag "PaymentRequestDetailsAmount") and status "Waiting for payment" (testTag "PaymentRequestDetailsStatus") - Verify the requester heading on Payment Request details reads "Seller" + Verify the requester heading on Payment Request details reads "To" Tap Back (testTag "NavigationBack") Tap the pending Payment Requests bell (testTag "PaymentRequestsBell") Verify the incoming Payment Requests sheet (testTag "PaymentRequestsSheet") appears @@ -22,6 +22,6 @@ Verify the Payment Request confirmation screen (testTag "PaymentRequestConfirm") shows 100,000 sats Wait for fresh validation and wallet preparation to finish; verify the same sheet stays open and its payment swipe control stops showing progress Tap Show details (testTag "SendConfirmToggleDetails") - Verify the recipient (testTag "ReviewContactRecipient") under Seller is the saved fixture issuer contact; the fixture is a Paykit server request, so the label reads "Seller" rather than "Contact" + Verify the recipient (testTag "ReviewContactRecipient") under To is the saved fixture issuer contact; the fixture is a Paykit server request, so the label reads "To" rather than "Contact"