Updated on 2026-08-14
This commit is contained in:
parent
bc8bb4da19
commit
a65b28883f
7 changed files with 105 additions and 23 deletions
|
|
@ -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
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 = {},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
15
core/ui/src/main/res/drawable/ic_yield_mode_default_24.xml
Normal file
15
core/ui/src/main/res/drawable/ic_yield_mode_default_24.xml
Normal 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>
|
||||
9
core/ui/src/main/res/drawable/ic_yield_mode_mini_12.xml
Normal file
9
core/ui/src/main/res/drawable/ic_yield_mode_mini_12.xml
Normal 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>
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue