Updated on 2026-08-14

This commit is contained in:
Tangem 2024-07-04 22:40:09 +08:00
parent a2425acf09
commit 7c3d6bf9af
8 changed files with 46 additions and 14 deletions

View file

@ -23,6 +23,9 @@ data class ExchangeProvider(
@Json(name = "privacyPolicy")
val privacyPolicy: String?,
@Json(name = "recommended")
val isRecommended: Boolean = false,
)
enum class ExchangeProviderType {

View file

@ -239,6 +239,7 @@
<string name="express_provider_min_amount">Доступно с %s</string>
<string name="express_provider_not_available">Недоступно для этой пары</string>
<string name="express_provider_permission_needed">Требуется разрешение</string>
<string name="express_provider_recommended">Рекомендовано</string>
<string name="express_terms_of_use">Условиями использования</string>
<string name="express_token_list_empty_search">Токены не найдены. Пожалуйста, попробуйте другой запрос</string>
<string name="express_transaction_id">ID: %s</string>

View file

@ -238,6 +238,7 @@
<string name="express_provider_min_amount">Available from %s</string>
<string name="express_provider_not_available">Unavailable for this pair</string>
<string name="express_provider_permission_needed">Permission Required</string>
<string name="express_provider_recommended">Recommended</string>
<string name="express_terms_of_use">Terms of Use</string>
<string name="express_token_list_empty_search">No tokens found. Please try another request</string>
<string name="express_transaction_id">ID: %s</string>

View file

@ -45,6 +45,7 @@ class SwapPairInfoConverter : Converter<SwapPairsWithProviders, PairsWithProvide
imageLarge = exchangeProvider.imageLargeUrl,
termsOfUse = exchangeProvider.termsOfUse,
privacyPolicy = exchangeProvider.privacyPolicy,
isRecommended = exchangeProvider.isRecommended,
)
}
@ -61,6 +62,7 @@ class SwapPairInfoConverter : Converter<SwapPairsWithProviders, PairsWithProvide
imageLarge = additionalProvider.imageLargeUrl,
termsOfUse = additionalProvider.termsOfUse,
privacyPolicy = additionalProvider.privacyPolicy,
isRecommended = additionalProvider.isRecommended,
)
}

View file

@ -25,6 +25,7 @@ data class CryptoCurrencySwapInfo(
*
* @property providerId provider id
* @property rateTypes supported rate types
* @property isRecommended flag that indicates if this provider is recommended
*/
data class SwapProvider(
val providerId: String,
@ -34,6 +35,7 @@ data class SwapProvider(
val imageLarge: String,
val termsOfUse: String?,
val privacyPolicy: String?,
val isRecommended: Boolean,
)
enum class ExchangeProviderType(val providerName: String) {

View file

@ -44,9 +44,10 @@ sealed class ProviderState {
@Immutable
sealed class AdditionalBadge {
object BestTrade : AdditionalBadge()
object Empty : AdditionalBadge()
object PermissionRequired : AdditionalBadge()
data object BestTrade : AdditionalBadge()
data object Empty : AdditionalBadge()
data object PermissionRequired : AdditionalBadge()
data object Recommended : AdditionalBadge()
}
@Immutable

View file

@ -87,6 +87,7 @@ fun ProviderItem(state: ProviderState, modifier: Modifier = Modifier, isSelected
}
}
// Be careful when will replace with InputRowBestRate, because RecommendedBadge was added
@Deprecated("Replace with InputRowBestRate")
@Suppress("LongMethod")
@Composable
@ -142,16 +143,12 @@ private fun ProviderContentState(
modifier = Modifier.padding(start = TangemTheme.dimens.spacing4),
)
}
val badgeModifier = Modifier.padding(start = TangemTheme.dimens.spacing4)
when (state.additionalBadge) {
ProviderState.AdditionalBadge.BestTrade -> BestTradeItem(
Modifier.padding(start = TangemTheme.dimens.spacing4),
)
ProviderState.AdditionalBadge.PermissionRequired -> PermissionBadgeItem(
Modifier.padding(start = TangemTheme.dimens.spacing4),
)
ProviderState.AdditionalBadge.Empty -> {
// no-op
}
ProviderState.AdditionalBadge.BestTrade -> BestTradeItem(badgeModifier)
ProviderState.AdditionalBadge.PermissionRequired -> PermissionBadgeItem(badgeModifier)
ProviderState.AdditionalBadge.Recommended -> RecommendedItem(badgeModifier)
ProviderState.AdditionalBadge.Empty -> Unit
}
}
Row(
@ -385,6 +382,23 @@ private fun PermissionBadgeItem(modifier: Modifier = Modifier) {
}
}
@Composable
private fun RecommendedItem(modifier: Modifier = Modifier) {
Box(
modifier = modifier.background(
color = TangemTheme.colors.icon.accent.copy(alpha = 0.1f),
shape = TangemTheme.shapes.roundedCornersLarge,
),
) {
Text(
text = stringResource(id = R.string.express_provider_recommended),
style = TangemTheme.typography.caption1,
color = TangemTheme.colors.icon.accent,
modifier = Modifier.padding(horizontal = TangemTheme.dimens.spacing6),
)
}
}
// region Preview
@Preview(showBackground = true, widthDp = 360)
@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES)

View file

@ -1541,7 +1541,9 @@ internal class StateBuilder(
val fromCurrencySymbol = fromTokenInfo.cryptoCurrencyStatus.currency.symbol
val toCurrencySymbol = toTokenInfo.cryptoCurrencyStatus.currency.symbol
val rateString = "1 $fromCurrencySymbol$rate $toCurrencySymbol"
val badge = if (isNeedBestRateBadge && isBestRate) {
val badge = if (isRecommended) {
ProviderState.AdditionalBadge.Recommended
} else if (isNeedBestRateBadge && isBestRate) {
ProviderState.AdditionalBadge.BestTrade
} else {
ProviderState.AdditionalBadge.Empty
@ -1555,7 +1557,11 @@ internal class StateBuilder(
additionalBadge = badge,
selectionType = selectionType,
percentLowerThenBest = PercentDifference.Empty,
namePrefix = ProviderState.PrefixType.PROVIDED_BY,
namePrefix = if (badge !is ProviderState.AdditionalBadge.Recommended) {
ProviderState.PrefixType.PROVIDED_BY
} else {
ProviderState.PrefixType.NONE
},
onProviderClick = onProviderClick,
)
}
@ -1570,6 +1576,8 @@ internal class StateBuilder(
val rateString = toTokenInfo.tokenAmount.getFormattedCryptoAmount(toTokenInfo.cryptoCurrencyStatus.currency)
val additionalBadge = if (state.permissionState is PermissionDataState.PermissionReadyForRequest) {
ProviderState.AdditionalBadge.PermissionRequired
} else if (isRecommended) {
ProviderState.AdditionalBadge.Recommended
} else {
ProviderState.AdditionalBadge.Empty
}