Updated on 2026-08-14

This commit is contained in:
Tangem 2023-10-23 19:11:09 +03:00
parent 0f5d1ee8e8
commit 85c6044602
5 changed files with 80 additions and 20 deletions

View file

@ -412,7 +412,7 @@
<string name="swapping_high_price_impact">Сильные колебания цены!</string>
<string name="swapping_high_price_impact_description">Обмен этой суммы выбранных токенов может вызвать значительные колебания цены и уменьшить получаемую сумму.</string>
<string name="swapping_insufficient_funds">Недостаточно средств</string>
<string name="swapping_not_enough_funds_for_fee">Недостаточно средств для оплаты на вашем %1$s кошельке для создания транзакции. Сначала пополните свой %2$s кошелек.</string>
<string name="swapping_not_enough_funds_for_fee">Недостаточно средств для оплаты комиссии на вашем %1$s кошельке для создания транзакции. Сначала пополните свой %2$s кошелек.</string>
<string name="swapping_pending_transaction_subtitle">Транзакция в процессе…</string>
<string name="swapping_pending_transaction_title">Подождите</string>
<string name="swapping_permission_buttons_approve">Подтвердить</string>

View file

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

View file

@ -700,7 +700,7 @@ internal class SwapInteractorImpl @Inject constructor(
}
}
private suspend fun checkFeeIsEnough(
override suspend fun checkFeeIsEnough(
fee: BigDecimal?,
spendAmount: SwapAmount,
networkId: String,

View file

@ -300,7 +300,7 @@ internal class StateBuilder(val actions: UiActions, val isBalanceHiddenProvider:
}
}
fun updateFeeSelectedItem(uiState: SwapStateHolder, item: Item<TxFee>): SwapStateHolder {
fun updateFeeSelectedItem(uiState: SwapStateHolder, item: Item<TxFee>, 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<TxFee>,
newSelectedItem: Item<TxFee>,
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<TxFee>,
newSelectedItem: Item<TxFee>,
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,

View file

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