Updated on 2026-08-14

This commit is contained in:
Tangem 2023-12-25 18:45:36 +03:00
parent a1943321d9
commit 6fe140bb45
2 changed files with 33 additions and 21 deletions

View file

@ -209,7 +209,7 @@ internal class StateBuilder(
fromToken: CryptoCurrency,
swapProvider: SwapProvider,
bestRatedProviderId: String,
isManyProviders: Boolean,
isNeedBestRateBadge: Boolean,
selectedFeeType: FeeType,
isReverseSwapPossible: Boolean,
): SwapStateHolder {
@ -270,7 +270,7 @@ internal class StateBuilder(
isBestRate = bestRatedProviderId == swapProvider.providerId,
fromTokenInfo = quoteModel.fromTokenInfo,
toTokenInfo = quoteModel.toTokenInfo,
isNeedBadge = isManyProviders,
isNeedBestRateBadge = isNeedBestRateBadge,
selectionType = ProviderState.SelectionType.CLICK,
onProviderClick = actions.onProviderClick,
),
@ -327,19 +327,7 @@ internal class StateBuilder(
)
else -> Unit
}
if (!quoteModel.preparedSwapConfigState.isFeeEnough &&
quoteModel.preparedSwapConfigState.isBalanceEnough &&
quoteModel.permissionState !is PermissionDataState.PermissionLoading
) {
warnings.add(
SwapWarning.UnableToCoverFeeWarning(
createUnableToCoverFeeNotificationConfig(
fromToken = fromToken,
onBuyClick = actions.onBuyClick,
),
),
)
}
addUnableCoverFeeWarning(quoteModel, fromToken, warnings)
// check isBalanceEnough, but for dex includeFeeInAmount always Excluded
if (!quoteModel.preparedSwapConfigState.isBalanceEnough &&
quoteModel.preparedSwapConfigState.includeFeeInAmount !is IncludeFeeInAmount.Included
@ -379,6 +367,26 @@ internal class StateBuilder(
return warnings
}
private fun addUnableCoverFeeWarning(
quoteModel: SwapState.QuotesLoadedState,
fromToken: CryptoCurrency,
warnings: MutableList<SwapWarning>,
) {
if (!quoteModel.preparedSwapConfigState.isFeeEnough &&
quoteModel.preparedSwapConfigState.isBalanceEnough &&
quoteModel.permissionState !is PermissionDataState.PermissionLoading
) {
warnings.add(
SwapWarning.UnableToCoverFeeWarning(
createUnableToCoverFeeNotificationConfig(
fromToken = fromToken,
onBuyClick = actions.onBuyClick,
),
),
)
}
}
private fun getSwapButtonEnabled(preparedSwapConfigState: PreparedSwapConfigState): Boolean {
if (preparedSwapConfigState.hasOutgoingTransaction) return false
return when (preparedSwapConfigState.includeFeeInAmount) {
@ -1123,7 +1131,7 @@ internal class StateBuilder(
fromTokenInfo: TokenSwapInfo,
toTokenInfo: TokenSwapInfo,
selectionType: ProviderState.SelectionType,
isNeedBadge: Boolean,
isNeedBestRateBadge: Boolean,
onProviderClick: (String) -> Unit,
): ProviderState {
val rate = toTokenInfo.tokenAmount.value.calculateRate(
@ -1133,7 +1141,7 @@ internal class StateBuilder(
val fromCurrencySymbol = fromTokenInfo.cryptoCurrencyStatus.currency.symbol
val toCurrencySymbol = toTokenInfo.cryptoCurrencyStatus.currency.symbol
val rateString = "1 $fromCurrencySymbol$rate $toCurrencySymbol"
val badge = if (isNeedBadge && isBestRate) {
val badge = if (isNeedBestRateBadge && isBestRate) {
ProviderState.AdditionalBadge.BestTrade
} else {
ProviderState.AdditionalBadge.Empty

View file

@ -326,7 +326,7 @@ internal class SwapViewModel @Inject constructor(
fromToken = fromToken.currency,
swapProvider = provider,
bestRatedProviderId = bestRatedProviderId,
isManyProviders = dataState.lastLoadedSwapStates.size > 1,
isNeedBestRateBadge = dataState.lastLoadedSwapStates.consideredProvidersStates().size > 1,
selectedFeeType = dataState.selectedFee?.feeType ?: FeeType.NORMAL,
isReverseSwapPossible = isReverseSwapPossible(),
)
@ -390,9 +390,7 @@ internal class SwapViewModel @Inject constructor(
}
private fun selectProvider(state: Map<SwapProvider, SwapState>): SwapProvider {
val consideredProviders = state.filter {
it.value is SwapState.QuotesLoadedState || isExchangeTooSmallAmountError(it.value)
}
val consideredProviders = state.consideredProvidersStates()
return if (consideredProviders.isNotEmpty()) {
val currentSelected = dataState.selectedProvider
@ -948,6 +946,12 @@ internal class SwapViewModel @Inject constructor(
.mapValues { it.value as SwapState.QuotesLoadedState }
}
private fun Map<SwapProvider, SwapState>.consideredProvidersStates(): Map<SwapProvider, SwapState> {
return this.filter {
it.value is SwapState.QuotesLoadedState || isExchangeTooSmallAmountError(it.value)
}
}
private fun isReverseSwapPossible(): Boolean {
val from = dataState.fromCryptoCurrency ?: return false
val to = dataState.toCryptoCurrency ?: return false