Updated on 2026-08-14

This commit is contained in:
Tangem 2026-03-12 18:22:34 +05:00
parent bc8bb4da19
commit a65b28883f
7 changed files with 105 additions and 23 deletions

View file

@ -289,6 +289,7 @@ enum class TangemBadgeColor {
Red,
Gray,
Green,
GreenAlt,
}
@ReadOnlyComposable
@ -313,6 +314,12 @@ private fun getIconColor(type: TangemBadgeType, color: TangemBadgeColor) = when
-> TangemTheme.colors2.markers.iconGreen
TangemBadgeType.Solid -> TangemTheme.colors2.graphic.neutral.primaryInvertedConstant
}
TangemBadgeColor.GreenAlt -> when (type) {
TangemBadgeType.Outline,
TangemBadgeType.Tinted,
-> TangemTheme.colors2.markers.iconGreenAlt
TangemBadgeType.Solid -> TangemTheme.colors2.graphic.neutral.primaryInvertedConstant
}
}
@ReadOnlyComposable
@ -337,6 +344,12 @@ private fun getTextColor(type: TangemBadgeType, color: TangemBadgeColor) = when
-> TangemTheme.colors2.markers.textGreen
TangemBadgeType.Solid -> TangemTheme.colors2.text.neutral.primaryInvertedConstant
}
TangemBadgeColor.GreenAlt -> when (type) {
TangemBadgeType.Outline,
TangemBadgeType.Tinted,
-> TangemTheme.colors2.markers.textGreenAlt
TangemBadgeType.Solid -> TangemTheme.colors2.text.neutral.primaryInvertedConstant
}
}
@Suppress("CyclomaticComplexMethod")
@ -349,6 +362,7 @@ private fun Modifier.getBackgroundColor(type: TangemBadgeType, color: TangemBadg
TangemBadgeColor.Blue -> TangemTheme.colors2.markers.backgroundSolidBlue
TangemBadgeColor.Red -> TangemTheme.colors2.markers.backgroundSolidRed
TangemBadgeColor.Green -> TangemTheme.colors2.markers.backgroundSolidGreen
TangemBadgeColor.GreenAlt -> TangemTheme.colors2.markers.backgroundSolidGreenAlt
},
)
TangemBadgeType.Tinted -> background(
@ -357,6 +371,7 @@ private fun Modifier.getBackgroundColor(type: TangemBadgeType, color: TangemBadg
TangemBadgeColor.Blue -> TangemTheme.colors2.markers.backgroundTintedBlue
TangemBadgeColor.Red -> TangemTheme.colors2.markers.backgroundTintedRed
TangemBadgeColor.Green -> TangemTheme.colors2.markers.backgroundTintedGreen
TangemBadgeColor.GreenAlt -> TangemTheme.colors2.markers.backgroundTintedGreenAlt
},
)
TangemBadgeType.Outline -> {
@ -366,6 +381,7 @@ private fun Modifier.getBackgroundColor(type: TangemBadgeType, color: TangemBadg
TangemBadgeColor.Blue -> TangemTheme.colors2.markers.borderTintedBlue
TangemBadgeColor.Red -> TangemTheme.colors2.markers.borderTintedRed
TangemBadgeColor.Green -> TangemTheme.colors2.markers.borderTintedGreen
TangemBadgeColor.GreenAlt -> TangemTheme.colors2.markers.borderTintedGreenAlt
},
shape = shape,
width = 1.dp,
@ -410,6 +426,7 @@ private class TangemBadgePreviewProvider : PreviewParameterProvider<TangemBadgeC
TangemBadgeColor.Blue,
TangemBadgeColor.Red,
TangemBadgeColor.Green,
TangemBadgeColor.GreenAlt,
)
}
// endregion

View file

@ -1,5 +1,6 @@
package com.tangem.core.ui.ds.row.token
import androidx.annotation.DrawableRes
import androidx.compose.runtime.Immutable
import com.tangem.core.ui.components.currency.icon.CurrencyIconState
import com.tangem.core.ui.components.marketprice.PriceChangeState
@ -148,10 +149,17 @@ sealed class TangemTokenRowUM : TangemRowUM {
sealed class PromoBannerUM {
data class Content(
val title: TextReference,
@param:DrawableRes val iconRes: Int,
val type: Type,
val onPromoBannerClick: () -> Unit,
val onCloseClick: () -> Unit,
val onPromoShown: () -> Unit = {},
) : PromoBannerUM()
) : PromoBannerUM() {
enum class Type {
Yield,
Staking,
}
}
data object Empty : PromoBannerUM()
}

View file

@ -30,6 +30,8 @@ internal object TangemTokenRowPreviewData {
val promoBannerUM: TangemTokenRowUM.PromoBannerUM.Content
get() = TangemTokenRowUM.PromoBannerUM.Content(
title = stringReference("Earn yield by supplying your crypto assets"),
iconRes = R.drawable.ic_yield_mode_mini_12,
type = TangemTokenRowUM.PromoBannerUM.Content.Type.Yield,
onPromoBannerClick = {},
onPromoShown = {},
onCloseClick = {},

View file

@ -15,6 +15,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.tangem.core.ui.R
import com.tangem.core.ui.ds.badge.*
import com.tangem.core.ui.ds.image.TangemIconUM
@ -39,7 +41,18 @@ internal fun TokenRowPromoBanner(promoBannerUM: TangemTokenRowUM.PromoBannerUM.C
LaunchedEffect(promoBannerUM) {
promoBannerUM.onPromoShown()
}
val bgColor = TangemTheme.colors2.markers.backgroundTintedGreen
val bgColor = when (promoBannerUM.type) {
TangemTokenRowUM.PromoBannerUM.Content.Type.Yield -> TangemTheme.colors2.markers.backgroundTintedGreenAlt
TangemTokenRowUM.PromoBannerUM.Content.Type.Staking -> TangemTheme.colors2.markers.backgroundTintedBlue
}
val contentColor = when (promoBannerUM.type) {
TangemTokenRowUM.PromoBannerUM.Content.Type.Yield -> TangemTheme.colors2.markers.textGreenAlt
TangemTokenRowUM.PromoBannerUM.Content.Type.Staking -> TangemTheme.colors2.markers.textBlue
}
val badgeColor = when (promoBannerUM.type) {
TangemTokenRowUM.PromoBannerUM.Content.Type.Yield -> TangemBadgeColor.GreenAlt
TangemTokenRowUM.PromoBannerUM.Content.Type.Staking -> TangemBadgeColor.Blue
}
Column(
modifier = modifier,
) {
@ -63,9 +76,9 @@ internal fun TokenRowPromoBanner(promoBannerUM: TangemTokenRowUM.PromoBannerUM.C
horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens2.x1),
) {
Icon(
imageVector = ImageVector.vectorResource(id = R.drawable.ic_analytics_up_24),
imageVector = ImageVector.vectorResource(id = promoBannerUM.iconRes),
contentDescription = null,
tint = TangemTheme.colors2.markers.textGreen,
tint = contentColor,
modifier = Modifier
.padding(vertical = TangemTheme.dimens2.x0_5)
.size(TangemTheme.dimens2.x3),
@ -73,14 +86,14 @@ internal fun TokenRowPromoBanner(promoBannerUM: TangemTokenRowUM.PromoBannerUM.C
Text(
text = promoBannerUM.title.resolveReference(),
style = TangemTheme.typography2.captionSemibold11,
color = TangemTheme.colors2.markers.textGreen,
color = contentColor,
modifier = Modifier
.padding(vertical = TangemTheme.dimens2.x0_5),
)
TangemBadge(
size = TangemBadgeSize.X4,
shape = TangemBadgeShape.Rounded,
color = TangemBadgeColor.Green,
color = badgeColor,
type = TangemBadgeType.Tinted,
tangemIconUM = TangemIconUM.Icon(R.drawable.ic_close_24),
iconPosition = TangemBadgeIconPosition.None,
@ -90,14 +103,30 @@ internal fun TokenRowPromoBanner(promoBannerUM: TangemTokenRowUM.PromoBannerUM.C
}
}
// region Preview
@Preview(widthDp = 360, showBackground = true)
@Preview(widthDp = 360, showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
private fun Preview_TokenRowPromoBanner() {
private fun Preview_TokenRowPromoBanner(
@PreviewParameter(TangemTokenRowPromoBannerPreviewProvider::class)
promoType: TangemTokenRowUM.PromoBannerUM.Content.Type,
) {
TangemThemePreviewRedesign {
TokenRowPromoBanner(
promoBannerUM = TangemTokenRowPreviewData.promoBannerUM,
modifier = Modifier.fillMaxWidth(),
promoBannerUM = TangemTokenRowPreviewData.promoBannerUM.copy(type = promoType),
modifier = Modifier
.fillMaxWidth()
.background(TangemTheme.colors2.surface.level1),
)
}
}
}
internal class TangemTokenRowPromoBannerPreviewProvider :
PreviewParameterProvider<TangemTokenRowUM.PromoBannerUM.Content.Type> {
override val values: Sequence<TangemTokenRowUM.PromoBannerUM.Content.Type>
get() = sequenceOf(
TangemTokenRowUM.PromoBannerUM.Content.Type.Yield,
TangemTokenRowUM.PromoBannerUM.Content.Type.Staking,
)
}
// endregion

View file

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M17,6C17,5.448 17.448,5 18,5C18.552,5 19,5.448 19,6L19,18C19,18.552 18.552,19 18,19C17.448,19 17,18.552 17,18L17,6Z"
android:fillColor="#000000"/>
<path
android:pathData="M11,10C11,9.448 11.448,9 12,9C12.552,9 13,9.448 13,10L13,18C13,18.552 12.552,19 12,19C11.448,19 11,18.552 11,18L11,10Z"
android:fillColor="#000000"/>
<path
android:pathData="M5,14C5,13.448 5.448,13 6,13C6.552,13 7,13.448 7,14L7,18C7,18.552 6.552,19 6,19C5.448,19 5,18.552 5,18L5,14Z"
android:fillColor="#000000"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="12dp"
android:viewportWidth="12"
android:viewportHeight="12">
<path
android:pathData="M2.999,6.25C3.413,6.25 3.748,6.585 3.749,7V9C3.749,9.414 3.413,9.75 2.999,9.75C2.584,9.749 2.249,9.414 2.249,9V7C2.249,6.585 2.585,6.25 2.999,6.25ZM6,4.249C6.413,4.249 6.749,4.585 6.75,4.999V9C6.75,9.414 6.414,9.749 6,9.75C5.585,9.75 5.25,9.414 5.25,9V4.999C5.25,4.585 5.585,4.249 6,4.249ZM9,2.249C9.414,2.249 9.749,2.584 9.75,2.999V9C9.75,9.414 9.414,9.75 9,9.75C8.585,9.749 8.25,9.414 8.25,9V2.999C8.25,2.585 8.585,2.249 9,2.249Z"
android:fillColor="#34DF12"/>
</vector>

View file

@ -46,38 +46,38 @@ internal class WalletTokenCurrencyItemConverter(
stakingApyMap = stakingAvailabilityMap,
)
override fun convert(currencyStatus: CryptoCurrencyStatus): TangemTokenRowUM {
val earnApyInfo = earnApyConverter.convert(currencyStatus)
override fun convert(value: CryptoCurrencyStatus): TangemTokenRowUM {
val earnApyInfo = earnApyConverter.convert(value)
return TangemTokenRowUM.Content(
id = currencyStatus.currency.id.value,
id = value.currency.id.value,
headIconUM = TangemIconUM.Currency(
currencyIconState = currencyToIconStateConverter.convert(currencyStatus),
currencyIconState = currencyToIconStateConverter.convert(value),
),
titleUM = toCurrencyRowTitle(currencyStatus, earnApyInfo),
subtitleUM = toCurrencyRowSubtitle(currencyStatus),
topEndContentUM = toCurrencyRowTopEnd(currencyStatus),
bottomEndContentUM = toCurrencyRowBottomEnd(currencyStatus),
titleUM = toCurrencyRowTitle(value, earnApyInfo),
subtitleUM = toCurrencyRowSubtitle(value),
topEndContentUM = toCurrencyRowTopEnd(value),
bottomEndContentUM = toCurrencyRowBottomEnd(value),
promoBannerUM = toPromoBannerUM(
accountId,
currencyStatus,
value,
earnApyInfo.takeIf { shouldShowPromo },
),
onItemClick = when (currencyStatus.value) {
onItemClick = when (value.value) {
CryptoCurrencyStatus.Loading,
is CryptoCurrencyStatus.MissedDerivation,
-> null
else -> {
{
clickIntents.onTokenItemClick(accountId, currencyStatus)
clickIntents.onTokenItemClick(accountId, value)
}
}
},
onItemLongClick = when (currencyStatus.value) {
onItemLongClick = when (value.value) {
CryptoCurrencyStatus.Loading -> null
else -> {
{
clickIntents.onTokenItemLongClick(accountId, currencyStatus)
clickIntents.onTokenItemLongClick(accountId, value)
}
}
},
@ -280,6 +280,8 @@ internal class WalletTokenCurrencyItemConverter(
R.string.yield_module_main_screen_promo_banner_message,
wrappedList(earnApyInfo.apy),
),
iconRes = R.drawable.ic_yield_mode_mini_12,
type = TangemTokenRowUM.PromoBannerUM.Content.Type.Yield,
onPromoBannerClick = {
clickIntents.onYieldPromoClicked(currency)
clickIntents.onApyLabelClick(