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)
+ }
},
)
}