From b6608d83784e46dbdd6c7d667a95276f832aed9d Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 12 Aug 2025 14:33:25 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../v2/impl/amount/model/SwapAmountModel.kt | 17 +++--- .../impl/amount/model/SwapAmountQuoteUtils.kt | 11 ++-- .../SwapAmountValueChangeTransformer.kt | 54 ++++++++++--------- .../SwapQuoteEmptyStateTransformer.kt | 17 ++++++ 4 files changed, 63 insertions(+), 36 deletions(-) create mode 100644 features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapQuoteEmptyStateTransformer.kt diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index fb4748b307..4512f765ac 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -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) diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountQuoteUtils.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountQuoteUtils.kt index 06fb3dc71b..d696518b75 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountQuoteUtils.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountQuoteUtils.kt @@ -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, + ) } } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt index 5a7e9eccb3..c364fd36a0 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapAmountValueChangeTransformer.kt @@ -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 } } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapQuoteEmptyStateTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapQuoteEmptyStateTransformer.kt new file mode 100644 index 0000000000..32cd5ea158 --- /dev/null +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/transformers/SwapQuoteEmptyStateTransformer.kt @@ -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 { + + override fun transform(prevState: SwapAmountUM): SwapAmountUM { + if (prevState !is SwapAmountUM.Content) return prevState + + return prevState.copy( + selectedQuote = SwapQuoteUM.Empty, + isPrimaryButtonEnabled = false, + ) + } +} \ No newline at end of file