Updated on 2026-08-14

This commit is contained in:
Tangem 2025-08-12 14:33:25 +05:00
parent cf79fa950b
commit b6608d8378
4 changed files with 63 additions and 36 deletions

View file

@ -22,11 +22,11 @@ import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.express.models.ExpressError
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.currency.CryptoCurrencyStatus
import com.tangem.domain.notifications.ShouldShowNotificationUseCase
import com.tangem.domain.settings.usercountry.GetUserCountryUseCase
import com.tangem.domain.settings.usercountry.models.UserCountry
import com.tangem.domain.swap.models.SwapCurrencies
import com.tangem.domain.notifications.ShouldShowNotificationUseCase
import com.tangem.domain.settings.usercountry.models.needApplyFCARestrictions
import com.tangem.domain.swap.models.SwapCurrencies
import com.tangem.domain.swap.models.SwapDirection
import com.tangem.domain.swap.models.SwapDirection.Companion.withSwapDirection
import com.tangem.domain.swap.models.SwapQuoteModel
@ -56,8 +56,8 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.Debouncer
import com.tangem.utils.coroutines.PeriodicTask
import com.tangem.utils.coroutines.SingleTaskScheduler
import com.tangem.utils.extensions.isZero
import com.tangem.utils.extensions.orZero
import com.tangem.utils.isNullOrZero
import com.tangem.utils.transformer.update
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
@ -199,8 +199,6 @@ internal class SwapAmountModel @Inject constructor(
)
amountDebouncer.debounce(
coroutineScope = modelScope,
waitMs = DEBOUNCE_AMOUNT_DELAY,
forceUpdate = true,
destinationFunction = {
startLoadingQuotesTask(isSilentReload = false)
},
@ -532,11 +530,12 @@ internal class SwapAmountModel @Inject constructor(
SwapDirection.Reverse -> state.secondaryAmount.amountField
} as? AmountState.Data
if (fromAmount?.amountTextField?.isError == true) return
val fromAmountValue = fromAmount?.amountTextField?.cryptoAmount?.value.orZero()
val fromAmountValue = fromAmount?.amountTextField?.cryptoAmount?.value ?: return
if (fromAmountValue.isZero()) return
if (fromAmount?.amountTextField?.isError == true || fromAmountValue.isNullOrZero()) {
uiState.transformerUpdate(SwapQuoteEmptyStateTransformer)
return
}
val swapGroups = state.swapCurrencies.getGroupWithDirection(state.swapDirection)

View file

@ -56,15 +56,20 @@ internal object SwapAmountQuoteUtils {
): SwapAmountUM {
if (this !is SwapAmountUM.Content) return this
return if (
val updatedAmountField = if (
selectedAmountType == SwapAmountType.From && swapDirection == SwapDirection.Direct
) {
val amountFieldUM = primaryAmount as? SwapAmountFieldUM.Content ?: return this
copy(primaryAmount = amountFieldUM.onPrimaryAmount(primaryCryptoCurrencyStatus))
amountFieldUM.onPrimaryAmount(primaryCryptoCurrencyStatus)
} else {
if (secondaryCryptoCurrencyStatus == null) return this
val amountFieldUM = secondaryAmount as? SwapAmountFieldUM.Content ?: return this
copy(secondaryAmount = amountFieldUM.onSecondaryAmount(secondaryCryptoCurrencyStatus))
amountFieldUM.onSecondaryAmount(secondaryCryptoCurrencyStatus)
}
return copy(
isPrimaryButtonEnabled = updatedAmountField.amountField.isPrimaryButtonEnabled,
primaryAmount = updatedAmountField,
)
}
}

View file

@ -17,33 +17,39 @@ internal class SwapAmountValueChangeTransformer(
override fun transform(prevState: SwapAmountUM): SwapAmountUM {
if (prevState !is SwapAmountUM.Content) return prevState
return prevState
.copy(selectedQuote = SwapQuoteUM.Loading)
.updateAmount(
onPrimaryAmount = { primaryStatus ->
val updatedState = prevState.updateAmount(
onPrimaryAmount = { primaryStatus ->
copy(
amountField = AmountFieldChangeTransformer(
cryptoCurrencyStatus = primaryStatus,
maxEnterAmount = primaryMaximumAmountBoundary,
minimumTransactionAmount = primaryMinimumAmountBoundary,
value = value,
).transform(prevState.primaryAmount.amountField),
)
},
onSecondaryAmount = { secondaryStatus ->
if (secondaryMaximumAmountBoundary != null) {
copy(
amountField = AmountFieldChangeTransformer(
cryptoCurrencyStatus = primaryStatus,
maxEnterAmount = primaryMaximumAmountBoundary,
minimumTransactionAmount = primaryMinimumAmountBoundary,
cryptoCurrencyStatus = secondaryStatus,
maxEnterAmount = secondaryMaximumAmountBoundary,
minimumTransactionAmount = secondaryMinimumAmountBoundary,
value = value,
).transform(prevState.primaryAmount.amountField),
).transform(prevState.secondaryAmount.amountField),
)
},
onSecondaryAmount = { secondaryStatus ->
if (secondaryMaximumAmountBoundary != null) {
copy(
amountField = AmountFieldChangeTransformer(
cryptoCurrencyStatus = secondaryStatus,
maxEnterAmount = secondaryMaximumAmountBoundary,
minimumTransactionAmount = secondaryMinimumAmountBoundary,
value = value,
).transform(prevState.secondaryAmount.amountField),
)
} else {
this
}
},
)
} else {
this
}
},
)
return (updatedState as? SwapAmountUM.Content)?.copy(
selectedQuote = if (updatedState.isPrimaryButtonEnabled) {
SwapQuoteUM.Empty
} else {
SwapQuoteUM.Loading
},
) ?: updatedState
}
}

View file

@ -0,0 +1,17 @@
package com.tangem.features.swap.v2.impl.amount.model.transformers
import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountUM
import com.tangem.features.swap.v2.impl.common.entity.SwapQuoteUM
import com.tangem.utils.transformer.Transformer
internal object SwapQuoteEmptyStateTransformer : Transformer<SwapAmountUM> {
override fun transform(prevState: SwapAmountUM): SwapAmountUM {
if (prevState !is SwapAmountUM.Content) return prevState
return prevState.copy(
selectedQuote = SwapQuoteUM.Empty,
isPrimaryButtonEnabled = false,
)
}
}