Updated on 2026-08-14
This commit is contained in:
parent
0f5d1ee8e8
commit
85c6044602
5 changed files with 80 additions and 20 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -700,7 +700,7 @@ internal class SwapInteractorImpl @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private suspend fun checkFeeIsEnough(
|
||||
override suspend fun checkFeeIsEnough(
|
||||
fee: BigDecimal?,
|
||||
spendAmount: SwapAmount,
|
||||
networkId: String,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue