From 6851fb8b25f0b08648346f31b81e905fc0e2243a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 13 Aug 2024 20:57:03 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../converters/YieldBalanceConverter.kt | 1 + .../staking/model/stakekit/YieldBalance.kt | 1 + .../model/stakekit/YieldBalanceList.kt | 7 ++- .../CurrenciesStatusesLceOperations.kt | 5 ++- .../CurrenciesStatusesOperations.kt | 5 ++- .../tokendetails/TokenDetailsPreviewData.kt | 2 +- .../ui/components/TokenDetailsBalanceBlock.kt | 13 +++--- .../presentation/common/WalletPreviewData.kt | 4 +- .../common/component/TokenItem.kt | 5 ++- .../common/component/token/TokenFiatAmount.kt | 43 +++++++++++++++---- .../common/state/TokenItemState.kt | 5 ++- .../converter/TokenItemStateConverter.kt | 11 +++-- 12 files changed, 75 insertions(+), 27 deletions(-) diff --git a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceConverter.kt b/data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceConverter.kt index c46a15f279..b1c9d7d47c 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceConverter.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/converters/YieldBalanceConverter.kt @@ -24,6 +24,7 @@ internal class YieldBalanceConverter : Converter, ) diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt index 3d3ae126da..01cc23bdc9 100644 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/YieldBalanceList.kt @@ -5,10 +5,13 @@ sealed class YieldBalanceList { data class Data( val balances: List, ) : YieldBalanceList() { - fun getBalance(rawCurrencyId: String?): YieldBalance { + fun getBalance(rawCurrencyId: String?, networkName: String): YieldBalance { return balances.firstOrNull { yield -> (yield as? YieldBalance.Data)?.balance?.items - ?.any { it.rawCurrencyId == rawCurrencyId } == true + ?.any { + rawCurrencyId == it.rawCurrencyId && + networkName.equals(it.rawNetworkId, ignoreCase = true) + } == true } ?: YieldBalance.Error } } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt index 8dee89d0e6..18f07bea3e 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesLceOperations.kt @@ -145,7 +145,10 @@ internal class CurrenciesStatusesLceOperations( currencies.map { currency -> val quote = quotes?.firstOrNull { it.rawCurrencyId == currency.id.rawCurrencyId } val networkStatus = networksStatuses?.firstOrNull { it.network == currency.network } - val yieldBalance = (yieldBalances as? YieldBalanceList.Data)?.getBalance(currency.id.rawCurrencyId) + val yieldBalance = (yieldBalances as? YieldBalanceList.Data)?.getBalance( + rawCurrencyId = currency.id.rawCurrencyId, + networkName = currency.network.name, + ) createCurrencyStatus( currency = currency, diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt index 34e8a290cb..e82bad56f2 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt @@ -261,7 +261,10 @@ internal class CurrenciesStatusesOperations( currencies.map { currency -> val quote = quotes?.firstOrNull { it.rawCurrencyId == currency.id.rawCurrencyId } val networkStatus = networksStatuses?.firstOrNull { it.network == currency.network } - val yieldBalance = (yieldBalances as? YieldBalanceList.Data)?.getBalance(currency.id.rawCurrencyId) + val yieldBalance = (yieldBalances as? YieldBalanceList.Data)?.getBalance( + rawCurrencyId = currency.id.rawCurrencyId, + networkName = currency.network.name, + ) createCurrencyStatus( currency = currency, quote = quote, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt index 182ed49b47..e7625b4013 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt @@ -129,7 +129,7 @@ internal object TokenDetailsPreviewData { onBalanceSelect = {}, displayCryptoBalance = "966,96 XLM", displayFiatBalance = "91,50$", - isBalanceSelectorEnabled = false, + isBalanceSelectorEnabled = true, ) val balanceError = TokenDetailsBalanceBlockState.Error( actionButtons = actionButtons, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt index d3e4bdff81..b814e9e554 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt @@ -147,17 +147,20 @@ private fun BalanceButtons(state: TokenDetailsBalanceBlockState) { .padding(top = TangemTheme.dimens.spacing11) .width(IntrinsicSize.Min), ) { config -> + val style = if (state.selectedBalanceType == config.type) { + TangemTheme.typography.caption1 + } else { + TangemTheme.typography.caption2 + } Text( text = config.title.resolveReference(), color = TangemTheme.colors.text.primary1, - style = TangemTheme.typography.caption1, + style = style, maxLines = 1, modifier = Modifier .padding( - start = TangemTheme.dimens.spacing5, - end = TangemTheme.dimens.spacing5, - top = TangemTheme.dimens.spacing3, - bottom = TangemTheme.dimens.spacing3, + horizontal = TangemTheme.dimens.spacing4, + vertical = TangemTheme.dimens.spacing6, ) .align(Alignment.Center), ) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt index e1f6a29f77..0ad7e674a7 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt @@ -97,7 +97,7 @@ internal object WalletPreviewData { id = UUID.randomUUID().toString(), iconState = coinIconState, titleState = TokenItemState.TitleState.Content(text = "Polygon", hasPending = true), - fiatAmountState = TokenItemState.FiatAmountState.Content(text = "321 $"), + fiatAmountState = TokenItemState.FiatAmountState.Content(text = "321 $", hasStaked = true), cryptoAmountState = TokenItemState.CryptoAmountState.Content(text = "5,412 MATIC"), cryptoPriceState = TokenItemState.CryptoPriceState.Unknown, onItemClick = {}, @@ -117,7 +117,7 @@ internal object WalletPreviewData { id = UUID.randomUUID().toString(), iconState = tokenIconState, titleState = TokenItemState.TitleState.Content(text = "Polygon"), - fiatAmountState = TokenItemState.FiatAmountState.Content(text = "321 $"), + fiatAmountState = TokenItemState.FiatAmountState.Content(text = "321 $", hasStaked = false), cryptoAmountState = TokenItemState.CryptoAmountState.Content(text = "5,412 MATIC"), cryptoPriceState = TokenItemState.CryptoPriceState.Content( price = "312 USD", diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt index 01c4e11d48..1917d4e4c8 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt @@ -403,7 +403,10 @@ private class TokenItemStateProvider : CollectionPreviewParameterProvider { FiatAmountText( text = if (isBalanceHidden) StringsSigns.STARS else state.text, - modifier, + hasStaked = state.hasStaked, + modifier = modifier, ) } is TokenFiatAmountState.Loading -> { @@ -32,15 +41,31 @@ internal fun TokenFiatAmount(state: TokenFiatAmountState?, isBalanceHidden: Bool } @Composable -private fun FiatAmountText(text: String, modifier: Modifier = Modifier) { - Text( - text = text, +private fun FiatAmountText(text: String, hasStaked: Boolean, modifier: Modifier = Modifier) { + Row( modifier = modifier, - color = TangemTheme.colors.text.primary1, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - style = TangemTheme.typography.body2, - ) + verticalAlignment = Alignment.CenterVertically, + ) { + AnimatedVisibility( + visible = hasStaked, + ) { + Icon( + painter = rememberVectorPainter(image = ImageVector.vectorResource(R.drawable.ic_staking_24)), + contentDescription = null, + tint = TangemTheme.colors.icon.accent, + modifier = Modifier + .padding(horizontal = TangemTheme.dimens.spacing4) + .size(TangemTheme.dimens.size12), + ) + } + Text( + text = text, + color = TangemTheme.colors.text.primary1, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = TangemTheme.typography.body2, + ) + } } private fun Modifier.placeholderSize(): Modifier = composed { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt index 6338c9f8b0..2ece6053fc 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt @@ -129,7 +129,10 @@ internal sealed class TokenItemState { @Immutable sealed class FiatAmountState { - data class Content(val text: String) : FiatAmountState() + data class Content( + val text: String, + val hasStaked: Boolean = false, + ) : FiatAmountState() object Loading : FiatAmountState() diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenItemStateConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenItemStateConverter.kt index d7639404cc..9abebae38f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenItemStateConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenItemStateConverter.kt @@ -1,5 +1,6 @@ package com.tangem.feature.wallet.presentation.wallet.state.transformers.converter +import com.tangem.common.extensions.isZero import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter import com.tangem.core.ui.components.marketprice.PriceChangeType import com.tangem.core.ui.components.marketprice.utils.PriceChangeConverter @@ -55,6 +56,7 @@ internal class TokenItemStateConverter( ), fiatAmountState = TokenItemState.FiatAmountState.Content( text = getFormattedFiatAmount(), + hasStaked = !getStakedBalance().isZero(), ), cryptoAmountState = TokenItemState.CryptoAmountState.Content(text = getFormattedAmount()), cryptoPriceState = getCryptoPriceState(), @@ -64,21 +66,22 @@ internal class TokenItemStateConverter( } private fun CryptoCurrencyStatus.getFormattedAmount(): String { - val yieldBalance = (value.yieldBalance as? YieldBalance.Data)?.getTotalStakingBalance().orZero() - val amount = value.amount?.plus(yieldBalance) ?: return DASH_SIGN + val amount = value.amount?.plus(getStakedBalance()) ?: return DASH_SIGN return BigDecimalFormatter.formatCryptoAmount(amount, currency.symbol, currency.decimals) } private fun CryptoCurrencyStatus.getFormattedFiatAmount(): String { - val yieldBalance = (value.yieldBalance as? YieldBalance.Data)?.getTotalStakingBalance().orZero() - val fiatYieldBalance = value.fiatRate?.times(yieldBalance).orZero() + val fiatYieldBalance = value.fiatRate?.times(getStakedBalance()).orZero() val fiatAmount = value.fiatAmount?.plus(fiatYieldBalance) ?: return DASH_SIGN val appCurrency = appCurrencyProvider() return BigDecimalFormatter.formatFiatAmount(fiatAmount, appCurrency.code, appCurrency.symbol) } + private fun CryptoCurrencyStatus.getStakedBalance() = + (value.yieldBalance as? YieldBalance.Data)?.getTotalStakingBalance().orZero() + private fun CryptoCurrencyStatus.mapToUnreachableTokenItemState() = TokenItemState.Unreachable( id = currency.id.value, iconState = iconStateConverter.convert(value = this),