From 355e0bf0ef120e83958bed1a22f3b1b25d8530ad Mon Sep 17 00:00:00 2001 From: Tangem Date: Sat, 27 Apr 2024 17:57:29 +0500 Subject: [PATCH 1/2] 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 2/2] 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 } }