From bc4d3b4b7e121caeb69b736220d988194b92d0d2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 2 Jun 2026 10:33:21 +0200 Subject: [PATCH] Updated on 2026-08-14 --- .../converters/AmountStateConverter.kt | 2 + .../ui/amountScreen/models/AmountState.kt | 2 + .../amountScreen/ui/AmountFieldContainer.kt | 35 ++++++----- .../converters/AmountStateConverterTest.kt | 62 +++++++++++++++++++ .../SetInitialDataStateTransformer.kt | 2 + 5 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 common/ui/src/test/kotlin/com/tangem/common/ui/amountScreen/converters/AmountStateConverterTest.kt diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt index a8d3ad4fe0..50543caa9d 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/converters/AmountStateConverter.kt @@ -38,6 +38,7 @@ class AmountStateConverter( private val iconStateConverter: CryptoCurrencyToIconStateConverter, private val isBalanceHidden: Boolean, private val accountTitleUM: AccountTitleUM, + private val isMaxButtonVisible: Boolean = true, ) : Converter { private val amountFieldConverter by lazy(LazyThreadSafetyMode.NONE) { @@ -72,6 +73,7 @@ class AmountStateConverter( amountTextField = amountFieldConverter.convert(value.value), isPrimaryButtonEnabled = false, appCurrency = appCurrency, + isMaxButtonVisible = isMaxButtonVisible, ) } } \ No newline at end of file diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt index 09e6c0d211..c7b3fa5da0 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/models/AmountState.kt @@ -24,6 +24,7 @@ sealed class AmountState { * @param isEditingDisabled indicated whether amount is editable * @param reduceAmountBy reduces amount to be sent by specified value * @param isIgnoreReduce ignores reduce amount value + * @param isMaxButtonVisible indicates whether the "Max" button is shown */ data class Data( override val isPrimaryButtonEnabled: Boolean, @@ -37,6 +38,7 @@ sealed class AmountState { val isEditingDisabled: Boolean = false, val reduceAmountBy: BigDecimal = BigDecimal.ZERO, val isIgnoreReduce: Boolean = false, + val isMaxButtonVisible: Boolean = true, ) : AmountState() data object Empty : AmountState() { diff --git a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt index 12335b79ad..6f8d27de62 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/amountScreen/ui/AmountFieldContainer.kt @@ -88,6 +88,7 @@ internal fun LazyListScope.amountFieldV2( @Composable private fun AmountInfo(amountUM: AmountState, onMaxAmountClick: () -> Unit, modifier: Modifier = Modifier) { val tokenIconState = (amountUM as? AmountState.Data)?.tokenIconState ?: CurrencyIconState.Loading + val isMaxButtonVisible = (amountUM as? AmountState.Data)?.isMaxButtonVisible != false Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp), @@ -106,22 +107,24 @@ private fun AmountInfo(amountUM: AmountState, onMaxAmountClick: () -> Unit, modi amountUM = amountUM, modifier = Modifier.weight(1f), ) - Text( - text = stringResourceSafe(R.string.send_max_amount), - style = TangemTheme.typography.caption1, - color = TangemTheme.colors.text.primary1, - modifier = Modifier - .padding(end = 16.dp) - .clip(RoundedCornerShape(16.dp)) - .background(TangemTheme.colors.button.secondary) - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = ripple(), - onClick = onMaxAmountClick, - ) - .padding(horizontal = 12.dp, vertical = 4.dp) - .testTag(SendScreenTestTags.MAX_BUTTON), - ) + if (isMaxButtonVisible) { + Text( + text = stringResourceSafe(R.string.send_max_amount), + style = TangemTheme.typography.caption1, + color = TangemTheme.colors.text.primary1, + modifier = Modifier + .padding(end = 16.dp) + .clip(RoundedCornerShape(16.dp)) + .background(TangemTheme.colors.button.secondary) + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = ripple(), + onClick = onMaxAmountClick, + ) + .padding(horizontal = 12.dp, vertical = 4.dp) + .testTag(SendScreenTestTags.MAX_BUTTON), + ) + } } } diff --git a/common/ui/src/test/kotlin/com/tangem/common/ui/amountScreen/converters/AmountStateConverterTest.kt b/common/ui/src/test/kotlin/com/tangem/common/ui/amountScreen/converters/AmountStateConverterTest.kt new file mode 100644 index 0000000000..b612d7f357 --- /dev/null +++ b/common/ui/src/test/kotlin/com/tangem/common/ui/amountScreen/converters/AmountStateConverterTest.kt @@ -0,0 +1,62 @@ +package com.tangem.common.ui.amountScreen.converters + +import com.google.common.truth.Truth.assertThat +import com.tangem.common.ui.account.AccountTitleUM +import com.tangem.common.ui.amountScreen.AmountScreenClickIntents +import com.tangem.common.ui.amountScreen.models.AmountParameters +import com.tangem.common.ui.amountScreen.models.AmountState +import com.tangem.common.ui.amountScreen.models.EnterAmountBoundary +import com.tangem.common.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter +import com.tangem.core.ui.components.currency.icon.CurrencyIconState +import com.tangem.core.ui.extensions.stringReference +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.currency.CryptoCurrencyStatus +import io.mockk.every +import io.mockk.mockk +import org.junit.jupiter.api.Test +import java.math.BigDecimal + +internal class AmountStateConverterTest { + + private val currency = mockk { + every { symbol } returns "ETH" + every { decimals } returns 18 + every { name } returns "Ethereum" + } + private val status = CryptoCurrencyStatus(currency = currency, value = mockk(relaxed = true)) + private val iconStateConverter = mockk { + every { convert(any()) } returns CurrencyIconState.Loading + } + private val clickIntents = mockk(relaxed = true) + private val accountTitleUM = mockk() + + private fun convert(isMaxButtonVisible: Boolean = true): AmountState = AmountStateConverter( + clickIntents = clickIntents, + appCurrency = AppCurrency.Default, + cryptoCurrencyStatus = status, + maxEnterAmount = EnterAmountBoundary( + amount = BigDecimal.ONE, + fiatAmount = BigDecimal.TEN, + fiatRate = BigDecimal.ONE, + ), + iconStateConverter = iconStateConverter, + isBalanceHidden = false, + accountTitleUM = accountTitleUM, + isMaxButtonVisible = isMaxButtonVisible, + ).convert(AmountParameters(title = stringReference("Wallet"), value = "")) + + @Test + fun `GIVEN no isMaxButtonVisible param WHEN convert THEN Data isMaxButtonVisible is true`() { + val result = convert() + + assertThat((result as AmountState.Data).isMaxButtonVisible).isTrue() + } + + @Test + fun `GIVEN isMaxButtonVisible false WHEN convert THEN Data isMaxButtonVisible is false`() { + val result = convert(isMaxButtonVisible = false) + + assertThat((result as AmountState.Data).isMaxButtonVisible).isFalse() + } +} \ No newline at end of file diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt index a4276d56a6..5f75691356 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt @@ -20,6 +20,7 @@ import com.tangem.domain.models.account.Account import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.domain.models.staking.StakingBalanceEntry import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.staking.model.P2PEthPoolIntegration import com.tangem.domain.staking.model.Period import com.tangem.domain.staking.model.StakingIntegration import com.tangem.domain.staking.model.StakingTarget @@ -261,6 +262,7 @@ internal class SetInitialDataStateTransformer( walletTitle = stringReference(userWalletProvider().name), prefixText = resourceReference(R.string.common_from), ).convert(account), + isMaxButtonVisible = integration !is P2PEthPoolIntegration, ).convert( AmountParameters( title = stringReference(userWalletProvider().name),