From a258763b81fd40842da480dde485ea193f534ba3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 15 Sep 2025 19:05:34 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../ui/tokens/TokenItemStateConverter.kt | 4 +-- .../core/ui/components/icons/IconTint.kt | 10 +++++++ .../core/ui/components/token/TokenItem.kt | 17 +++++++++-- .../token/internal/TokenFiatAmount.kt | 9 +++--- .../components/token/internal/TokenTitle.kt | 28 +++++++++++++++++++ .../components/token/state/TokenItemState.kt | 4 ++- .../src/main/res/drawable/ic_attention_12.xml | 9 ++++++ .../portfolio/impl/ui/PortfolioItem.kt | 5 ++-- features/wallet/impl/build.gradle.kts | 1 + .../utils/WalletWarningsAnalyticsSender.kt | 1 + .../domain/GetMultiWalletWarningsFactory.kt | 21 ++++++++++++++ .../wallet/state/model/WalletNotification.kt | 5 ++++ 12 files changed, 102 insertions(+), 12 deletions(-) create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/icons/IconTint.kt create mode 100644 core/ui/src/main/res/drawable/ic_attention_12.xml diff --git a/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt b/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt index 9c80a6a1b7..da0b138077 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/tokens/TokenItemStateConverter.kt @@ -3,6 +3,7 @@ package com.tangem.common.ui.tokens import com.tangem.common.ui.R import com.tangem.core.ui.components.currency.icon.CurrencyIconState import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter +import com.tangem.core.ui.components.icons.IconTint import com.tangem.core.ui.components.marketprice.PriceChangeType import com.tangem.core.ui.components.marketprice.utils.PriceChangeConverter import com.tangem.core.ui.components.token.state.TokenItemState @@ -220,13 +221,12 @@ class TokenItemStateConverter( if (!status.getStakedBalance().isZero()) { TokenItemState.FiatAmountState.Content.IconUM( iconRes = R.drawable.ic_staking_24, - useAccentColor = true, + tint = IconTint.Accent, ).let(::add) } if (status.value.sources.total == StatusSource.ONLY_CACHE) { TokenItemState.FiatAmountState.Content.IconUM( iconRes = R.drawable.ic_error_sync_24, - useAccentColor = false, ).let(::add) } }.toImmutableList(), diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/icons/IconTint.kt b/core/ui/src/main/java/com/tangem/core/ui/components/icons/IconTint.kt new file mode 100644 index 0000000000..db6a607f67 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/icons/IconTint.kt @@ -0,0 +1,10 @@ +package com.tangem.core.ui.components.icons + +import androidx.compose.runtime.Stable + +@Stable +enum class IconTint { + Accent, + Warning, + Inactive, +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/token/TokenItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/token/TokenItem.kt index 9a4585eb59..7bb297765a 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/token/TokenItem.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/token/TokenItem.kt @@ -22,6 +22,7 @@ import com.tangem.core.ui.R import com.tangem.core.ui.components.audits.AuditLabelUM import com.tangem.core.ui.components.currency.icon.CurrencyIcon import com.tangem.core.ui.components.currency.icon.CurrencyIconState +import com.tangem.core.ui.components.icons.IconTint import com.tangem.core.ui.components.marketprice.PriceChangeType import com.tangem.core.ui.components.token.internal.* import com.tangem.core.ui.components.token.state.TokenItemState @@ -488,7 +489,14 @@ private class TokenItemStateProvider : CollectionPreviewParameterProvider TangemTheme.colors.icon.accent + IconTint.Warning -> TangemTheme.colors.icon.attention + IconTint.Inactive -> TangemTheme.colors.icon.inactive }, contentDescription = null, ) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/token/internal/TokenTitle.kt b/core/ui/src/main/java/com/tangem/core/ui/components/token/internal/TokenTitle.kt index 7f379e09a6..3fadd11e81 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/token/internal/TokenTitle.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/token/internal/TokenTitle.kt @@ -2,7 +2,9 @@ package com.tangem.core.ui.components.token.internal import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -13,8 +15,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp import com.tangem.core.ui.R import com.tangem.core.ui.components.RectangleShimmer +import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.components.token.state.TokenItemState.TitleState as TokenTitleState @@ -56,6 +60,11 @@ private fun ContentTitle(state: TokenTitleState.Content, modifier: Modifier = Mo hasPending = state.hasPending, modifier = Modifier.align(alignment = Alignment.CenterVertically), ) + + YieldSupplyApyLabel( + apy = state.earnApy, + modifier = Modifier.align(alignment = Alignment.CenterVertically), + ) } } @@ -71,6 +80,25 @@ private fun CurrencyNameText(name: String, isAvailable: Boolean, modifier: Modif ) } +@Composable +private fun YieldSupplyApyLabel(apy: TextReference?, modifier: Modifier = Modifier) { + AnimatedVisibility(visible = apy != null, modifier = modifier) { + Box( + modifier = modifier.background( + color = TangemTheme.colors.text.accent.copy(alpha = 0.1f), + shape = TangemTheme.shapes.roundedCornersSmall2, + ), + ) { + Text( + text = apy?.resolveReference().orEmpty(), + style = TangemTheme.typography.caption1, + color = TangemTheme.colors.text.accent, + modifier = Modifier.padding(horizontal = 4.dp, vertical = 2.dp), + ) + } + } +} + @Composable private fun PendingTransactionImage(hasPending: Boolean, modifier: Modifier = Modifier) { AnimatedVisibility(visible = hasPending, modifier = modifier) { diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/token/state/TokenItemState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/token/state/TokenItemState.kt index be357d5ebf..f86a303999 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/token/state/TokenItemState.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/token/state/TokenItemState.kt @@ -3,6 +3,7 @@ package com.tangem.core.ui.components.token.state import androidx.compose.runtime.Immutable import com.tangem.core.ui.components.audits.AuditLabelUM import com.tangem.core.ui.components.currency.icon.CurrencyIconState +import com.tangem.core.ui.components.icons.IconTint import com.tangem.core.ui.components.marketprice.PriceChangeType import com.tangem.core.ui.extensions.TextReference import kotlinx.collections.immutable.ImmutableList @@ -167,6 +168,7 @@ sealed class TokenItemState { val text: TextReference, val hasPending: Boolean = false, val isAvailable: Boolean = true, + val earnApy: TextReference? = null, ) : TitleState() data object Loading : TitleState() @@ -204,7 +206,7 @@ sealed class TokenItemState { data class IconUM( val iconRes: Int, - val useAccentColor: Boolean, + val tint: IconTint = IconTint.Inactive, ) } diff --git a/core/ui/src/main/res/drawable/ic_attention_12.xml b/core/ui/src/main/res/drawable/ic_attention_12.xml new file mode 100644 index 0000000000..960069e5dd --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_attention_12.xml @@ -0,0 +1,9 @@ + + + diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/ui/PortfolioItem.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/ui/PortfolioItem.kt index f5c13e5165..ac68e930d6 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/ui/PortfolioItem.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/ui/PortfolioItem.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider +import com.tangem.core.ui.components.icons.IconTint import com.tangem.core.ui.components.token.TokenItem import com.tangem.core.ui.components.token.state.TokenItemState import com.tangem.core.ui.haptic.TangemHapticEffect @@ -100,9 +101,9 @@ private class PortfolioTokenUMProvider : CollectionPreviewParameterProvider null is WalletNotification.Critical.SeedPhraseNotification -> MainScreen.NoticeSeedPhraseSupport is WalletNotification.Critical.SeedPhraseSecondNotification -> MainScreen.NoticeSeedPhraseSupportSecond diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt index 9465690c26..41f8f7dea4 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/domain/GetMultiWalletWarningsFactory.kt @@ -31,6 +31,7 @@ import com.tangem.domain.wallets.usecase.SeedPhraseNotificationUseCase import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents import com.tangem.feature.wallet.impl.R import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification +import com.tangem.features.yield.supply.api.YieldSupplyFeatureToggles import com.tangem.lib.crypto.BlockchainUtils.isBitcoin import com.tangem.utils.coroutines.combine6 import com.tangem.utils.extensions.addIf @@ -54,6 +55,7 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( private val getCryptoCurrenciesUseCase: GetCryptoCurrenciesUseCase, private val onrampSepaAvailableUseCase: OnrampSepaAvailableUseCase, private val getOnrampCountryUseCase: GetOnrampCountryUseCase, + private val yieldSupplyFeatureToggles: YieldSupplyFeatureToggles, ) { fun create(userWallet: UserWallet, clickIntents: WalletClickIntents): Flow> { @@ -82,6 +84,8 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( addWarningNotifications(cardTypesResolver, maybeTokenList, isNeedToBackup, clickIntents) + addYieldSupplyNotifications(maybeTokenList) + val hasCriticalOrWarning = any { notification -> notification is WalletNotification.Critical || notification is WalletNotification.Warning } @@ -268,6 +272,15 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( ) } + private fun MutableList.addYieldSupplyNotifications( + tokenList: Lce, + ) { + addIf( + element = WalletNotification.Warning.YeildSupplyApprove, + condition = tokenList.hasNetworksWithLendingsWithoutApprove(), + ) + } + private fun MutableList.addWarningNotifications( cardTypesResolver: CardTypesResolver?, tokenList: Lce, @@ -298,6 +311,14 @@ internal class GetMultiWalletWarningsFactory @Inject constructor( return tokenList.flattenCurrencies().any { it.value is CryptoCurrencyStatus.Unreachable } } + private fun Lce.hasNetworksWithLendingsWithoutApprove(): Boolean { + val tokenList = getOrNull(isPartialContentAccepted = false) ?: return false + val yieldSupplyEnabled = yieldSupplyFeatureToggles.isYieldSupplyFeatureEnabled + return yieldSupplyEnabled && tokenList.flattenCurrencies().any { + it.value.yieldSupplyStatus?.isAllowedToSpend == false + } + } + private fun MutableList.addRateTheAppNotification( isReadyToShowRating: Boolean, clickIntents: WalletClickIntents, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt index c7bfe00b92..e0f5949b5a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletNotification.kt @@ -138,6 +138,11 @@ sealed class WalletNotification(val config: NotificationConfig) { formatArgs = wrappedList(count), ), ) + + data object YeildSupplyApprove : Warning( + title = resourceReference(R.string.yield_module_main_view_approve_notification_title), + subtitle = resourceReference(R.string.yield_module_main_view_approve_notification_description), + ) } sealed class Informational(