Updated on 2026-08-14

This commit is contained in:
Tangem 2023-12-04 14:31:56 +03:00
parent 23a5174a92
commit bfd9e26eba
5 changed files with 32 additions and 9 deletions

View file

@ -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?,

View file

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

View file

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

View file

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

View file

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