diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml
index e1c2294119..db979e464e 100644
--- a/core/res/src/main/res/values-ja/strings.xml
+++ b/core/res/src/main/res/values-ja/strings.xml
@@ -692,6 +692,7 @@
Manaレベル
暗号資産および取引の追跡を開始するには、トークンを追加してください
トークンの管理
+ QRコードをスキャンして送金するか、アプリに接続します。
すべてのネットワークにアクセスするには、カードをスキャンする必要があります。
カードまたはリングをスキャンする
2月%2$s - %3$sの期間、Changelly経由のスワップは%1$sのサービス手数料となります。
diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml
index 32e497df40..c727172575 100644
--- a/core/res/src/main/res/values-ru/strings.xml
+++ b/core/res/src/main/res/values-ru/strings.xml
@@ -843,6 +843,7 @@
Объем торгов (24ч)
Общая сумма криптовалюты, которая была продана за последние 24 часа, показывающая уровень активности и ликвидности на рынке.
Объем торгов (24ч)
+ %s в сумме
Объем
Потяните вверх или коснитесь поисковой строки, чтобы добавить токены напрямую из рынка
Добавить токены
diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 7e5f655ad3..3d4d8d7a48 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -737,6 +737,8 @@
Earn with Tangem
To generate addresses for selected networks, you must scan your Tangem Wallet card or ring
To add tokens pull this up or tap the search bar
+ Swipe up to explore the market
+ Find new hidden gems
This section’s data is sourced from the following networks: %s
Unable to load the data…
No data
@@ -826,9 +828,11 @@
Total supply
The maximum number of coins or tokens that can ever exist for a particular cryptocurrency
Total supply
+ 24h
Trading volume (24h)
The total amount of a cryptocurrency that has been traded within the last 24 hours, indicating the level of activity and liquidity in the market
Trading volume (24h)
+ %s in total
Volume
Pull this up or tap the search bar to add tokens directly from the market
Add tokens
diff --git a/core/ui/src/main/java/com/tangem/core/ui/ds/badge/TangemBadge.kt b/core/ui/src/main/java/com/tangem/core/ui/ds/badge/TangemBadge.kt
index e3332f834d..c196b908aa 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/ds/badge/TangemBadge.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/ds/badge/TangemBadge.kt
@@ -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 Unit,
val onCloseClick: () -> Unit,
val onPromoShown: () -> Unit = {},
- ) : PromoBannerUM()
+ ) : PromoBannerUM() {
+ enum class Type {
+ Yield,
+ Staking,
+ }
+ }
data object Empty : PromoBannerUM()
}
diff --git a/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TangemTokenRowPreviewData.kt b/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TangemTokenRowPreviewData.kt
index fb7b25744f..e4a05a37db 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TangemTokenRowPreviewData.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TangemTokenRowPreviewData.kt
@@ -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 = {},
diff --git a/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TokenRowPromoBanner.kt b/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TokenRowPromoBanner.kt
index 013204a20f..e7cf89db35 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TokenRowPromoBanner.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/ds/row/token/internal/TokenRowPromoBanner.kt
@@ -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),
)
}
-}
\ No newline at end of file
+}
+
+internal class TangemTokenRowPromoBannerPreviewProvider :
+ PreviewParameterProvider {
+ override val values: Sequence
+ get() = sequenceOf(
+ TangemTokenRowUM.PromoBannerUM.Content.Type.Yield,
+ TangemTokenRowUM.PromoBannerUM.Content.Type.Staking,
+ )
+}
+// endregion
\ No newline at end of file
diff --git a/core/ui/src/main/res/drawable/ic_yield_mode_default_24.xml b/core/ui/src/main/res/drawable/ic_yield_mode_default_24.xml
new file mode 100644
index 0000000000..3237c3b395
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_yield_mode_default_24.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_yield_mode_mini_12.xml b/core/ui/src/main/res/drawable/ic_yield_mode_mini_12.xml
new file mode 100644
index 0000000000..d07223975e
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_yield_mode_mini_12.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/WalletTokenCurrencyItemConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/WalletTokenCurrencyItemConverter.kt
index ed2a68e455..c1794a9422 100644
--- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/WalletTokenCurrencyItemConverter.kt
+++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/WalletTokenCurrencyItemConverter.kt
@@ -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(
diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/MarketsHint.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/MarketsHint.kt
index 32c059a463..c34f8e901b 100644
--- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/MarketsHint.kt
+++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/MarketsHint.kt
@@ -5,9 +5,10 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
+import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.text.InlineTextContent
-import androidx.compose.foundation.text.appendInlineContent
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -15,17 +16,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
-import androidx.compose.ui.text.Placeholder
-import androidx.compose.ui.text.PlaceholderVerticalAlign
-import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
+import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreviewRedesign
import com.tangem.feature.wallet.impl.R
-private const val STARS_INLINE_CONTENT_ID = "stars"
-
@Composable
internal fun MarketsHint(isVisible: Boolean, modifier: Modifier = Modifier) {
AnimatedVisibility(
@@ -36,41 +33,28 @@ internal fun MarketsHint(isVisible: Boolean, modifier: Modifier = Modifier) {
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens2.x1),
) {
Text(
- text = "Swipe up to explore the market", // todo redesign main lokalise
- style = TangemTheme.typography2.bodyRegular14,
+ text = stringResourceSafe(R.string.markets_hint_part_one),
+ style = TangemTheme.typography2.bodyRegular15,
color = TangemTheme.colors2.text.neutral.primary,
textAlign = TextAlign.Center,
)
- Text(
- text = buildAnnotatedString {
- append("Find new hidden gems ") // todo redesign main lokalise
- appendInlineContent(
- STARS_INLINE_CONTENT_ID,
- alternateText = "\uDBC0\uDDBF",
- )
- },
- inlineContent = mapOf(
- STARS_INLINE_CONTENT_ID to InlineTextContent(
- placeholder = Placeholder(
- width = TangemTheme.typography2.bodyRegular14.fontSize,
- height = TangemTheme.typography2.bodyRegular14.fontSize,
- placeholderVerticalAlign = PlaceholderVerticalAlign.Center,
- ),
- children = {
- Icon(
- imageVector = ImageVector.vectorResource(R.drawable.ic_magic_default_24),
- tint = TangemTheme.colors2.text.neutral.tertiary,
- contentDescription = null,
- )
- },
- ),
- ),
- style = TangemTheme.typography2.bodyRegular14,
- color = TangemTheme.colors2.text.neutral.tertiary,
- textAlign = TextAlign.Center,
- )
+ Row(horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens2.x1)) {
+ Text(
+ text = stringResourceSafe(R.string.markets_hint_part_two),
+ style = TangemTheme.typography2.bodyRegular15,
+ color = TangemTheme.colors2.text.neutral.tertiary,
+ textAlign = TextAlign.Center,
+ )
+ Icon(
+ imageVector = ImageVector.vectorResource(R.drawable.ic_magic_default_24),
+ tint = TangemTheme.colors2.text.neutral.tertiary,
+ contentDescription = null,
+ modifier = Modifier.size(TangemTheme.dimens2.x5),
+ )
+ }
}
}
}