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 326f09752c..dc89739051 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 @@ -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, + ) { + 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 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 23f24834f8..8dc1e1a382 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 @@ -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 { - 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.consideredProvidersStates(): Map { + 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