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