From 5b50e044cd1e74d8de9aafc6583f8a275c0e72e1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 25 Apr 2024 19:53:21 +0500 Subject: [PATCH 01/21] Updated on 2026-08-14 --- .../ui/components/currency/tokenicon/TokenIcon.kt | 12 ++++++++++-- .../impl/presentation/ui/amount/AmountButtons.kt | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt index 07d299f583..9ad7d42cc8 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt @@ -27,9 +27,15 @@ private const val NORMAL_ALPHA = 1f * @param state cryptocurrency icon config * @param modifier component modifier * @param shouldDisplayNetwork specifies whether to display network badge + * @param shouldDisplayCustom specifies whether to display custom badge */ @Composable -fun TokenIcon(state: TokenIconState, modifier: Modifier = Modifier, shouldDisplayNetwork: Boolean = true) { +fun TokenIcon( + state: TokenIconState, + modifier: Modifier = Modifier, + shouldDisplayNetwork: Boolean = true, + shouldDisplayCustom: Boolean = true, +) { BaseContainer(modifier = modifier) { val iconModifier = Modifier .align(Alignment.Center) @@ -46,6 +52,7 @@ fun TokenIcon(state: TokenIconState, modifier: Modifier = Modifier, shouldDispla icon = state, modifier = iconModifier, shouldDisplayNetwork = shouldDisplayNetwork, + shouldDisplayCustom = shouldDisplayCustom, ) } } @@ -76,6 +83,7 @@ private fun BoxScope.ContentIconContainer( icon: TokenIconState, modifier: Modifier = Modifier, shouldDisplayNetwork: Boolean = true, + shouldDisplayCustom: Boolean = true, ) { val networkBadgeOffset = TangemTheme.dimens.spacing4 val (alpha, colorFilter) = remember(icon.isGrayscale) { @@ -104,7 +112,7 @@ private fun BoxScope.ContentIconContainer( ) } - if (icon.showCustomBadge) { + if (icon.showCustomBadge && shouldDisplayCustom) { CustomBadge(modifier = Modifier.align(Alignment.BottomEnd)) } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt index 340f8e20ad..c4348c54f9 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt @@ -96,6 +96,7 @@ private fun SendAmountCurrencyButton(button: SendAmountSegmentedButtonsConfig, i TokenIcon( state = button.iconState, shouldDisplayNetwork = false, + shouldDisplayCustom = false, modifier = Modifier .size(TangemTheme.dimens.size18), ) From bd4cfb134dc496915fac1c7befbd9f56d389feab Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 25 Apr 2024 19:54:08 +0500 Subject: [PATCH 02/21] Updated on 2026-08-14 --- .../tangem/core/ui/components/fields/SimpleTextField.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt b/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt index e4737af0c1..577485da0d 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt @@ -45,7 +45,12 @@ fun SimpleTextField( ) { val proxyValue by remember(value) { derivedStateOf { value } } var textFieldValueState by remember { - mutableStateOf(TextFieldValue(text = value)) + mutableStateOf( + TextFieldValue( + text = value, + selection = TextRange(value.length, value.length), + ), + ) } val focusRequester = remember { FocusRequester.Default } val customTextSelectionColors = TextSelectionColors( From 6acb6006fced9bf572b270cdd763b1740d2fb8e4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 25 Apr 2024 19:54:45 +0500 Subject: [PATCH 03/21] Updated on 2026-08-14 --- .../appbar/AppBarWithBackButtonAndIconContent.kt | 4 ++-- .../send/impl/presentation/state/SendStateFactory.kt | 1 + .../state/amount/SendAmountCurrencyConverter.kt | 8 ++++++++ .../send/impl/presentation/state/fee/FeeConverter.kt | 4 ++++ .../send/impl/presentation/state/fee/FeeStateFactory.kt | 7 ++++++- .../presentation/state/fee/SendFeeCustomFieldConverter.kt | 4 ++++ .../state/fee/custom/BitcoinCustomFeeConverter.kt | 6 +++++- .../state/fee/custom/EthereumCustomFeeConverter.kt | 6 +++++- .../presentation/state/fields/SendAmountFieldConverter.kt | 6 +++++- 9 files changed, 40 insertions(+), 6 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt index 09b6158abb..c65bf02622 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButtonAndIconContent.kt @@ -63,7 +63,8 @@ fun AppBarWithBackButtonAndIconContent( ) Column( verticalArrangement = Arrangement.Center, - modifier = Modifier.weight(1f), + modifier = Modifier.weight(1f) + .animateContentSize(), ) { AnimatedVisibility( visible = !text.isNullOrBlank(), @@ -89,7 +90,6 @@ fun AppBarWithBackButtonAndIconContent( color = TangemTheme.colors.text.secondary, maxLines = 1, style = TangemTheme.typography.caption2, - modifier = Modifier.animateContentSize(), ) } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt index a2b722b614..32b43ad33a 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt @@ -46,6 +46,7 @@ internal class SendStateFactory( private val amountFieldConverter by lazy(LazyThreadSafetyMode.NONE) { SendAmountFieldConverter( clickIntents = clickIntents, + stateRouterProvider = stateRouterProvider, cryptoCurrencyStatusProvider = cryptoCurrencyStatusProvider, appCurrencyProvider = appCurrencyProvider, ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt index 4817557ac6..369918da01 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt @@ -1,5 +1,8 @@ package com.tangem.features.send.impl.presentation.state.amount +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.features.send.impl.presentation.state.SendUiState import com.tangem.features.send.impl.presentation.state.StateRouter @@ -20,6 +23,7 @@ internal class SendAmountCurrencyConverter( val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() val isValidFiatRate = cryptoCurrencyStatus.value.fiatRate.isNullOrZero() + val isDoneActionEnabled = amountState.isPrimaryButtonEnabled return if (amountTextField.isFiatValue == value && !isValidFiatRate) { state } else { @@ -29,6 +33,10 @@ internal class SendAmountCurrencyConverter( amountTextField = amountTextField.copy( isFiatValue = value, isValuePasted = true, + keyboardOptions = KeyboardOptions( + imeAction = if (isDoneActionEnabled) ImeAction.Done else ImeAction.None, + keyboardType = KeyboardType.Number, + ), ), ), ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeConverter.kt index 1fa99ee291..5109aa17b9 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeConverter.kt @@ -5,6 +5,7 @@ import com.tangem.blockchain.common.transaction.TransactionFee import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus +import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.state.fee.custom.BitcoinCustomFeeConverter import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents @@ -13,6 +14,7 @@ import com.tangem.utils.converter.Converter internal class FeeConverter( private val clickIntents: SendClickIntents, + private val stateRouterProvider: Provider, private val appCurrencyProvider: Provider, private val feeCryptoCurrencyStatusProvider: Provider, ) : Converter { @@ -20,6 +22,7 @@ internal class FeeConverter( private val ethereumCustomFeeConverter by lazy(LazyThreadSafetyMode.NONE) { EthereumCustomFeeConverter( clickIntents = clickIntents, + stateRouterProvider = stateRouterProvider, appCurrencyProvider = appCurrencyProvider, feeCryptoCurrencyStatusProvider = feeCryptoCurrencyStatusProvider, ) @@ -28,6 +31,7 @@ internal class FeeConverter( private val bitcoinCustomFeeConverter by lazy(LazyThreadSafetyMode.NONE) { BitcoinCustomFeeConverter( clickIntents = clickIntents, + stateRouterProvider = stateRouterProvider, appCurrencyProvider = appCurrencyProvider, feeCryptoCurrencyStatusProvider = feeCryptoCurrencyStatusProvider, ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt index e5683fcdc7..e933b89477 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt @@ -7,7 +7,10 @@ import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.transaction.usecase.IsFeeApproximateUseCase -import com.tangem.features.send.impl.presentation.state.* +import com.tangem.features.send.impl.presentation.state.SendNotification +import com.tangem.features.send.impl.presentation.state.SendStates +import com.tangem.features.send.impl.presentation.state.SendUiState +import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import com.tangem.utils.Provider import kotlinx.collections.immutable.ImmutableList @@ -27,6 +30,7 @@ internal class FeeStateFactory( private val customFeeFieldConverter by lazy(LazyThreadSafetyMode.NONE) { SendFeeCustomFieldConverter( clickIntents = clickIntents, + stateRouterProvider = stateRouterProvider, appCurrencyProvider = appCurrencyProvider, feeCryptoCurrencyStatusProvider = feeCryptoCurrencyStatusProvider, ) @@ -35,6 +39,7 @@ internal class FeeStateFactory( val feeConverter by lazy(LazyThreadSafetyMode.NONE) { FeeConverter( clickIntents = clickIntents, + stateRouterProvider = stateRouterProvider, appCurrencyProvider = appCurrencyProvider, feeCryptoCurrencyStatusProvider = feeCryptoCurrencyStatusProvider, ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/SendFeeCustomFieldConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/SendFeeCustomFieldConverter.kt index c9534ea97f..5fd2a4060d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/SendFeeCustomFieldConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/SendFeeCustomFieldConverter.kt @@ -3,6 +3,7 @@ package com.tangem.features.send.impl.presentation.state.fee import com.tangem.blockchain.common.transaction.Fee import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus +import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.state.fee.custom.BitcoinCustomFeeConverter import com.tangem.features.send.impl.presentation.state.fee.custom.EthereumCustomFeeConverter import com.tangem.features.send.impl.presentation.state.fields.SendTextField @@ -14,6 +15,7 @@ import kotlinx.collections.immutable.persistentListOf internal class SendFeeCustomFieldConverter( private val clickIntents: SendClickIntents, + private val stateRouterProvider: Provider, private val appCurrencyProvider: Provider, private val feeCryptoCurrencyStatusProvider: Provider, ) : Converter> { @@ -21,6 +23,7 @@ internal class SendFeeCustomFieldConverter( private val ethereumCustomFeeConverter by lazy(LazyThreadSafetyMode.NONE) { EthereumCustomFeeConverter( clickIntents = clickIntents, + stateRouterProvider = stateRouterProvider, appCurrencyProvider = appCurrencyProvider, feeCryptoCurrencyStatusProvider = feeCryptoCurrencyStatusProvider, ) @@ -29,6 +32,7 @@ internal class SendFeeCustomFieldConverter( private val bitcoinCustomFeeConverter by lazy(LazyThreadSafetyMode.NONE) { BitcoinCustomFeeConverter( clickIntents = clickIntents, + stateRouterProvider = stateRouterProvider, appCurrencyProvider = appCurrencyProvider, feeCryptoCurrencyStatusProvider = feeCryptoCurrencyStatusProvider, ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt index 8226a67504..5594d8d917 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt @@ -15,6 +15,7 @@ import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.features.send.impl.R +import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.state.fields.SendTextField import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import com.tangem.lib.crypto.BlockchainUtils.isBitcoin @@ -27,6 +28,7 @@ import java.math.RoundingMode internal class BitcoinCustomFeeConverter( private val clickIntents: SendClickIntents, + private val stateRouterProvider: Provider, private val appCurrencyProvider: Provider, private val feeCryptoCurrencyStatusProvider: Provider, ) : CustomFeeConverter { @@ -66,7 +68,9 @@ internal class BitcoinCustomFeeConverter( imeAction = if (checkExceedBalance(feeValue)) ImeAction.None else ImeAction.Done, keyboardType = KeyboardType.Number, ), - keyboardActions = KeyboardActions(), + keyboardActions = KeyboardActions( + onDone = { clickIntents.onNextClick(stateRouterProvider().isEditState) }, + ), ), ) } else { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt index 4851533b49..9428dbdfc0 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt @@ -15,6 +15,7 @@ import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.features.send.impl.R +import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.state.fields.SendTextField import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import com.tangem.utils.Provider @@ -26,6 +27,7 @@ import java.math.RoundingMode internal class EthereumCustomFeeConverter( private val clickIntents: SendClickIntents, + private val stateRouterProvider: Provider, private val appCurrencyProvider: Provider, private val feeCryptoCurrencyStatusProvider: Provider, ) : CustomFeeConverter { @@ -71,7 +73,9 @@ internal class EthereumCustomFeeConverter( imeAction = if (checkExceedBalance(feeValue)) ImeAction.None else ImeAction.Done, keyboardType = KeyboardType.Number, ), - keyboardActions = KeyboardActions(onDone = { clickIntents.onNextClick() }), + keyboardActions = KeyboardActions( + onDone = { clickIntents.onNextClick(stateRouterProvider().isEditState) }, + ), ), ) } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt index 2070b8c633..14f7f4b660 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt @@ -14,6 +14,7 @@ import com.tangem.domain.tokens.model.AmountType import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.convertToAmount import com.tangem.features.send.impl.R +import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import com.tangem.utils.Provider import com.tangem.utils.converter.Converter @@ -23,6 +24,7 @@ private const val FIAT_DECIMALS = 2 internal class SendAmountFieldConverter( private val clickIntents: SendClickIntents, + private val stateRouterProvider: Provider, private val cryptoCurrencyStatusProvider: Provider, private val appCurrencyProvider: Provider, ) : Converter { @@ -48,7 +50,9 @@ internal class SendAmountFieldConverter( imeAction = if (isDoneActionEnabled) ImeAction.Done else ImeAction.None, keyboardType = KeyboardType.Number, ), - keyboardActions = KeyboardActions(onDone = { clickIntents.onNextClick() }), + keyboardActions = KeyboardActions( + onDone = { clickIntents.onNextClick(stateRouterProvider().isEditState) }, + ), isFiatValue = false, cryptoAmount = cryptoAmount, fiatAmount = getAppCurrencyAmount(fiatDecimal, appCurrencyProvider()), From f5cb300604bd79fb81417b37ce1d76508a1bef0d Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 26 Apr 2024 13:24:12 +0500 Subject: [PATCH 04/21] Updated on 2026-08-14 --- .../ui/components/currency/tokenicon/TokenIcon.kt | 12 ++---------- .../components/currency/tokenicon/TokenIconState.kt | 11 +++++------ .../converter/CryptoCurrencyToIconStateConverter.kt | 5 ++++- .../impl/presentation/ui/amount/AmountButtons.kt | 1 - 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt index 9ad7d42cc8..07d299f583 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIcon.kt @@ -27,15 +27,9 @@ private const val NORMAL_ALPHA = 1f * @param state cryptocurrency icon config * @param modifier component modifier * @param shouldDisplayNetwork specifies whether to display network badge - * @param shouldDisplayCustom specifies whether to display custom badge */ @Composable -fun TokenIcon( - state: TokenIconState, - modifier: Modifier = Modifier, - shouldDisplayNetwork: Boolean = true, - shouldDisplayCustom: Boolean = true, -) { +fun TokenIcon(state: TokenIconState, modifier: Modifier = Modifier, shouldDisplayNetwork: Boolean = true) { BaseContainer(modifier = modifier) { val iconModifier = Modifier .align(Alignment.Center) @@ -52,7 +46,6 @@ fun TokenIcon( icon = state, modifier = iconModifier, shouldDisplayNetwork = shouldDisplayNetwork, - shouldDisplayCustom = shouldDisplayCustom, ) } } @@ -83,7 +76,6 @@ private fun BoxScope.ContentIconContainer( icon: TokenIconState, modifier: Modifier = Modifier, shouldDisplayNetwork: Boolean = true, - shouldDisplayCustom: Boolean = true, ) { val networkBadgeOffset = TangemTheme.dimens.spacing4 val (alpha, colorFilter) = remember(icon.isGrayscale) { @@ -112,7 +104,7 @@ private fun BoxScope.ContentIconContainer( ) } - if (icon.showCustomBadge && shouldDisplayCustom) { + if (icon.showCustomBadge) { CustomBadge(modifier = Modifier.align(Alignment.BottomEnd)) } } diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIconState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIconState.kt index f51adb19b3..0f7ff350de 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIconState.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/TokenIconState.kt @@ -60,24 +60,23 @@ sealed class TokenIconState { * @property background The background color to be used for the icon. * @property networkBadgeIconResId The drawable resource ID for the network badge. * @property isGrayscale Specifies whether to show the icon in grayscale. + * @property showCustomBadge Specifies whether to show the custom token badge. */ data class CustomTokenIcon( val tint: Color, val background: Color, @DrawableRes override val networkBadgeIconResId: Int, override val isGrayscale: Boolean, - ) : TokenIconState() { + override val showCustomBadge: Boolean = true, + ) : TokenIconState() - override val showCustomBadge: Boolean = true - } - - object Loading : TokenIconState() { + data object Loading : TokenIconState() { override val isGrayscale: Boolean = false override val showCustomBadge: Boolean = false override val networkBadgeIconResId: Int? = null } - object Locked : TokenIconState() { + data object Locked : TokenIconState() { override val isGrayscale: Boolean = false override val showCustomBadge: Boolean = false override val networkBadgeIconResId: Int? = null diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/converter/CryptoCurrencyToIconStateConverter.kt b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/converter/CryptoCurrencyToIconStateConverter.kt index fbcc6e3caa..3e62e98992 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/converter/CryptoCurrencyToIconStateConverter.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/currency/tokenicon/converter/CryptoCurrencyToIconStateConverter.kt @@ -30,6 +30,7 @@ class CryptoCurrencyToIconStateConverter : Converter getIconStateForToken( token = currency, @@ -50,13 +51,14 @@ class CryptoCurrencyToIconStateConverter : Converter Date: Thu, 25 Apr 2024 19:30:47 +0500 Subject: [PATCH 05/21] Updated on 2026-08-14 --- .../state/confirm/SendNotificationFactory.kt | 21 ------------------- gradle/dependencies.toml | 2 +- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt index 3b01354982..9fbd121d79 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt @@ -20,7 +20,6 @@ import com.tangem.features.send.impl.presentation.analytics.SendAnalyticEvents import com.tangem.features.send.impl.presentation.state.* import com.tangem.features.send.impl.presentation.state.fee.* import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents -import com.tangem.lib.crypto.BlockchainUtils.isDogecoin import com.tangem.lib.crypto.BlockchainUtils.isTezos import com.tangem.utils.Provider import kotlinx.collections.immutable.ImmutableList @@ -71,7 +70,6 @@ internal class SendNotificationFactory( addFeeUnreachableNotification(feeState.feeSelectorState) addExceedBalanceNotification(feeValue, sendingAmount) addExceedsBalanceNotification(feeState.fee) - addMinimumAmountErrorNotification(feeValue, sendingAmount) addDustWarningNotification(feeValue, sendingAmount) addTransactionLimitErrorNotification(feeValue, sendingAmount) // warnings @@ -235,21 +233,6 @@ internal class SendNotificationFactory( } } - // todo remove in [REDACTED_TASK_KEY] - private fun MutableList.addMinimumAmountErrorNotification( - feeAmount: BigDecimal, - receivedAmount: BigDecimal, - ) { - val coinCryptoCurrencyStatus = coinCryptoCurrencyStatusProvider() - val minimum = BigDecimal(DOGECOIN_MINIMUM) - - val isDogecoin = isDogecoin(coinCryptoCurrencyStatus.currency.network.id.value) - val isExceedDustLimit = checkDustLimits(feeAmount, receivedAmount, minimum) - if (isDogecoin && isExceedDustLimit) { - add(SendNotification.Error.MinimumAmountError(DOGECOIN_MINIMUM)) - } - } - private suspend fun MutableList.addDustWarningNotification( feeAmount: BigDecimal, receivedAmount: BigDecimal, @@ -377,8 +360,4 @@ internal class SendNotificationFactory( val isChangeLowerThanDust = change < dustValue && change > BigDecimal.ZERO return receivedAmount < dustValue || isChangeLowerThanDust } - - companion object { - private const val DOGECOIN_MINIMUM = "0.01" - } } \ No newline at end of file diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 603776f9f0..aafc6fdb14 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -85,7 +85,7 @@ leakcanary = "2.13" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.9-608" +tangemBlockchainSdk = "release-app_5.9.1-610" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.9-343" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ From 20402fcbdea44a006dd1d19949baf1a6ca13ea7d Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 26 Apr 2024 15:14:27 +0500 Subject: [PATCH 06/21] Updated on 2026-08-14 --- .../analytics/SendAnalyticEvents.kt | 15 +++++++++ ...cSender.kt => SendScreenAnalyticSender.kt} | 32 +++++++++++++++++-- .../state/previewdata/SendClickIntentsStub.kt | 2 ++ .../send/impl/presentation/ui/SendScreen.kt | 10 +++--- .../viewmodel/SendClickIntents.kt | 2 ++ .../presentation/viewmodel/SendViewModel.kt | 20 +++++++++--- 6 files changed, 70 insertions(+), 11 deletions(-) rename features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/{SendOnNextScreenAnalyticSender.kt => SendScreenAnalyticSender.kt} (69%) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt index e99471d8de..feca8a0786 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt @@ -16,6 +16,20 @@ internal sealed class SendAnalyticEvents( params: Map = mapOf(), ) : AnalyticsEvent(category = "Token / Send", event = event, params = params) { + /** Close button clicked */ + data class CloseButtonClicked( + val source: SendScreenSource, + val isFromSummary: Boolean, + val isValid: Boolean, + ) : SendAnalyticEvents( + event = "Button - Close", + params = mapOf( + SOURCE to source.name, + "FromSummary" to if (isFromSummary) "Yes" else "No", + "isValid" to if (isValid) "Yes" else "No", + ), + ) + // region Address /** Recipient address screen opened */ data object AddressScreenOpened : SendAnalyticEvents(event = "Address Screen Opened") @@ -119,6 +133,7 @@ internal enum class SendScreenSource { Address, Amount, Fee, + Confirm, } internal enum class EnterAddressSource { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendOnNextScreenAnalyticSender.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendScreenAnalyticSender.kt similarity index 69% rename from features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendOnNextScreenAnalyticSender.kt rename to features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendScreenAnalyticSender.kt index 6fefbc87b8..27c93b9743 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendOnNextScreenAnalyticSender.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendScreenAnalyticSender.kt @@ -5,15 +5,17 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.features.send.impl.presentation.analytics.SelectedCurrencyType import com.tangem.features.send.impl.presentation.analytics.SelectedFeeType import com.tangem.features.send.impl.presentation.analytics.SendAnalyticEvents -import com.tangem.features.send.impl.presentation.state.* +import com.tangem.features.send.impl.presentation.analytics.SendScreenSource import com.tangem.features.send.impl.presentation.state.SendUiState +import com.tangem.features.send.impl.presentation.state.SendUiStateType import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.state.fee.FeeSelectorState import com.tangem.features.send.impl.presentation.state.fee.FeeType import com.tangem.utils.Provider -internal class SendOnNextScreenAnalyticSender( +internal class SendScreenAnalyticSender( private val stateRouterProvider: Provider, + private val currentStateProvider: Provider, private val analyticsEventHandler: AnalyticsEventHandler, ) { fun send(prevScreen: SendUiStateType, state: SendUiState) { @@ -45,6 +47,32 @@ internal class SendOnNextScreenAnalyticSender( } } + fun sendOnClose() { + val routerState = stateRouterProvider().currentState.value + val state = currentStateProvider() + + val (source, isValid) = when (routerState.type) { + SendUiStateType.Recipient, + SendUiStateType.EditRecipient, + -> SendScreenSource.Address to (state.editRecipientState?.isPrimaryButtonEnabled ?: false) + SendUiStateType.Amount, + SendUiStateType.EditAmount, + -> SendScreenSource.Amount to (state.editAmountState?.isPrimaryButtonEnabled ?: false) + SendUiStateType.Fee, + SendUiStateType.EditFee, + -> SendScreenSource.Fee to (state.editFeeState?.isPrimaryButtonEnabled ?: false) + else -> SendScreenSource.Confirm to true + } + + analyticsEventHandler.send( + SendAnalyticEvents.CloseButtonClicked( + source = source, + isFromSummary = routerState.isFromConfirmation, + isValid = isValid, + ), + ) + } + private fun sendSelectedFeeAnalytics(feeSelectorState: FeeSelectorState.Content) { val type = when (feeSelectorState.fees) { is TransactionFee.Single -> SelectedFeeType.Fixed diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt index 0a113ea474..84a2a7b90d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt @@ -14,6 +14,8 @@ internal object SendClickIntentsStub : SendClickIntents { override fun onBackClick() {} + override fun onCloseClick() {} + override fun onNextClick(isFromEdit: Boolean) {} override fun onPrevClick() {} diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt index b289867885..5c7eba689d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.withIndex @Composable internal fun SendScreen(uiState: SendUiState, currentState: SendUiCurrentScreen) { val snackbarHostState = remember { SnackbarHostState() } - BackHandler { uiState.clickIntents.onBackClick() } + BackHandler(onBack = uiState.clickIntents::onBackClick) Column( modifier = Modifier .fillMaxSize() @@ -88,17 +88,17 @@ private fun SendAppBar(uiState: SendUiState, currentState: SendUiCurrentScreen) } else { null } - val (backIcon, backClick) = when (currentState.type) { + val backIcon = when (currentState.type) { SendUiStateType.EditAmount, SendUiStateType.EditFee, SendUiStateType.EditRecipient, - -> R.drawable.ic_back_24 to uiState.clickIntents::onBackClick - else -> R.drawable.ic_close_24 to uiState.clickIntents::popBackStack + -> R.drawable.ic_back_24 + else -> R.drawable.ic_close_24 } AppBarWithBackButtonAndIcon( text = titleRes?.resolveReference(), subtitle = subtitleRes, - onBackClick = backClick, + onBackClick = uiState.clickIntents::onCloseClick, onIconClick = uiState.clickIntents::onQrCodeScanClick, backIconRes = backIcon, iconRes = iconRes, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt index f0715cd50a..76a22a3b24 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt @@ -14,6 +14,8 @@ internal interface SendClickIntents { fun onBackClick() + fun onCloseClick() + fun onNextClick(isFromEdit: Boolean = false) fun onPrevClick() diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index 1d678b777e..3212417a3e 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -47,7 +47,7 @@ import com.tangem.features.send.impl.navigation.InnerSendRouter import com.tangem.features.send.impl.presentation.analytics.EnterAddressSource import com.tangem.features.send.impl.presentation.analytics.SendAnalyticEvents import com.tangem.features.send.impl.presentation.analytics.SendScreenSource -import com.tangem.features.send.impl.presentation.analytics.utils.SendOnNextScreenAnalyticSender +import com.tangem.features.send.impl.presentation.analytics.utils.SendScreenAnalyticSender import com.tangem.features.send.impl.presentation.domain.AvailableWallet import com.tangem.features.send.impl.presentation.state.* import com.tangem.features.send.impl.presentation.state.amount.AmountStateFactory @@ -174,9 +174,10 @@ internal class SendViewModel @Inject constructor( getBalanceNotEnoughForFeeWarningUseCase = getBalanceNotEnoughForFeeWarningUseCase, ) - private val sendOnNextScreenAnalyticSender by lazy(LazyThreadSafetyMode.NONE) { - SendOnNextScreenAnalyticSender( + private val sendScreenAnalyticSender by lazy(LazyThreadSafetyMode.NONE) { + SendScreenAnalyticSender( stateRouterProvider = Provider { stateRouter }, + currentStateProvider = Provider { uiState }, analyticsEventHandler = analyticsEventHandler, ) } @@ -498,10 +499,21 @@ internal class SendViewModel @Inject constructor( stateRouter.onBackClick(isSuccess = uiState.sendState?.isSuccess == true) } + override fun onCloseClick() { + sendScreenAnalyticSender.sendOnClose() + when (stateRouter.currentState.value.type) { + SendUiStateType.EditAmount, + SendUiStateType.EditFee, + SendUiStateType.EditRecipient, + -> onBackClick() + else -> popBackStack() + } + } + override fun onNextClick(isFromEdit: Boolean) { val currentState = stateRouter.currentState.value uiState = stateFactory.syncEditStates(isFromEdit = isFromEdit) - sendOnNextScreenAnalyticSender.send(currentState.type, uiState) + sendScreenAnalyticSender.send(currentState.type, uiState) when (currentState.type) { SendUiStateType.Fee, SendUiStateType.EditFee, From 52306efb20206afdf2c859d5a210df00392abea1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 25 Apr 2024 15:15:08 +0300 Subject: [PATCH 07/21] Updated on 2026-08-14 --- app/src/debug/res/xml/network_security_config.xml | 4 ++-- app/src/external/res/xml/network_security_config.xml | 5 +++-- app/src/internal/res/xml/network_security_config.xml | 4 ++-- app/src/main/res/xml/network_security_config.xml | 7 ++----- .../connection/RealInternetConnectionManager.kt | 10 +++++++++- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/debug/res/xml/network_security_config.xml b/app/src/debug/res/xml/network_security_config.xml index 894912ac61..52c44ac992 100644 --- a/app/src/debug/res/xml/network_security_config.xml +++ b/app/src/debug/res/xml/network_security_config.xml @@ -1,9 +1,9 @@ - + - + diff --git a/app/src/external/res/xml/network_security_config.xml b/app/src/external/res/xml/network_security_config.xml index 894912ac61..d49c0f70ba 100644 --- a/app/src/external/res/xml/network_security_config.xml +++ b/app/src/external/res/xml/network_security_config.xml @@ -1,9 +1,10 @@ - + - + + diff --git a/app/src/internal/res/xml/network_security_config.xml b/app/src/internal/res/xml/network_security_config.xml index 894912ac61..52c44ac992 100644 --- a/app/src/internal/res/xml/network_security_config.xml +++ b/app/src/internal/res/xml/network_security_config.xml @@ -1,9 +1,9 @@ - + - + diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index 22e9f8653e..683208ffda 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -1,11 +1,8 @@ - - - api.tangem.com + - - + diff --git a/core/datasource/src/main/java/com/tangem/datasource/connection/RealInternetConnectionManager.kt b/core/datasource/src/main/java/com/tangem/datasource/connection/RealInternetConnectionManager.kt index 8ca86a2587..7a3279d188 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/connection/RealInternetConnectionManager.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/connection/RealInternetConnectionManager.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.reactive.asFlow +private const val PING_SERVER = "https://clients3.google.com/generate_204" private const val PING_INTERVAL = 5_000 internal class RealInternetConnectionManager : NetworkConnectionManager { @@ -24,7 +25,12 @@ internal class RealInternetConnectionManager : NetworkConnectionManager { private val initialNetworkResult: Boolean by lazy { ReactiveNetwork - .checkInternetConnectivity() + .checkInternetConnectivity( + InternetObservingSettings.builder() + .host(PING_SERVER) + .port(443) + .build(), + ) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .blockingGet() @@ -33,6 +39,8 @@ internal class RealInternetConnectionManager : NetworkConnectionManager { override val isOnlineFlow: StateFlow = ReactiveNetwork .observeInternetConnectivity( InternetObservingSettings.builder() + .host(PING_SERVER) + .port(443) .interval(PING_INTERVAL) .build(), ) From 9afc2422e66ada231b046105609b6f9728d501f7 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 26 Apr 2024 17:22:57 +0500 Subject: [PATCH 08/21] Updated on 2026-08-14 --- .../presentation/state/SendStateFactory.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt index 32b43ad33a..caab9c9dc0 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt @@ -285,7 +285,11 @@ internal class SendStateFactory( return state.copy( sendState = state.sendState?.copy( isSending = isSending, - isPrimaryButtonEnabled = isPrimaryButtonEnabled(state, state.sendState.notifications), + isPrimaryButtonEnabled = isPrimaryButtonEnabled( + state = state, + isSending = isSending, + notifications = state.sendState.notifications, + ), ), ) } @@ -309,7 +313,11 @@ internal class SendStateFactory( val sendState = state.sendState ?: return state return state.copy( sendState = sendState.copy( - isPrimaryButtonEnabled = isPrimaryButtonEnabled(state, notifications), + isPrimaryButtonEnabled = isPrimaryButtonEnabled( + state = state, + isSending = sendState.isSending, + notifications = notifications, + ), notifications = notifications, showTapHelp = sendState.showTapHelp && notifications.isEmpty(), ), @@ -324,11 +332,14 @@ internal class SendStateFactory( ) } - private fun isPrimaryButtonEnabled(state: SendUiState, notifications: ImmutableList): Boolean { - val sendState = state.sendState ?: return false + private fun isPrimaryButtonEnabled( + state: SendUiState, + isSending: Boolean, + notifications: ImmutableList, + ): Boolean { val feeState = state.getFeeState(stateRouterProvider().isEditState) ?: return false val hasErrorNotifications = notifications.any { it is SendNotification.Error } - return !hasErrorNotifications && !sendState.isSending && feeState.feeSelectorState is FeeSelectorState.Content + return !hasErrorNotifications && !isSending && feeState.feeSelectorState is FeeSelectorState.Content } //endregion } \ No newline at end of file From be6caf0e4dc134c0e9ce1aafbb75f16cc3413e5d Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 12:26:22 +0500 Subject: [PATCH 09/21] Updated on 2026-08-14 --- .../tangem/features/send/impl/presentation/state/SendUiState.kt | 1 + .../presentation/state/amount/SendAmountCurrencyConverter.kt | 1 + .../impl/presentation/state/amount/SendAmountStateConverter.kt | 1 + .../presentation/state/previewdata/AmountStatePreviewData.kt | 1 + .../features/send/impl/presentation/ui/amount/AmountButtons.kt | 2 ++ .../send/impl/presentation/ui/amount/SendAmountContent.kt | 1 + 6 files changed, 7 insertions(+) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt index 23453c4b4d..75d8e642e2 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt @@ -97,6 +97,7 @@ internal sealed class SendStates { val walletBalance: TextReference, val tokenIconState: TokenIconState, val segmentedButtonConfig: PersistentList, + val selectedButton: Int, val isSegmentedButtonsEnabled: Boolean, val amountTextField: SendTextField.AmountField, val appCurrencyCode: String, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt index 369918da01..fa31b63ea0 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountCurrencyConverter.kt @@ -38,6 +38,7 @@ internal class SendAmountCurrencyConverter( keyboardType = KeyboardType.Number, ), ), + selectedButton = amountState.segmentedButtonConfig.indexOfFirst { it.isFiat == value }, ), ) } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt index 7e3199d1ff..6afdc1ada8 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt @@ -57,6 +57,7 @@ internal class SendAmountStateConverter( ), ), isSegmentedButtonsEnabled = !noFeeRate, + selectedButton = 0, ) } } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt index d39cd3df01..e1685ad0cf 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt @@ -49,6 +49,7 @@ internal object AmountStatePreviewData { onValuePastedTriggerDismiss = {}, ), isSegmentedButtonsEnabled = true, + selectedButton = 0, ) val fiatAmountState = amountState.copy( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt index 340f8e20ad..1b6315e1ea 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt @@ -29,6 +29,7 @@ internal fun LazyListScope.buttons( segmentedButtonConfig: PersistentList, clickIntents: SendClickIntents, isSegmentedButtonsEnabled: Boolean, + selectedButton: Int, ) { item( key = AMOUNT_BUTTONS_KEY, @@ -48,6 +49,7 @@ internal fun LazyListScope.buttons( hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) clickIntents.onCurrencyChangeClick(it.isFiat) }, + initialSelectedItem = segmentedButtonConfig.getOrNull(selectedButton), isEnabled = isSegmentedButtonsEnabled, ) { SendAmountCurrencyButton( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt index 44b5a0244d..01d23d4edb 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt @@ -36,6 +36,7 @@ internal fun SendAmountContent( segmentedButtonConfig = amountState.segmentedButtonConfig, clickIntents = clickIntents, isSegmentedButtonsEnabled = amountState.isSegmentedButtonsEnabled, + selectedButton = amountState.selectedButton, ) } } From fdf7c6eef10bb9ef0aa4d7998eccce40a8f4d7c2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 12:45:30 +0500 Subject: [PATCH 10/21] Updated on 2026-08-14 --- .../ui/components/rows/SelectorRowItem.kt | 30 ++++---- .../presentation/state/fee/FeeCalculation.kt | 8 +++ .../fee/custom/BitcoinCustomFeeConverter.kt | 49 ++++++------- .../fee/custom/EthereumCustomFeeConverter.kt | 69 ++++++++++--------- .../fields/SendAmountFieldChangeConverter.kt | 26 ++++--- .../state/fields/SendAmountFieldConverter.kt | 17 +++-- .../ui/fee/SendSpeedSelectorItem.kt | 2 +- .../impl/presentation/ui/send/AmountBlock.kt | 4 +- .../impl/presentation/ui/send/FeeBlock.kt | 2 +- .../impl/presentation/utils/FormatterUtils.kt | 6 +- 10 files changed, 118 insertions(+), 95 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/rows/SelectorRowItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/rows/SelectorRowItem.kt index bedec66060..b919363574 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/rows/SelectorRowItem.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/rows/SelectorRowItem.kt @@ -73,7 +73,7 @@ fun SelectorRowItem( color = TangemTheme.colors.text.primary1, modifier = Modifier.padding(start = TangemTheme.dimens.spacing8), ) - if (preDot != null && postDot != null) { + if (preDot != null) { SelectorValueContent( preDot = preDot, postDot = postDot, @@ -97,7 +97,7 @@ fun SelectorRowItem( @Composable private fun RowScope.SelectorValueContent( preDot: TextReference, - postDot: TextReference, + postDot: TextReference?, ellipsizeOffset: Int? = null, ) { val ellipsis = if (ellipsizeOffset == null) { @@ -115,18 +115,20 @@ private fun RowScope.SelectorValueContent( .weight(1f) .padding(start = TangemTheme.dimens.spacing4), ) - Text( - text = "•", - style = TangemTheme.typography.caption2, - color = TangemTheme.colors.text.primary1, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing4), - ) - Text( - text = postDot.resolveReference(), - style = TangemTheme.typography.body2, - color = TangemTheme.colors.text.tertiary, - ) + if (postDot != null) { + Text( + text = "•", + style = TangemTheme.typography.caption2, + color = TangemTheme.colors.text.primary1, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing4), + ) + Text( + text = postDot.resolveReference(), + style = TangemTheme.typography.body2, + color = TangemTheme.colors.text.tertiary, + ) + } } @Preview diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt index 43e7da9e42..5376e57084 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt @@ -2,6 +2,7 @@ package com.tangem.features.send.impl.presentation.state.fee import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.transaction.TransactionFee +import com.tangem.common.extensions.isZero import com.tangem.core.ui.utils.parseBigDecimal import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.common.extensions.minimalAmount @@ -95,5 +96,12 @@ internal fun checkIfFeeTooHigh(feeSelectorState: FeeSelectorState.Content, onSho return isShow } +/** + * Checks if fee exceeds fee paid currency balance + */ +fun checkExceedBalance(feeBalance: BigDecimal?, feeAmount: BigDecimal?): Boolean { + return feeAmount == null || feeBalance == null || feeAmount.isZero() || feeAmount > feeBalance +} + private val FEE_MAX_DIFF = BigDecimal("5") private const val ZERO_DECIMALS = 0 \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt index 5594d8d917..a2a13e987a 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/BitcoinCustomFeeConverter.kt @@ -5,18 +5,16 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import com.tangem.blockchain.common.transaction.Fee -import com.tangem.common.extensions.isZero -import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference -import com.tangem.core.ui.extensions.stringReference -import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.core.ui.utils.parseBigDecimal import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.features.send.impl.R import com.tangem.features.send.impl.presentation.state.StateRouter +import com.tangem.features.send.impl.presentation.state.fee.checkExceedBalance import com.tangem.features.send.impl.presentation.state.fields.SendTextField +import com.tangem.features.send.impl.presentation.utils.getFiatReference import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import com.tangem.lib.crypto.BlockchainUtils.isBitcoin import com.tangem.utils.Provider @@ -35,6 +33,7 @@ internal class BitcoinCustomFeeConverter( override fun convert(value: Fee.Bitcoin): ImmutableList { val feeValue = value.amount.value + val feeCurrency = feeCryptoCurrencyStatusProvider()?.value val network = feeCryptoCurrencyStatusProvider()?.currency?.network?.id?.value return if (network != null && isBitcoin(network)) { persistentListOf( @@ -49,7 +48,11 @@ internal class BitcoinCustomFeeConverter( ), title = resourceReference(R.string.send_max_fee), footer = resourceReference(R.string.send_max_fee_footer), - label = getFeeFormatted(feeValue), + label = getFiatReference( + rate = feeCurrency?.fiatRate, + value = feeValue, + appCurrency = appCurrencyProvider(), + ), keyboardActions = KeyboardActions(), isReadonly = true, ), @@ -65,7 +68,15 @@ internal class BitcoinCustomFeeConverter( footer = resourceReference(R.string.send_satoshi_per_byte_text), onValueChange = { clickIntents.onCustomFeeValueChange(FEE_SATOSHI_INDEX, it) }, keyboardOptions = KeyboardOptions( - imeAction = if (checkExceedBalance(feeValue)) ImeAction.None else ImeAction.Done, + imeAction = if (checkExceedBalance( + feeBalance = feeCurrency?.amount, + feeAmount = feeValue, + ) + ) { + ImeAction.None + } else { + ImeAction.Done + }, keyboardType = KeyboardType.Number, ), keyboardActions = KeyboardActions( @@ -104,7 +115,11 @@ internal class BitcoinCustomFeeConverter( FEE_AMOUNT_INDEX, this[FEE_AMOUNT_INDEX].copy( value = newFeeAmount.parseBigDecimal(this[FEE_AMOUNT_INDEX].decimals), - label = getFeeFormatted(newFeeAmount), + label = getFiatReference( + rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate, + value = newFeeAmount, + appCurrency = appCurrencyProvider(), + ), ), ) set(index, this[index].copy(value = value)) @@ -112,26 +127,6 @@ internal class BitcoinCustomFeeConverter( }.toImmutableList() } - private fun getFeeFormatted(fee: BigDecimal?): TextReference { - val appCurrency = appCurrencyProvider() - val rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate - val fiatFee = rate?.let { fee?.multiply(it) } - return stringReference( - BigDecimalFormatter.formatFiatAmount( - fiatAmount = fiatFee, - fiatCurrencyCode = appCurrency.code, - fiatCurrencySymbol = appCurrency.symbol, - ), - ) - } - - private fun checkExceedBalance(feeAmount: BigDecimal?): Boolean { - val cryptoCurrencyStatus = feeCryptoCurrencyStatusProvider() - val currencyCryptoAmount = cryptoCurrencyStatus?.value?.amount ?: BigDecimal.ZERO - - return feeAmount == null || feeAmount.isZero() || feeAmount > currencyCryptoAmount - } - private fun toSatoshiPerByte(amount: BigDecimal?, decimals: Int, txSize: BigDecimal): BigDecimal? { val newFeeAmount = amount?.movePointRight(decimals) return newFeeAmount?.divide( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt index 9428dbdfc0..6bed843250 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/custom/EthereumCustomFeeConverter.kt @@ -5,24 +5,21 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import com.tangem.blockchain.common.transaction.Fee -import com.tangem.common.extensions.isZero -import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference -import com.tangem.core.ui.extensions.stringReference -import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.core.ui.utils.parseBigDecimal import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.features.send.impl.R import com.tangem.features.send.impl.presentation.state.StateRouter +import com.tangem.features.send.impl.presentation.state.fee.checkExceedBalance import com.tangem.features.send.impl.presentation.state.fields.SendTextField +import com.tangem.features.send.impl.presentation.utils.getFiatReference import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import com.tangem.utils.Provider import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -import java.math.BigDecimal import java.math.RoundingMode internal class EthereumCustomFeeConverter( @@ -34,6 +31,7 @@ internal class EthereumCustomFeeConverter( override fun convert(value: Fee.Ethereum): ImmutableList { val feeValue = value.amount.value + val feeCurrency = feeCryptoCurrencyStatusProvider()?.value return persistentListOf( SendTextField.CustomFee( value = feeValue?.parseBigDecimal(value.amount.decimals).orEmpty(), @@ -46,7 +44,11 @@ internal class EthereumCustomFeeConverter( ), title = resourceReference(R.string.send_max_fee), footer = resourceReference(R.string.send_max_fee_footer), - label = getFeeFormatted(feeValue), + label = getFiatReference( + rate = feeCurrency?.fiatRate, + value = feeValue, + appCurrency = appCurrencyProvider(), + ), keyboardActions = KeyboardActions(), ), SendTextField.CustomFee( @@ -70,7 +72,16 @@ internal class EthereumCustomFeeConverter( footer = resourceReference(R.string.send_gas_limit_footer), onValueChange = { clickIntents.onCustomFeeValueChange(GAS_LIMIT, it) }, keyboardOptions = KeyboardOptions( - imeAction = if (checkExceedBalance(feeValue)) ImeAction.None else ImeAction.Done, + imeAction = if ( + checkExceedBalance( + feeBalance = feeCurrency?.amount, + feeAmount = feeValue, + ) + ) { + ImeAction.None + } else { + ImeAction.Done + }, keyboardType = KeyboardType.Number, ), keyboardActions = KeyboardActions( @@ -106,26 +117,6 @@ internal class EthereumCustomFeeConverter( }.toImmutableList() } - private fun getFeeFormatted(fee: BigDecimal?): TextReference { - val appCurrency = appCurrencyProvider() - val rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate - val fiatFee = rate?.let { fee?.multiply(it) } - return stringReference( - BigDecimalFormatter.formatFiatAmount( - fiatAmount = fiatFee, - fiatCurrencyCode = appCurrency.code, - fiatCurrencySymbol = appCurrency.symbol, - ), - ) - } - - private fun checkExceedBalance(feeAmount: BigDecimal?): Boolean { - val cryptoCurrencyStatus = feeCryptoCurrencyStatusProvider() - val currencyCryptoAmount = cryptoCurrencyStatus?.value?.amount ?: BigDecimal.ZERO - - return feeAmount == null || feeAmount.isZero() || feeAmount > currencyCryptoAmount - } - private fun MutableList.setEmpty(index: Int) { set(index, this[index].copy(value = "")) } @@ -144,7 +135,11 @@ internal class EthereumCustomFeeConverter( index, this[index].copy( value = value, - label = getFeeFormatted(newFeeAmountDecimal), + label = getFiatReference( + rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate, + value = newFeeAmountDecimal, + appCurrency = appCurrencyProvider(), + ), ), ) } @@ -163,7 +158,11 @@ internal class EthereumCustomFeeConverter( FEE_AMOUNT, this[FEE_AMOUNT].copy( value = newFeeAmount.parseBigDecimal(this[FEE_AMOUNT].decimals), - label = getFeeFormatted(newFeeAmount), + label = getFiatReference( + rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate, + value = newFeeAmount, + appCurrency = appCurrencyProvider(), + ), ), ) set(index, this[index].copy(value = value)) @@ -183,15 +182,23 @@ internal class EthereumCustomFeeConverter( FEE_AMOUNT, this[FEE_AMOUNT].copy( value = newFeeAmount.parseBigDecimal(this[FEE_AMOUNT].decimals), - label = getFeeFormatted(newFeeAmount), + label = getFiatReference( + rate = feeCryptoCurrencyStatusProvider()?.value?.fiatRate, + value = newFeeAmount, + appCurrency = appCurrencyProvider(), + ), ), ) + val isNotExceedBalance = checkExceedBalance( + feeBalance = feeCryptoCurrencyStatusProvider()?.value?.amount, + feeAmount = newFeeAmount, + ) set( index, this[index].copy( value = value, keyboardOptions = KeyboardOptions( - imeAction = if (!checkExceedBalance(newFeeAmount)) ImeAction.None else ImeAction.Done, + imeAction = if (!isNotExceedBalance) ImeAction.None else ImeAction.Done, keyboardType = KeyboardType.Number, ), ), diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt index 04c375714e..86d87bf3cc 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt @@ -11,6 +11,7 @@ import com.tangem.features.send.impl.presentation.state.SendUiState import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.utils.Provider import com.tangem.utils.converter.Converter +import com.tangem.utils.isNullOrZero import java.math.BigDecimal import java.math.RoundingMode @@ -31,13 +32,15 @@ internal class SendAmountFieldChangeConverter( val trimmedValue = value.trim() val cryptoValue = trimmedValue.getCryptoValue(amountTextField.isFiatValue, cryptoDecimals) - val fiatValue = trimmedValue.getFiatValue(amountTextField.isFiatValue, fiatDecimals) val decimalCryptoValue = cryptoValue.parseToBigDecimal(cryptoDecimals) - val decimalFiatValue = fiatValue.parseToBigDecimal(fiatDecimals) + val (fiatValue, decimalFiatValue) = trimmedValue.getFiatValue( + isFiatValue = amountTextField.isFiatValue, + decimals = fiatDecimals, + ) val checkValue = if (amountTextField.isFiatValue) fiatValue else cryptoValue val isExceedBalance = checkValue.checkExceedBalance(amountTextField) - val isZero = if (amountTextField.isFiatValue) decimalFiatValue.isZero() else decimalCryptoValue.isZero() + val isZero = if (amountTextField.isFiatValue) decimalFiatValue.isNullOrZero() else decimalCryptoValue.isZero() return state.copyWrapped( isEditState = isEditState, amountState = amountState.copy( @@ -68,13 +71,18 @@ internal class SendAmountFieldChangeConverter( } } - private fun String.getFiatValue(isFiatValue: Boolean, decimals: Int): String { - val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() - val fiatRate = cryptoCurrencyStatus.value.fiatRate - return if (!isFiatValue && fiatRate != null) { - parseToBigDecimal(decimals).multiply(fiatRate).parseBigDecimal(decimals) + private fun String.getFiatValue(isFiatValue: Boolean, decimals: Int): Pair { + val fiatRate = cryptoCurrencyStatusProvider().value.fiatRate + return if (fiatRate != null) { + val fiatValue = if (!isFiatValue) { + parseToBigDecimal(decimals).multiply(fiatRate).parseBigDecimal(decimals) + } else { + this + } + val decimalFiatValue = fiatValue.parseToBigDecimal(decimals) + fiatValue to decimalFiatValue } else { - this + "" to null } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt index 14f7f4b660..8bf30c0b57 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldConverter.kt @@ -18,6 +18,7 @@ import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents import com.tangem.utils.Provider import com.tangem.utils.converter.Converter +import com.tangem.utils.isNullOrZero import java.math.BigDecimal private const val FIAT_DECIMALS = 2 @@ -34,12 +35,14 @@ internal class SendAmountFieldConverter( val cryptoDecimal = value.toBigDecimalOrDefault() val cryptoAmount = cryptoDecimal.convertToAmount(cryptoCurrencyStatus.currency) val fiatRate = cryptoCurrencyStatus.value.fiatRate - val (fiatValue, fiatDecimal) = if (value.isEmpty()) { - "" to BigDecimal.ZERO - } else { - val fiatDecimal = fiatRate?.multiply(cryptoDecimal) ?: BigDecimal.ZERO - val fiatValue = fiatDecimal.parseBigDecimal(FIAT_DECIMALS) - fiatValue to fiatDecimal + val (fiatValue, fiatDecimal) = when { + fiatRate.isNullOrZero() -> "" to null + value.isEmpty() -> "" to BigDecimal.ZERO + else -> { + val fiatDecimal = fiatRate?.multiply(cryptoDecimal) + val fiatValue = fiatDecimal?.parseBigDecimal(FIAT_DECIMALS).orEmpty() + fiatValue to fiatDecimal + } } val isDoneActionEnabled = !cryptoDecimal.isZero() return SendTextField.AmountField( @@ -64,7 +67,7 @@ internal class SendAmountFieldConverter( ) } - private fun getAppCurrencyAmount(fiatValue: BigDecimal, appCurrency: AppCurrency) = Amount( + private fun getAppCurrencyAmount(fiatValue: BigDecimal?, appCurrency: AppCurrency) = Amount( currencySymbol = appCurrency.symbol, value = fiatValue, decimals = FIAT_DECIMALS, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedSelectorItem.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedSelectorItem.kt index 0a2a65c93e..c42e7e152d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedSelectorItem.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/fee/SendSpeedSelectorItem.kt @@ -54,7 +54,7 @@ internal fun SendSpeedSelectorItem( onSelect = onSelect, modifier = modifier, preDot = getCryptoReference(amount, state.isFeeApproximate), - postDot = getFiatReference(amount, state.rate, state.appCurrency), + postDot = getFiatReference(amount?.value, state.rate, state.appCurrency), ellipsizeOffset = amount?.currencySymbol?.length, isSelected = content?.selectedFee == feeType, showDivider = showDivider, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt index 85ff055ed6..ab68759908 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt @@ -31,8 +31,8 @@ internal fun AmountBlock( val amount = amountState.amountTextField val cryptoAmount = BigDecimalFormatter.formatWithSymbol(amount.value, amount.cryptoAmount.currencySymbol) - val fiatAmount = BigDecimalFormatter.formatFiatEditableAmount( - fiatAmount = amount.fiatValue, + val fiatAmount = BigDecimalFormatter.formatFiatAmount( + fiatAmount = amount.fiatAmount.value, fiatCurrencySymbol = amount.fiatAmount.currencySymbol, fiatCurrencyCode = amountState.appCurrencyCode, ) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt index 11423e7c73..30814b802f 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt @@ -60,7 +60,7 @@ internal fun FeeBlock(feeState: SendStates.FeeState, isSuccess: Boolean, onClick titleRes = title, iconRes = icon, preDot = getCryptoReference(feeAmount, feeState.isFeeApproximate), - postDot = feeAmount?.let { getFiatReference(it, feeState.rate, feeState.appCurrency) }, + postDot = getFiatReference(feeAmount?.value, feeState.rate, feeState.appCurrency), ellipsizeOffset = feeAmount?.currencySymbol?.length, isSelected = true, showDivider = false, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt index 022d0c5711..e21fe8c0c5 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/utils/FormatterUtils.kt @@ -22,11 +22,11 @@ internal fun getCryptoReference(amount: Amount?, isFeeApproximate: Boolean): Tex ) } -internal fun getFiatReference(amount: Amount?, rate: BigDecimal?, appCurrency: AppCurrency): TextReference? { - if (amount == null) return null +internal fun getFiatReference(value: BigDecimal?, rate: BigDecimal?, appCurrency: AppCurrency): TextReference? { + if (value == null || rate == null) return null return stringReference( BigDecimalFormatter.formatFiatAmount( - fiatAmount = rate?.let { amount.value?.multiply(it) }, + fiatAmount = value.multiply(rate), fiatCurrencyCode = appCurrency.code, fiatCurrencySymbol = appCurrency.symbol, ), From 754a599f9fed732fb0f8057a913192f3e573fe4c Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 14:59:00 +0500 Subject: [PATCH 11/21] Updated on 2026-08-14 --- .../impl/presentation/viewmodel/SendViewModel.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index 3212417a3e..4ad08c9264 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -734,14 +734,12 @@ internal class SendViewModel @Inject constructor( val recipientState = uiState.getRecipientState(isFromConfirmation) ?: return null val amount = amountState.amountTextField.cryptoAmount.value ?: return null - return feeCryptoCurrencyStatus?.let { feeCurrencyStatus -> - getFeeUseCase.invoke( - amount = amount, - destination = recipientState.addressTextField.value, - userWallet = userWallet, - cryptoCurrency = feeCurrencyStatus.currency, - ) - } + return getFeeUseCase.invoke( + amount = amount, + destination = recipientState.addressTextField.value, + userWallet = userWallet, + cryptoCurrency = cryptoCurrencyStatus.currency, + ) } // endregion From 355e0bf0ef120e83958bed1a22f3b1b25d8530ad Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 17:57:29 +0500 Subject: [PATCH 12/21] Updated on 2026-08-14 --- .../ui/components/fields/SimpleTextField.kt | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt b/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt index 577485da0d..ff2bf968ae 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/fields/SimpleTextField.kt @@ -57,7 +57,7 @@ fun SimpleTextField( handleColor = TangemTheme.colors.text.accent, backgroundColor = TangemTheme.colors.text.accent.copy(alpha = 0.3f), ) - + val textFieldValue = textFieldValueState.copy(text = value) var lastTextValue by remember(proxyValue, isValuePasted) { textFieldValueState = textFieldValueState.copy( text = proxyValue, @@ -70,6 +70,13 @@ fun SimpleTextField( mutableStateOf(proxyValue) } + val isSelectionChanged by rememberSelectionChanged(textFieldValue, textFieldValueState) + LaunchedEffect(key1 = isSelectionChanged) { + if (isSelectionChanged) { + textFieldValueState = textFieldValue + } + } + // resets paste value cursor trigger LaunchedEffect(key1 = isValuePasted) { if (isValuePasted) { @@ -79,7 +86,7 @@ fun SimpleTextField( CompositionLocalProvider(LocalTextSelectionColors provides customTextSelectionColors) { BasicTextField( - value = textFieldValueState, + value = textFieldValue, onValueChange = { newTextFieldValueState -> textFieldValueState = newTextFieldValueState @@ -131,4 +138,14 @@ private fun SimpleTextPlaceholder( } textValue() } +} + +@Composable +private fun rememberSelectionChanged(textFieldValue: TextFieldValue, textFieldValueState: TextFieldValue) = remember { + derivedStateOf { + val isSelectionChanged = textFieldValue.selection != textFieldValueState.selection || + textFieldValue.composition != textFieldValueState.composition + val isTextNotChanged = textFieldValue.text == textFieldValueState.text + isSelectionChanged && isTextNotChanged + } } \ No newline at end of file From 622c14e401eb244b8c5ed379b49093e1aa1e8dea Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 17:58:03 +0500 Subject: [PATCH 13/21] Updated on 2026-08-14 --- .../presentation/state/SendStateFactory.kt | 22 ++++++++++++++++++- .../impl/presentation/state/SendUiState.kt | 1 + .../presentation/ui/SendNavigationButtons.kt | 6 ++++- .../presentation/viewmodel/SendViewModel.kt | 5 ++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt index caab9c9dc0..631cbdf100 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt @@ -18,6 +18,7 @@ import com.tangem.features.send.impl.presentation.state.common.SendSyncEditConve import com.tangem.features.send.impl.presentation.state.confirm.SendConfirmStateConverter import com.tangem.features.send.impl.presentation.state.fee.FeeSelectorState import com.tangem.features.send.impl.presentation.state.fee.SendFeeStateConverter +import com.tangem.features.send.impl.presentation.state.fee.checkFeeCoverage import com.tangem.features.send.impl.presentation.state.fields.SendAmountFieldConverter import com.tangem.features.send.impl.presentation.state.recipient.SendRecipientHistoryListConverter import com.tangem.features.send.impl.presentation.state.recipient.SendRecipientStateConverter @@ -28,8 +29,9 @@ import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList import timber.log.Timber +import java.math.BigDecimal -@Suppress("LongParameterList") +@Suppress("LongParameterList", "LargeClass") internal class SendStateFactory( private val clickIntents: SendClickIntents, private val stateRouterProvider: Provider, @@ -95,6 +97,7 @@ internal class SendStateFactory( isEditingDisabled = false, isBalanceHidden = false, cryptoCurrencyName = "", + isSubtracted = false, ) fun getReadyState(): SendUiState { @@ -280,6 +283,23 @@ internal class SendStateFactory( //endregion //region send + fun getIsAmountSubtractedState(isAmountSubtractAvailable: Boolean): SendUiState { + val state = currentStateProvider() + val balance = cryptoCurrencyStatusProvider().value.amount ?: return state + val amountState = state.getAmountState(stateRouterProvider().isEditState) ?: return state + val feeState = state.getFeeState(stateRouterProvider().isEditState) ?: return state + val amountValue = amountState.amountTextField.cryptoAmount.value ?: return state + val feeValue = feeState.fee?.amount?.value ?: BigDecimal.ZERO + return state.copy( + isSubtracted = checkFeeCoverage( + isSubtractAvailable = isAmountSubtractAvailable, + balance = balance, + amountValue = amountValue, + feeValue = feeValue, + ), + ) + } + fun getSendingStateUpdate(isSending: Boolean): SendUiState { val state = currentStateProvider() return state.copy( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt index 23453c4b4d..3ae999f99b 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt @@ -32,6 +32,7 @@ internal data class SendUiState( val editRecipientState: SendStates.RecipientState? = null, val editFeeState: SendStates.FeeState? = null, val isBalanceHidden: Boolean, + val isSubtracted: Boolean, val event: StateEvent, ) { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt index ace8e220f8..b0b37b764d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt @@ -165,7 +165,11 @@ private fun SendingText( val fiatRate = feeState?.rate val fiatAmount = amountState?.amountTextField?.fiatAmount val feeFiat = fiatRate?.let { feeState.fee?.amount?.value?.multiply(it) } - val sendingFiat = feeFiat?.let { fiatAmount?.value?.plus(it) } + val sendingFiat = if (uiState.isSubtracted) { + fiatAmount?.value + } else { + feeFiat?.let { fiatAmount?.value?.plus(it) } + } if (feeFiat != null && sendingFiat != null) { val sendingValue = BigDecimalFormatter.formatFiatAmount( diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index 4ad08c9264..50f368670f 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -465,7 +465,10 @@ internal class SendViewModel @Inject constructor( SendUiStateType.Fee, SendUiStateType.EditFee, -> loadFee() - SendUiStateType.Send -> sendIdleTimer = SystemClock.elapsedRealtime() + SendUiStateType.Send -> { + uiState = stateFactory.getIsAmountSubtractedState(isAmountSubtractAvailable) + sendIdleTimer = SystemClock.elapsedRealtime() + } else -> Unit } } From 8c3071ed1b08b05ec3c336faa7381d22651dc7ab Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 21:32:59 +0500 Subject: [PATCH 14/21] Updated on 2026-08-14 --- .../operations/CurrenciesStatusesOperations.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt index fac9f7fc95..d12ca4c9ad 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt @@ -264,10 +264,18 @@ internal class CurrenciesStatusesOperations( var quotesRetrievingFailed = false val networksStatuses = maybeNetworkStatuses?.bind()?.toNonEmptySetOrNull() - val quotes = recover({ maybeQuotes?.bind()?.toNonEmptySetOrNull() }) { - quotesRetrievingFailed = true - null - } + val quotes: Set? = maybeQuotes?.fold( + ifLeft = { + quotesRetrievingFailed = true + null + }, + ifRight = { + it.ifEmpty { + quotesRetrievingFailed = true + null + } + }, + ) currencies.map { currency -> val quote = quotes?.firstOrNull { it.rawCurrencyId == currency.id.rawCurrencyId } From 390513dc53efc13b8936702347a4fe48b46dfd89 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 21:33:50 +0500 Subject: [PATCH 15/21] Updated on 2026-08-14 --- .../tangem/data/transaction/DefaultTransactionRepository.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index 76b16b1409..3fe078eaad 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -71,7 +71,10 @@ internal class DefaultTransactionRepository( } Blockchain.Binance -> BinanceTransactionExtras(memo) Blockchain.XRP -> memo.toLongOrNull()?.let { XrpTransactionBuilder.XrpTransactionExtras(it) } - Blockchain.Cosmos -> CosmosTransactionExtras(memo) + Blockchain.Cosmos, + Blockchain.TerraV1, + Blockchain.TerraV2, + -> CosmosTransactionExtras(memo) Blockchain.TON -> TonTransactionExtras(memo) Blockchain.Hedera -> HederaTransactionBuilder.HederaTransactionExtras(memo) Blockchain.Algorand -> AlgorandTransactionExtras(memo) From 54cc9e6245787948f1847e1ddd8405ee0c267536 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 21:34:59 +0500 Subject: [PATCH 16/21] Updated on 2026-08-14 --- .../presentation/state/confirm/SendNotificationFactory.kt | 5 +++-- .../send/impl/presentation/state/fee/FeeCalculation.kt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt index 1de2ea58fb..74abacad98 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt @@ -71,7 +71,7 @@ internal class SendNotificationFactory( buildList { // errors addFeeUnreachableNotification(feeState.feeSelectorState) - addExceedBalanceNotification(feeValue, sendingAmount) + addExceedBalanceNotification(feeValue, sendingAmount, isFeeCoverage) addExceedsBalanceNotification(feeState.fee) addDustWarningNotification(feeValue, sendingAmount) addTransactionLimitErrorNotification(feeValue, sendingAmount) @@ -107,11 +107,12 @@ internal class SendNotificationFactory( private fun MutableList.addExceedBalanceNotification( feeAmount: BigDecimal, receivedAmount: BigDecimal, + isFeeCoverage: Boolean, ) { val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() val balance = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO - if (!isSubtractAvailableProvider()) return + if (isFeeCoverage) return val showNotification = receivedAmount + feeAmount > balance if (showNotification) { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt index 5376e57084..c7f5a024df 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt @@ -45,7 +45,7 @@ internal fun checkFeeCoverage( feeValue: BigDecimal, ): Boolean { if (!isSubtractAvailable) return false - return balance < amountValue + feeValue && balance > feeValue + return balance < amountValue + feeValue && balance > feeValue && balance >= amountValue } /** From 31145bbbe77028041537d232324ad969d00a663b Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 21:35:25 +0500 Subject: [PATCH 17/21] Updated on 2026-08-14 --- .../tangem/features/send/impl/presentation/state/StateRouter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/StateRouter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/StateRouter.kt index 5f2201052b..e09467fa9c 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/StateRouter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/StateRouter.kt @@ -34,7 +34,7 @@ internal class StateRouter( when { isSuccess -> popBackStack() isEditingDisabled -> when (type) { - SendUiStateType.Send -> showFee() + SendUiStateType.EditFee -> showSend() else -> popBackStack() } else -> when (type) { From ab246b2ec618c89af40e3904705a31fb5d861fac Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 21:36:47 +0500 Subject: [PATCH 18/21] Updated on 2026-08-14 --- .../features/send/impl/presentation/viewmodel/SendViewModel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index 50f368670f..f47a2a6fab 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -702,6 +702,7 @@ internal class SendViewModel @Inject constructor( val isShowStatus = uiState.feeState?.fee == null if (isShowStatus) { uiState = feeStateFactory.onFeeOnLoadingState() + updateNotifications() } val result = callFeeUseCase()?.fold( ifRight = { From 34cf43fc578f12893ed1a122db52bc993321c486 Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 21:37:18 +0500 Subject: [PATCH 19/21] Updated on 2026-08-14 --- .../features/send/impl/presentation/viewmodel/SendViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index f47a2a6fab..eca7088154 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -667,7 +667,7 @@ internal class SendViewModel @Inject constructor( private fun autoNextFromRecipient(type: EnterAddressSource?, isValidAddress: Boolean) { val isRecent = type == EnterAddressSource.RecentAddress - if (isRecent && isValidAddress) onNextClick() + if (isRecent && isValidAddress) onNextClick(stateRouter.isEditState) } // endregion From 6acd8d98d192b2b16a93c4c10c8936e3a409ef9b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 2 May 2024 13:44:39 +0500 Subject: [PATCH 20/21] Updated on 2026-08-14 --- .../presentation/state/confirm/SendNotificationFactory.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt index 74abacad98..1de2ea58fb 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt @@ -71,7 +71,7 @@ internal class SendNotificationFactory( buildList { // errors addFeeUnreachableNotification(feeState.feeSelectorState) - addExceedBalanceNotification(feeValue, sendingAmount, isFeeCoverage) + addExceedBalanceNotification(feeValue, sendingAmount) addExceedsBalanceNotification(feeState.fee) addDustWarningNotification(feeValue, sendingAmount) addTransactionLimitErrorNotification(feeValue, sendingAmount) @@ -107,12 +107,11 @@ internal class SendNotificationFactory( private fun MutableList.addExceedBalanceNotification( feeAmount: BigDecimal, receivedAmount: BigDecimal, - isFeeCoverage: Boolean, ) { val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() val balance = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO - if (isFeeCoverage) return + if (!isSubtractAvailableProvider()) return val showNotification = receivedAmount + feeAmount > balance if (showNotification) { From 224f40c4884c3224c3dacb216371ea9883e892e4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 2 May 2024 13:46:07 +0500 Subject: [PATCH 21/21] Updated on 2026-08-14 --- .../impl/presentation/state/SendUiState.kt | 1 + .../state/amount/AmountStateFactory.kt | 10 +++ .../presentation/state/amount/AmountUtils.kt | 59 +++++++++++++++++ .../amount/SendAmountReducedConverter.kt | 62 ++++++++++++++++++ .../confirm/SendConfirmStateConverter.kt | 1 + .../state/confirm/SendNotificationFactory.kt | 4 +- .../presentation/state/fee/FeeCalculation.kt | 18 +++--- .../fields/SendAmountFieldChangeConverter.kt | 63 ++++--------------- .../state/previewdata/SendClickIntentsStub.kt | 2 +- .../viewmodel/SendClickIntents.kt | 2 +- .../presentation/viewmodel/SendViewModel.kt | 5 +- 11 files changed, 160 insertions(+), 67 deletions(-) create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountUtils.kt create mode 100644 features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountReducedConverter.kt diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt index fd3364e729..c7aa7ddff0 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt @@ -141,6 +141,7 @@ internal sealed class SendStates { val transactionDate: Long, val txUrl: String, val ignoreAmountReduce: Boolean, + val reduceAmountBy: BigDecimal?, val isFromConfirmation: Boolean, val showTapHelp: Boolean, val notifications: ImmutableList, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt index e91f30356f..6ff84cf35d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt @@ -6,6 +6,7 @@ import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.state.fields.SendAmountFieldChangeConverter import com.tangem.features.send.impl.presentation.state.fields.SendAmountFieldMaxAmountConverter import com.tangem.utils.Provider +import java.math.BigDecimal /** * Factory to produce amount state for [SendUiState] @@ -44,9 +45,18 @@ internal class AmountStateFactory( currentStateProvider = currentStateProvider, ) } + private val amountReducedConverter by lazy { + SendAmountReducedConverter( + stateRouterProvider = stateRouterProvider, + currentStateProvider = currentStateProvider, + cryptoCurrencyStatusProvider = cryptoCurrencyStatusProvider, + ) + } fun getOnAmountValueChange(value: String) = amountFieldChangeConverter.convert(value) + fun getOnAmountReducedState(reduceAmountBy: BigDecimal) = amountReducedConverter.convert(reduceAmountBy) + fun getOnMaxAmountClick(): SendUiState { return amountFieldMaxAmountConverter.convert(Unit) } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountUtils.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountUtils.kt new file mode 100644 index 0000000000..3921429828 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountUtils.kt @@ -0,0 +1,59 @@ +package com.tangem.features.send.impl.presentation.state.amount + +import androidx.compose.ui.text.input.ImeAction +import com.tangem.common.extensions.isZero +import com.tangem.core.ui.utils.parseBigDecimal +import com.tangem.core.ui.utils.parseToBigDecimal +import com.tangem.domain.tokens.model.CryptoCurrencyStatus +import com.tangem.features.send.impl.presentation.state.fields.SendTextField +import java.math.BigDecimal +import java.math.RoundingMode + +internal fun String.getCryptoValue(fiatRate: BigDecimal?, isFiatValue: Boolean, decimals: Int): String { + return if (isFiatValue && fiatRate != null) { + parseToBigDecimal(decimals).divide(fiatRate, decimals, RoundingMode.DOWN) + .parseBigDecimal(decimals) + } else { + this + } +} + +internal fun String.getFiatValue( + fiatRate: BigDecimal?, + isFiatValue: Boolean, + decimals: Int, +): Pair { + return if (fiatRate != null) { + val fiatValue = if (!isFiatValue) { + parseToBigDecimal(decimals).multiply(fiatRate).parseBigDecimal(decimals) + } else { + this + } + val decimalFiatValue = fiatValue.parseToBigDecimal(decimals) + fiatValue to decimalFiatValue + } else { + "" to null + } +} + +internal fun String.checkExceedBalance( + cryptoCurrencyStatus: CryptoCurrencyStatus, + amountTextField: SendTextField.AmountField, +): Boolean { + val currencyCryptoAmount = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO + val currencyFiatAmount = cryptoCurrencyStatus.value.fiatAmount ?: BigDecimal.ZERO + val fiatDecimal = parseToBigDecimal(amountTextField.fiatAmount.decimals) + val cryptoDecimal = parseToBigDecimal(amountTextField.cryptoAmount.decimals) + return if (amountTextField.isFiatValue) { + fiatDecimal > currencyFiatAmount + } else { + cryptoDecimal > currencyCryptoAmount + } +} + +internal fun getKeyboardAction(isExceedBalance: Boolean, decimalCryptoValue: BigDecimal) = + if (!isExceedBalance && !decimalCryptoValue.isZero()) { + ImeAction.Done + } else { + ImeAction.None + } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountReducedConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountReducedConverter.kt new file mode 100644 index 0000000000..d624608b14 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountReducedConverter.kt @@ -0,0 +1,62 @@ +package com.tangem.features.send.impl.presentation.state.amount + +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.ui.text.input.KeyboardType +import com.tangem.common.extensions.isZero +import com.tangem.core.ui.utils.parseBigDecimal +import com.tangem.domain.tokens.model.CryptoCurrencyStatus +import com.tangem.features.send.impl.presentation.state.SendUiState +import com.tangem.features.send.impl.presentation.state.StateRouter +import com.tangem.utils.Provider +import com.tangem.utils.converter.Converter +import com.tangem.utils.isNullOrZero +import java.math.BigDecimal + +internal class SendAmountReducedConverter( + private val stateRouterProvider: Provider, + private val currentStateProvider: Provider, + private val cryptoCurrencyStatusProvider: Provider, +) : Converter { + override fun convert(value: BigDecimal): SendUiState { + val state = currentStateProvider() + val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() + val isEditState = stateRouterProvider().isEditState + val amountState = state.getAmountState(isEditState) ?: return state + val amountTextField = amountState.amountTextField + val cryptoDecimals = amountTextField.cryptoAmount.decimals + val fiatDecimals = amountTextField.fiatAmount.decimals + val amountValue = amountState.amountTextField.cryptoAmount.value ?: return state + + val decimalCryptoValue = amountValue.minus(value) + val cryptoValue = decimalCryptoValue.parseBigDecimal(cryptoDecimals) + val (fiatValue, decimalFiatValue) = cryptoValue.getFiatValue( + fiatRate = cryptoCurrencyStatus.value.fiatRate, + isFiatValue = false, + decimals = fiatDecimals, + ) + + val checkValue = if (amountTextField.isFiatValue) fiatValue else cryptoValue + val isExceedBalance = checkValue.checkExceedBalance(cryptoCurrencyStatus, amountTextField) + val isZero = if (amountTextField.isFiatValue) decimalFiatValue.isNullOrZero() else decimalCryptoValue.isZero() + return state.copyWrapped( + isEditState = isEditState, + sendState = state.sendState?.copy( + reduceAmountBy = value, + ), + amountState = amountState.copy( + isPrimaryButtonEnabled = !isExceedBalance && !isZero, + amountTextField = amountTextField.copy( + value = cryptoValue, + fiatValue = fiatValue, + isError = isExceedBalance, + cryptoAmount = amountTextField.cryptoAmount.copy(value = decimalCryptoValue), + fiatAmount = amountTextField.fiatAmount.copy(value = decimalFiatValue), + keyboardOptions = KeyboardOptions( + imeAction = getKeyboardAction(isExceedBalance, decimalCryptoValue), + keyboardType = KeyboardType.Number, + ), + ), + ), + ) + } +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt index 7935da04c8..254a979807 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt @@ -16,6 +16,7 @@ internal class SendConfirmStateConverter( transactionDate = 0L, txUrl = "", ignoreAmountReduce = false, + reduceAmountBy = null, isFromConfirmation = true, showTapHelp = isTapHelpPreviewEnabledProvider(), notifications = persistentListOf(), diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt index 1de2ea58fb..c98336636c 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt @@ -93,6 +93,7 @@ internal class SendNotificationFactory( return state.copy( sendState = sendState.copy( ignoreAmountReduce = isIgnored, + reduceAmountBy = if (isIgnored) null else sendState.reduceAmountBy, notifications = updatedNotifications.toImmutableList(), ), ) @@ -225,8 +226,7 @@ internal class SendNotificationFactory( SendNotification.Warning.HighFeeError( amount = threshold.toPlainString(), onConfirmClick = { - val reduceTo = sendAmount.minus(threshold) - clickIntents.onAmountReduceClick(reduceTo, SendNotification.Warning.HighFeeError::class.java) + clickIntents.onAmountReduceClick(threshold, SendNotification.Warning.HighFeeError::class.java) }, onCloseClick = { clickIntents.onNotificationCancel(SendNotification.Warning.HighFeeError::class.java) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt index c7f5a024df..b06d42a23d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt @@ -1,13 +1,10 @@ package com.tangem.features.send.impl.presentation.state.fee -import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.common.transaction.TransactionFee import com.tangem.common.extensions.isZero import com.tangem.core.ui.utils.parseBigDecimal import com.tangem.core.ui.utils.parseToBigDecimal -import com.tangem.domain.common.extensions.minimalAmount import com.tangem.domain.tokens.model.CryptoCurrencyStatus -import com.tangem.lib.crypto.BlockchainUtils import java.math.BigDecimal import java.math.RoundingMode @@ -19,6 +16,7 @@ internal fun checkAndCalculateSubtractedAmount( cryptoCurrencyStatus: CryptoCurrencyStatus, amountValue: BigDecimal, feeValue: BigDecimal, + reduceAmountBy: BigDecimal?, ): BigDecimal { val balance = cryptoCurrencyStatus.value.amount ?: return amountValue val isFeeCoverage = checkFeeCoverage( @@ -27,12 +25,17 @@ internal fun checkAndCalculateSubtractedAmount( amountValue = amountValue, feeValue = feeValue, ) - return calculateSubtractedAmount( + val subtractedAmount = calculateSubtractedAmount( isFeeCoverage = isFeeCoverage, cryptoCurrencyStatus = cryptoCurrencyStatus, amountValue = amountValue, feeValue = feeValue, ) + return if (reduceAmountBy != null) { + subtractedAmount.minus(reduceAmountBy) + } else { + subtractedAmount + } } /** @@ -59,12 +62,7 @@ internal fun calculateSubtractedAmount( ): BigDecimal { val balance = cryptoCurrencyStatus.value.amount ?: return amountValue return if (isFeeCoverage) { - var subtractedValue = minOf(amountValue, balance.minus(feeValue)) - if (BlockchainUtils.isTezos(cryptoCurrencyStatus.currency.network.id.value)) { - val threshold = Blockchain.Tezos.minimalAmount() - subtractedValue = -threshold - } - subtractedValue + minOf(amountValue, balance.minus(feeValue)) } else { amountValue } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt index 86d87bf3cc..3958e3b64a 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt @@ -1,19 +1,20 @@ package com.tangem.features.send.impl.presentation.state.fields import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import com.tangem.common.extensions.isZero -import com.tangem.core.ui.utils.parseBigDecimal import com.tangem.core.ui.utils.parseToBigDecimal import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.features.send.impl.presentation.state.SendUiState import com.tangem.features.send.impl.presentation.state.StateRouter +import com.tangem.features.send.impl.presentation.state.amount.checkExceedBalance +import com.tangem.features.send.impl.presentation.state.amount.getCryptoValue +import com.tangem.features.send.impl.presentation.state.amount.getFiatValue +import com.tangem.features.send.impl.presentation.state.amount.getKeyboardAction import com.tangem.utils.Provider import com.tangem.utils.converter.Converter import com.tangem.utils.isNullOrZero import java.math.BigDecimal -import java.math.RoundingMode internal class SendAmountFieldChangeConverter( private val stateRouterProvider: Provider, @@ -22,6 +23,7 @@ internal class SendAmountFieldChangeConverter( ) : Converter { override fun convert(value: String): SendUiState { val state = currentStateProvider() + val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() val isEditState = stateRouterProvider().isEditState val amountState = state.getAmountState(isEditState) ?: return state val amountTextField = amountState.amountTextField @@ -31,15 +33,20 @@ internal class SendAmountFieldChangeConverter( val fiatDecimals = amountTextField.fiatAmount.decimals val trimmedValue = value.trim() - val cryptoValue = trimmedValue.getCryptoValue(amountTextField.isFiatValue, cryptoDecimals) + val cryptoValue = trimmedValue.getCryptoValue( + fiatRate = cryptoCurrencyStatus.value.fiatRate, + isFiatValue = amountTextField.isFiatValue, + decimals = cryptoDecimals, + ) val decimalCryptoValue = cryptoValue.parseToBigDecimal(cryptoDecimals) val (fiatValue, decimalFiatValue) = trimmedValue.getFiatValue( + fiatRate = cryptoCurrencyStatus.value.fiatRate, isFiatValue = amountTextField.isFiatValue, decimals = fiatDecimals, ) val checkValue = if (amountTextField.isFiatValue) fiatValue else cryptoValue - val isExceedBalance = checkValue.checkExceedBalance(amountTextField) + val isExceedBalance = checkValue.checkExceedBalance(cryptoCurrencyStatus, amountTextField) val isZero = if (amountTextField.isFiatValue) decimalFiatValue.isNullOrZero() else decimalCryptoValue.isZero() return state.copyWrapped( isEditState = isEditState, @@ -60,32 +67,6 @@ internal class SendAmountFieldChangeConverter( ) } - private fun String.getCryptoValue(isFiatValue: Boolean, decimals: Int): String { - val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() - val fiatRate = cryptoCurrencyStatus.value.fiatRate - return if (isFiatValue && fiatRate != null) { - parseToBigDecimal(decimals).divide(fiatRate, decimals, RoundingMode.DOWN) - .parseBigDecimal(decimals) - } else { - this - } - } - - private fun String.getFiatValue(isFiatValue: Boolean, decimals: Int): Pair { - val fiatRate = cryptoCurrencyStatusProvider().value.fiatRate - return if (fiatRate != null) { - val fiatValue = if (!isFiatValue) { - parseToBigDecimal(decimals).multiply(fiatRate).parseBigDecimal(decimals) - } else { - this - } - val decimalFiatValue = fiatValue.parseToBigDecimal(decimals) - fiatValue to decimalFiatValue - } else { - "" to null - } - } - private fun SendUiState.emptyState(): SendUiState { val isEditState = stateRouterProvider().isEditState val amountState = getAmountState(isEditState) ?: return this @@ -104,24 +85,4 @@ internal class SendAmountFieldChangeConverter( ), ) } - - private fun String.checkExceedBalance(amountTextField: SendTextField.AmountField): Boolean { - val cryptoCurrencyStatus = cryptoCurrencyStatusProvider() - val currencyCryptoAmount = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO - val currencyFiatAmount = cryptoCurrencyStatus.value.fiatAmount ?: BigDecimal.ZERO - val fiatDecimal = parseToBigDecimal(amountTextField.fiatAmount.decimals) - val cryptoDecimal = parseToBigDecimal(amountTextField.cryptoAmount.decimals) - return if (amountTextField.isFiatValue) { - fiatDecimal > currencyFiatAmount - } else { - cryptoDecimal > currencyCryptoAmount - } - } - - private fun getKeyboardAction(isExceedBalance: Boolean, decimalCryptoValue: BigDecimal) = - if (!isExceedBalance && !decimalCryptoValue.isZero()) { - ImeAction.Done - } else { - ImeAction.None - } } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt index 84a2a7b90d..4f05dd6c30 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt @@ -60,7 +60,7 @@ internal object SendClickIntentsStub : SendClickIntents { override fun onShareClick() {} - override fun onAmountReduceClick(reducedAmount: BigDecimal, clazz: Class) {} + override fun onAmountReduceClick(reduceAmountBy: BigDecimal, clazz: Class) {} override fun onNotificationCancel(clazz: Class) {} } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt index 76a22a3b24..61c33cb023 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt @@ -67,7 +67,7 @@ internal interface SendClickIntents { fun onShareClick() - fun onAmountReduceClick(reducedAmount: BigDecimal, clazz: Class) + fun onAmountReduceClick(reduceAmountBy: BigDecimal, clazz: Class) fun onNotificationCancel(clazz: Class) // endregion diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index eca7088154..0273e12490 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -797,8 +797,8 @@ internal class SendViewModel @Inject constructor( analyticsEventHandler.send(SendAnalyticEvents.ShareButtonClicked) } - override fun onAmountReduceClick(reducedAmount: BigDecimal, clazz: Class) { - uiState = amountStateFactory.getOnAmountValueChange(reducedAmount.parseBigDecimal(cryptoCurrency.decimals)) + override fun onAmountReduceClick(reduceAmountBy: BigDecimal, clazz: Class) { + uiState = amountStateFactory.getOnAmountReducedState(reduceAmountBy) uiState = sendNotificationFactory.dismissNotificationState(clazz) feeReload() } @@ -820,6 +820,7 @@ internal class SendViewModel @Inject constructor( cryptoCurrencyStatus = cryptoCurrencyStatus, amountValue = amountValue, feeValue = feeValue, + reduceAmountBy = uiState.sendState?.reduceAmountBy, ) viewModelScope.launch(dispatchers.main) {