From bfd9e26eba55a2d4832aad322f43cef3da8eb7ba Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 4 Dec 2023 14:31:56 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../swap/models/states/ProviderState.kt | 2 +- .../swap/ui/ChooseProviderBottomSheet.kt | 2 +- .../tangem/feature/swap/ui/ProviderItem.kt | 4 +-- .../tangem/feature/swap/ui/StateBuilder.kt | 32 ++++++++++++++++--- .../feature/swap/viewmodels/SwapViewModel.kt | 1 + 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt index 2d1d66ef31..63088433c5 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/states/ProviderState.kt @@ -22,7 +22,7 @@ sealed class ProviderState { val name: String, val type: String, val iconUrl: String, - val rate: String, + val subtitle: TextReference, val selectionType: SelectionType, val additionalBadge: AdditionalBadge, val percentLowerThenBest: Float?, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt index 30954893a7..cf5fa35a88 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ChooseProviderBottomSheet.kt @@ -87,7 +87,7 @@ private fun ChooseProviderBottomSheet_Preview() { name = "1inch", type = "DEX", iconUrl = "", - rate = "1 000 000", + subtitle = stringReference("1 000 000"), additionalBadge = ProviderState.AdditionalBadge.BestTrade, percentLowerThenBest = -1.0f, selectionType = ProviderState.SelectionType.SELECT, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt index 550fbfcad6..79bfe25d5e 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/ProviderItem.kt @@ -138,7 +138,7 @@ private fun ProviderContentState( ), ) { Text( - text = state.rate, + text = state.subtitle.resolveReference(), style = TangemTheme.typography.body2, color = TangemTheme.colors.text.tertiary, overflow = TextOverflow.Ellipsis, @@ -387,7 +387,7 @@ private fun ProviderItem_Content_Preview() { name = "1inch", type = "DEX", iconUrl = "", - rate = "1 000 000", + subtitle = stringReference("1 000 000"), additionalBadge = ProviderState.AdditionalBadge.PermissionRequired, percentLowerThenBest = -1.0f, selectionType = ProviderState.SelectionType.SELECT, 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 6a5f0a46f8..49bc2f821b 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 @@ -206,6 +206,7 @@ internal class StateBuilder( fromToken: CryptoCurrency, swapProvider: SwapProvider, bestRatedProviderId: String, + isManyProviders: Boolean, selectedFeeType: FeeType, ): SwapStateHolder { if (uiStateHolder.sendCardData !is SwapCardState.SwapCardData) return uiStateHolder @@ -299,6 +300,7 @@ internal class StateBuilder( isBestRate = bestRatedProviderId == swapProvider.providerId, fromTokenInfo = quoteModel.fromTokenInfo, toTokenInfo = quoteModel.toTokenInfo, + isNeedBadge = isManyProviders, selectionType = ProviderState.SelectionType.CLICK, onProviderClick = actions.onProviderClick, ), @@ -374,7 +376,7 @@ internal class StateBuilder( ): ProviderState { return when (dataError) { is DataError.ExchangeTooSmallAmountError -> { - swapProvider.convertToUnavailableProviderState( + swapProvider.convertToAvailableFromProviderState( alertText = resourceReference( R.string.express_provider_min_amount, wrappedList(dataError.amount.getFormattedCryptoAmount(fromToken)), @@ -606,7 +608,7 @@ internal class StateBuilder( showStatusButton = providerState.type == ExchangeProviderType.CEX.name, providerIcon = providerState.iconUrl, fee = TextReference.Str("${fee.amountCrypto} ${fee.symbolCrypto} (${fee.amountFiatFormatted})"), - rate = TextReference.Str(providerState.rate), + rate = providerState.subtitle, fromTokenAmount = TextReference.Str(txState.fromAmount.orEmpty()), toTokenAmount = TextReference.Str(txState.toAmount.orEmpty()), fromTokenFiatAmount = TextReference.Str(fromFiatAmount), @@ -911,11 +913,13 @@ internal class StateBuilder( return "$firstAddressPart...$secondAddressPart" } + @Suppress("LongParameterList") private fun SwapProvider.convertToContentClickableProviderState( isBestRate: Boolean, fromTokenInfo: TokenSwapInfo, toTokenInfo: TokenSwapInfo, selectionType: ProviderState.SelectionType, + isNeedBadge: Boolean, onProviderClick: (String) -> Unit, ): ProviderState { val rate = toTokenInfo.tokenAmount.value.calculateRate( @@ -925,7 +929,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 (isBestRate) { + val badge = if (isNeedBadge && isBestRate) { ProviderState.AdditionalBadge.BestTrade } else { ProviderState.AdditionalBadge.Empty @@ -935,7 +939,7 @@ internal class StateBuilder( name = this.name, iconUrl = this.imageLarge, type = this.type.toString(), - rate = rateString, + subtitle = stringReference(rateString), additionalBadge = badge, selectionType = selectionType, percentLowerThenBest = null, @@ -964,7 +968,7 @@ internal class StateBuilder( name = this.name, iconUrl = this.imageLarge, type = this.type.toString(), - rate = rateString, + subtitle = stringReference(rateString), additionalBadge = additionalBadge, selectionType = selectionType, percentLowerThenBest = pricesLowerBest[this], @@ -988,6 +992,24 @@ internal class StateBuilder( ) } + private fun SwapProvider.convertToAvailableFromProviderState( + alertText: TextReference, + selectionType: ProviderState.SelectionType, + onProviderClick: (String) -> Unit, + ): ProviderState { + return ProviderState.Content( + id = this.providerId, + name = this.name, + iconUrl = this.imageLarge, + type = this.type.toString(), + selectionType = selectionType, + subtitle = alertText, + additionalBadge = ProviderState.AdditionalBadge.Empty, + percentLowerThenBest = null, + onProviderClick = onProviderClick, + ) + } + private fun CryptoCurrencyStatus.getFormattedAmount(): String { val amount = value.amount ?: return UNKNOWN_AMOUNT_SIGN 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 60c4a28c7a..dae161d290 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 @@ -294,6 +294,7 @@ internal class SwapViewModel @Inject constructor( fromToken = fromToken.currency, swapProvider = provider, bestRatedProviderId = bestRatedProviderId, + isManyProviders = dataState.lastLoadedSwapStates.isNotEmpty(), selectedFeeType = dataState.selectedFee?.feeType ?: FeeType.NORMAL, ) }