Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-27 19:40:45 +05:00
commit f50a76da2d
5 changed files with 50 additions and 5 deletions

View file

@ -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
}
}

View file

@ -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<StateRouter>,
@ -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(

View file

@ -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<SendEvent>,
) {

View file

@ -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(

View file

@ -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
}
}