From 85c60446024d997179edf1ed0db218592ea99f2c Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 23 Oct 2023 19:11:09 +0300 Subject: [PATCH] Updated on 2026-08-14 --- core/res/src/main/res/values-ru/strings.xml | 2 +- .../feature/swap/domain/SwapInteractor.kt | 8 ++ .../feature/swap/domain/SwapInteractorImpl.kt | 2 +- .../tangem/feature/swap/ui/StateBuilder.kt | 76 ++++++++++++++----- .../feature/swap/viewmodels/SwapViewModel.kt | 12 ++- 5 files changed, 80 insertions(+), 20 deletions(-) diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 60fae4f2a7..fda697fa26 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -412,7 +412,7 @@ Сильные колебания цены! Обмен этой суммы выбранных токенов может вызвать значительные колебания цены и уменьшить получаемую сумму. Недостаточно средств - Недостаточно средств для оплаты на вашем %1$s кошельке для создания транзакции. Сначала пополните свой %2$s кошелек. + Недостаточно средств для оплаты комиссии на вашем %1$s кошельке для создания транзакции. Сначала пополните свой %2$s кошелек. Транзакция в процессе… Подождите Подтвердить diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt index 3cae5f1d7e..ce2b8786a6 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractor.kt @@ -5,6 +5,7 @@ import com.tangem.feature.swap.domain.models.SwapAmount import com.tangem.feature.swap.domain.models.domain.Currency import com.tangem.feature.swap.domain.models.domain.PermissionOptions import com.tangem.feature.swap.domain.models.ui.* +import java.math.BigDecimal interface SwapInteractor { @@ -95,4 +96,11 @@ interface SwapInteractor { fun getTokenBalance(networkId: String, token: Currency): SwapAmount fun isAvailableToSwap(networkId: String): Boolean + + suspend fun checkFeeIsEnough( + fee: BigDecimal?, + spendAmount: SwapAmount, + networkId: String, + fromToken: Currency, + ): Boolean } \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 1eef74bb08..6011528fc9 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -700,7 +700,7 @@ internal class SwapInteractorImpl @Inject constructor( } } - private suspend fun checkFeeIsEnough( + override suspend fun checkFeeIsEnough( fee: BigDecimal?, spendAmount: SwapAmount, networkId: String, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 5034c69a3f..c62cff9622 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -300,7 +300,7 @@ internal class StateBuilder(val actions: UiActions, val isBalanceHiddenProvider: } } - fun updateFeeSelectedItem(uiState: SwapStateHolder, item: Item): SwapStateHolder { + fun updateFeeSelectedItem(uiState: SwapStateHolder, item: Item, isFeeEnough: Boolean): SwapStateHolder { val newSelectedItem = item.copy( startText = TextReference.Res(R.string.send_network_fee_title), ) @@ -314,29 +314,71 @@ internal class StateBuilder(val actions: UiActions, val isBalanceHiddenProvider: } return when (val fee = uiState.fee) { is FeeState.Loaded -> { - val newState = fee.state?.copy( - selectedItem = newSelectedItem, - items = selectNewItem(fee.state.items, item), - ) - uiState.copy( - fee = fee.copy(state = newState), - permissionState = newPermissionState, - ) + getUpdatedFeeStateForEnoughFee(uiState, fee, item, newSelectedItem, newPermissionState, isFeeEnough) } is FeeState.NotEnoughFundsWarning -> { - val newState = fee.state?.copy( - selectedItem = newSelectedItem, - items = selectNewItem(fee.state.items, item), - ) - uiState.copy( - fee = fee.copy(state = newState), - permissionState = newPermissionState, - ) + getUpdatedFeeStateForNotEnoughFee(uiState, fee, item, newSelectedItem, newPermissionState, isFeeEnough) } else -> uiState } } + @Suppress("LongParameterList") + private fun getUpdatedFeeStateForEnoughFee( + uiState: SwapStateHolder, + fee: FeeState.Loaded, + itemToSelect: Item, + newSelectedItem: Item, + newPermissionState: SwapPermissionState, + isFeeEnough: Boolean, + ): SwapStateHolder { + val newState = fee.state?.copy( + selectedItem = newSelectedItem, + items = selectNewItem(fee.state.items, itemToSelect), + ) + val newFeeState = if (isFeeEnough) { + fee.copy(state = newState) + } else { + FeeState.NotEnoughFundsWarning( + tangemFee = fee.tangemFee, + state = newState, + onSelectItem = fee.onSelectItem, + ) + } + return uiState.copy( + fee = newFeeState, + permissionState = newPermissionState, + ) + } + + @Suppress("LongParameterList") + private fun getUpdatedFeeStateForNotEnoughFee( + uiState: SwapStateHolder, + fee: FeeState.NotEnoughFundsWarning, + itemToSelect: Item, + newSelectedItem: Item, + newPermissionState: SwapPermissionState, + isFeeEnough: Boolean, + ): SwapStateHolder { + val newState = fee.state?.copy( + selectedItem = newSelectedItem, + items = selectNewItem(fee.state.items, itemToSelect), + ) + val newFeeState = if (isFeeEnough) { + FeeState.Loaded( + tangemFee = fee.tangemFee, + state = newState, + onSelectItem = fee.onSelectItem, + ) + } else { + fee.copy(state = newState) + } + return uiState.copy( + fee = newFeeState, + permissionState = newPermissionState, + ) + } + private fun createFeeState( quoteModel: SwapState.QuotesLoadedState, uiStateHolder: SwapStateHolder, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index bfa7961c03..ad2e46fb60 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -490,7 +490,17 @@ internal class SwapViewModel @Inject constructor( }, onSelectItemFee = { feeItem -> dataState = dataState.copy(selectedFee = feeItem.data) - uiState = stateBuilder.updateFeeSelectedItem(uiState, feeItem) + val spendAmount = dataState.swapDataModel?.swapModel?.fromTokenAmount ?: return@UiActions + val fromToken = dataState.fromCurrency ?: return@UiActions + viewModelScope.launch(dispatchers.io) { + val isFeeEnough = swapInteractor.checkFeeIsEnough( + fee = feeItem.data.feeValue, + spendAmount = spendAmount, + networkId = dataState.networkId, + fromToken = fromToken, + ) + uiState = stateBuilder.updateFeeSelectedItem(uiState, feeItem, isFeeEnough) + } }, ) }