From 7b281b8bd4495a17432d2ec385532ceed49ca7a4 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Wed, 21 Oct 2026 00:40:54 +0200 Subject: [PATCH 1/2] fix: place the usdt amount keypad right above continue --- Bitkit/Views/Wallets/Send/SendAmountView.swift | 7 +++---- Bitkit/Views/Wallets/UsdtSendView.swift | 4 ++-- changelog.d/next/1056.fixed.md | 1 + journeys/usdt-send-review-and-details.xml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 changelog.d/next/1056.fixed.md diff --git a/Bitkit/Views/Wallets/Send/SendAmountView.swift b/Bitkit/Views/Wallets/Send/SendAmountView.swift index b49c9288a..b6b3d4193 100644 --- a/Bitkit/Views/Wallets/Send/SendAmountView.swift +++ b/Bitkit/Views/Wallets/Send/SendAmountView.swift @@ -157,6 +157,7 @@ struct SendAmountView: View { if app.paykitUsesUsdt { UsdtAmountHeader(amount: usdtAmount.isEmpty ? "0" : usdtAmount) .accessibilityIdentifier("SendNumberField") + .frame(maxHeight: .infinity, alignment: .leading) } else { NumberPadTextField(viewModel: amountViewModel, testIdentifier: "SendNumberField") .onTapGesture { amountViewModel.togglePrimaryDisplay(currency: currency) } @@ -165,9 +166,7 @@ struct SendAmountView: View { BodySText(conversionError, textColor: .brandAccent).padding(.top, 12) } - if app.paykitUsesUsdt { - Spacer().frame(height: 32) - } else { + if !app.paykitUsesUsdt { Spacer() } @@ -255,7 +254,7 @@ struct SendAmountView: View { amountViewModel.handleNumberPadInput(key, currency: currency) } } - .frame(maxHeight: app.paykitUsesUsdt ? .infinity : nil) + .padding(.horizontal, app.paykitUsesUsdt ? -16 : 0) CustomButton( title: t("common__continue"), diff --git a/Bitkit/Views/Wallets/UsdtSendView.swift b/Bitkit/Views/Wallets/UsdtSendView.swift index dd21dbb6a..2f5c33794 100644 --- a/Bitkit/Views/Wallets/UsdtSendView.swift +++ b/Bitkit/Views/Wallets/UsdtSendView.swift @@ -337,7 +337,7 @@ struct UsdtSendView: View { VStack(alignment: .leading, spacing: 0) { UsdtAmountHeader(amount: amount.isEmpty ? "0" : amount) .accessibilityIdentifier("UsdtAmount") - .padding(.bottom, 32) + .frame(maxHeight: .infinity, alignment: .leading) if let error { BodySText(error, textColor: .brandAccent).accessibilityIdentifier("UsdtError").padding(.bottom, 16) } @@ -364,7 +364,7 @@ struct UsdtSendView: View { onDeleteLongPress: { amount = ""; maximumQuote = nil; isMaximumAmount = false; error = nil }, onPress: enterAmount ) - .frame(maxHeight: .infinity) + .padding(.horizontal, -16) CustomButton(title: t("common__continue"), isDisabled: busy || (try? parsePaykitAmountInput(asset: .usdt, value: amount)) == nil, isLoading: busy && !preparingMaximum, titleKerning: 0, titleLineHeight: 20) { diff --git a/changelog.d/next/1056.fixed.md b/changelog.d/next/1056.fixed.md new file mode 100644 index 000000000..18bd54e5e --- /dev/null +++ b/changelog.d/next/1056.fixed.md @@ -0,0 +1 @@ +The USDT amount keypad now sits right above Continue, with the amount centred above it. diff --git a/journeys/usdt-send-review-and-details.xml b/journeys/usdt-send-review-and-details.xml index 9b4021e31..bd113f72a 100644 --- a/journeys/usdt-send-review-and-details.xml +++ b/journeys/usdt-send-review-and-details.xml @@ -2,7 +2,7 @@ Use an onboarded wallet with USDT, a fresh BTC/USD rate, owned EVM and Solana recipients and existing sent/received activity. Save a linked contact that advertises Bitcoin, Lightning and USDT receiving methods. Have an unpaid one-time request and a due subscription payment from that contact, each permitting USDT. Pair a hardware wallet for the hardware-option check. Use the local USDT fixture for funding, controlled quotes and submitted-payment states. Quotes require the service with MAX support. No payment is submitted. Enable USDT in the introductory sheet or Settings, General, Payments before starting this flow. - Open USDT Send and enter the owned recipient. On Amount, verify the BTC equivalent above the dollar amount, 32-point gap before Available balance, USDT badge, MAX and network pill. Enter a six-decimal amount and verify no precision is lost. With a large available balance and BNB Smart Chain selected, verify both values remain fully readable; the controls may wrap onto a second row. + Open USDT Send and enter the owned recipient. On Amount, verify the BTC equivalent above the dollar amount, both centred in the free space above Available balance, USDT badge, MAX and network pill. The controls sit right above the keypad, the keypad spans the sheet edge to edge and Continue sits right below it. Enter a six-decimal amount and verify no precision is lost. With a large available balance and BNB Smart Chain selected, verify both values remain fully readable; the controls may wrap onto a second row. Open the network pill and verify the full USDT Network picker, Tether rows and selected teal check. Select another EVM network. Verify the amount and valid recipient remain. Change to Solana with an EVM recipient and verify recipient entry is required. Enter an owned plain Solana address and verify the previous amount remains. Return to Arbitrum, enter the owned EVM address and verify the amount still remains. From recipient entry with another network selected, paste an explicit Arbitrum USDT URI. Verify the selected network becomes Arbitrum and the link amount is retained. A plain 0x address preserves the selected network. Tap MAX. Verify it fills a positive amount below the balance and remains on Amount. Continue and verify the payment plus maximum fee fits within the balance. Back out without swiping. From 5040d4511a484613b27414d1a057b86034e68949 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Wed, 21 Oct 2026 14:59:23 +0200 Subject: [PATCH 2/2] fix: keep the usdt amount layout the same as the bitcoin screens --- Bitkit/Views/Wallets/Send/SendAmountView.swift | 6 +----- Bitkit/Views/Wallets/UsdtSendView.swift | 3 +-- changelog.d/next/1056.fixed.md | 2 +- journeys/usdt-send-review-and-details.xml | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Bitkit/Views/Wallets/Send/SendAmountView.swift b/Bitkit/Views/Wallets/Send/SendAmountView.swift index b6b3d4193..11bfe3641 100644 --- a/Bitkit/Views/Wallets/Send/SendAmountView.swift +++ b/Bitkit/Views/Wallets/Send/SendAmountView.swift @@ -157,7 +157,6 @@ struct SendAmountView: View { if app.paykitUsesUsdt { UsdtAmountHeader(amount: usdtAmount.isEmpty ? "0" : usdtAmount) .accessibilityIdentifier("SendNumberField") - .frame(maxHeight: .infinity, alignment: .leading) } else { NumberPadTextField(viewModel: amountViewModel, testIdentifier: "SendNumberField") .onTapGesture { amountViewModel.togglePrimaryDisplay(currency: currency) } @@ -166,9 +165,7 @@ struct SendAmountView: View { BodySText(conversionError, textColor: .brandAccent).padding(.top, 12) } - if !app.paykitUsesUsdt { - Spacer() - } + Spacer() // Available balance section HStack(alignment: .bottom) { @@ -254,7 +251,6 @@ struct SendAmountView: View { amountViewModel.handleNumberPadInput(key, currency: currency) } } - .padding(.horizontal, app.paykitUsesUsdt ? -16 : 0) CustomButton( title: t("common__continue"), diff --git a/Bitkit/Views/Wallets/UsdtSendView.swift b/Bitkit/Views/Wallets/UsdtSendView.swift index 2f5c33794..93d11a3f7 100644 --- a/Bitkit/Views/Wallets/UsdtSendView.swift +++ b/Bitkit/Views/Wallets/UsdtSendView.swift @@ -337,7 +337,7 @@ struct UsdtSendView: View { VStack(alignment: .leading, spacing: 0) { UsdtAmountHeader(amount: amount.isEmpty ? "0" : amount) .accessibilityIdentifier("UsdtAmount") - .frame(maxHeight: .infinity, alignment: .leading) + Spacer() if let error { BodySText(error, textColor: .brandAccent).accessibilityIdentifier("UsdtError").padding(.bottom, 16) } @@ -364,7 +364,6 @@ struct UsdtSendView: View { onDeleteLongPress: { amount = ""; maximumQuote = nil; isMaximumAmount = false; error = nil }, onPress: enterAmount ) - .padding(.horizontal, -16) CustomButton(title: t("common__continue"), isDisabled: busy || (try? parsePaykitAmountInput(asset: .usdt, value: amount)) == nil, isLoading: busy && !preparingMaximum, titleKerning: 0, titleLineHeight: 20) { diff --git a/changelog.d/next/1056.fixed.md b/changelog.d/next/1056.fixed.md index 18bd54e5e..6548a033f 100644 --- a/changelog.d/next/1056.fixed.md +++ b/changelog.d/next/1056.fixed.md @@ -1 +1 @@ -The USDT amount keypad now sits right above Continue, with the amount centred above it. +The USDT amount keypad now sits right above Continue, as on the Bitcoin amount screen. diff --git a/journeys/usdt-send-review-and-details.xml b/journeys/usdt-send-review-and-details.xml index bd113f72a..54d65fa3e 100644 --- a/journeys/usdt-send-review-and-details.xml +++ b/journeys/usdt-send-review-and-details.xml @@ -2,7 +2,7 @@ Use an onboarded wallet with USDT, a fresh BTC/USD rate, owned EVM and Solana recipients and existing sent/received activity. Save a linked contact that advertises Bitcoin, Lightning and USDT receiving methods. Have an unpaid one-time request and a due subscription payment from that contact, each permitting USDT. Pair a hardware wallet for the hardware-option check. Use the local USDT fixture for funding, controlled quotes and submitted-payment states. Quotes require the service with MAX support. No payment is submitted. Enable USDT in the introductory sheet or Settings, General, Payments before starting this flow. - Open USDT Send and enter the owned recipient. On Amount, verify the BTC equivalent above the dollar amount, both centred in the free space above Available balance, USDT badge, MAX and network pill. The controls sit right above the keypad, the keypad spans the sheet edge to edge and Continue sits right below it. Enter a six-decimal amount and verify no precision is lost. With a large available balance and BNB Smart Chain selected, verify both values remain fully readable; the controls may wrap onto a second row. + Open USDT Send and enter the owned recipient. On Amount, verify the BTC equivalent above the dollar amount at the top, then the free space, then Available balance, USDT badge, MAX and network pill right above the keypad, and Continue right below the keypad, laid out as on the Bitcoin Amount screen. Enter a six-decimal amount and verify no precision is lost. With a large available balance and BNB Smart Chain selected, verify both values remain fully readable; the controls may wrap onto a second row. Open the network pill and verify the full USDT Network picker, Tether rows and selected teal check. Select another EVM network. Verify the amount and valid recipient remain. Change to Solana with an EVM recipient and verify recipient entry is required. Enter an owned plain Solana address and verify the previous amount remains. Return to Arbitrum, enter the owned EVM address and verify the amount still remains. From recipient entry with another network selected, paste an explicit Arbitrum USDT URI. Verify the selected network becomes Arbitrum and the link amount is retained. A plain 0x address preserves the selected network. Tap MAX. Verify it fills a positive amount below the balance and remains on Amount. Continue and verify the payment plus maximum fee fits within the balance. Back out without swiping.