diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/MarketPriceBlock.kt b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/MarketPriceBlock.kt index 1626a42bce..efbf7b9f2a 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/MarketPriceBlock.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/MarketPriceBlock.kt @@ -163,11 +163,13 @@ private fun PriceChangeInPercent(config: PriceChangeState.Content) { id = when (type) { PriceChangeType.UP -> R.drawable.ic_arrow_up_8 PriceChangeType.DOWN -> R.drawable.ic_arrow_down_8 + PriceChangeType.NEUTRAL -> R.drawable.ic_elipse_8 }, ), tint = when (type) { PriceChangeType.UP -> TangemTheme.colors.icon.accent PriceChangeType.DOWN -> TangemTheme.colors.icon.warning + PriceChangeType.NEUTRAL -> TangemTheme.colors.icon.inactive }, contentDescription = null, ) @@ -177,6 +179,7 @@ private fun PriceChangeInPercent(config: PriceChangeState.Content) { color = when (type) { PriceChangeType.UP -> TangemTheme.colors.text.accent PriceChangeType.DOWN -> TangemTheme.colors.text.warning + PriceChangeType.NEUTRAL -> TangemTheme.colors.text.disabled }, style = TangemTheme.typography.body2, ) @@ -251,6 +254,14 @@ private class WalletMarketPriceBlockStateProvider : CollectionPreviewParameterPr type = PriceChangeType.UP, ), ), + MarketPriceBlockState.Content( + currencySymbol = "BTC", + price = "98900 $", + priceChangeConfig = PriceChangeState.Content( + valueInPercent = "0.00%", + type = PriceChangeType.NEUTRAL, + ), + ), MarketPriceBlockState.Loading(currencySymbol = "BTC"), MarketPriceBlockState.Error(currencySymbol = "BTC"), ), diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/PriceChangeState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/PriceChangeState.kt index 5130e77203..8db483f50c 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/PriceChangeState.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/PriceChangeState.kt @@ -5,9 +5,4 @@ sealed class PriceChangeState { data class Content(val valueInPercent: String, val type: PriceChangeType) : PriceChangeState() object Unknown : PriceChangeState() -} - -/** Price changing type */ -enum class PriceChangeType { - UP, DOWN } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/PriceChangeType.kt b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/PriceChangeType.kt new file mode 100644 index 0000000000..de78fc1368 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/PriceChangeType.kt @@ -0,0 +1,6 @@ +package com.tangem.core.ui.components.marketprice + +/** Price changing type */ +enum class PriceChangeType { + UP, DOWN, NEUTRAL, +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/utils/PriceChangeConverter.kt b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/utils/PriceChangeConverter.kt new file mode 100644 index 0000000000..5d8bb93cb3 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/marketprice/utils/PriceChangeConverter.kt @@ -0,0 +1,21 @@ +package com.tangem.core.ui.components.marketprice.utils + +import com.tangem.core.ui.components.marketprice.PriceChangeType +import java.math.BigDecimal +import java.math.RoundingMode + +object PriceChangeConverter { + + fun fromBigDecimal(value: BigDecimal?, scale: Int = 2): PriceChangeType { + val formattedValue = value + ?.movePointRight(2) + ?.setScale(scale, RoundingMode.HALF_UP) + ?: return PriceChangeType.NEUTRAL + + return when (formattedValue.signum()) { + 1 -> PriceChangeType.UP + -1 -> PriceChangeType.DOWN + else -> PriceChangeType.NEUTRAL + } + } +} \ No newline at end of file diff --git a/core/ui/src/main/res/drawable/ic_elipse_8.xml b/core/ui/src/main/res/drawable/ic_elipse_8.xml new file mode 100644 index 0000000000..dab2aad1bb --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_elipse_8.xml @@ -0,0 +1,9 @@ + + + diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/QuotesState.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/QuotesState.kt index 9e255ebc77..3518626707 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/QuotesState.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/QuotesState.kt @@ -1,5 +1,6 @@ package com.tangem.managetokens.presentation.managetokens.state +import com.tangem.core.ui.components.marketprice.PriceChangeType import kotlinx.collections.immutable.ImmutableList internal sealed class QuotesState { @@ -10,8 +11,4 @@ internal sealed class QuotesState { val changeType: PriceChangeType, val chartData: ImmutableList, ) : QuotesState() -} - -enum class PriceChangeType { - UP, DOWN } \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/factory/QuotesToQuotesStateConverter.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/factory/QuotesToQuotesStateConverter.kt index b9559d3a9c..972c004779 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/factory/QuotesToQuotesStateConverter.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/factory/QuotesToQuotesStateConverter.kt @@ -1,8 +1,9 @@ package com.tangem.managetokens.presentation.managetokens.state.factory +import com.tangem.core.ui.components.marketprice.PriceChangeType +import com.tangem.core.ui.components.marketprice.utils.PriceChangeConverter import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.domain.tokens.model.Quote -import com.tangem.managetokens.presentation.managetokens.state.PriceChangeType import com.tangem.managetokens.presentation.managetokens.state.QuotesState import com.tangem.utils.converter.Converter import kotlinx.collections.immutable.persistentListOf @@ -16,19 +17,18 @@ internal class QuotesToQuotesStateConverter : Converter { priceChange = BigDecimalFormatter.formatPercent( percent = priceChange.movePointLeft(2), useAbsoluteValue = true, - maxFractionDigits = 1, - minFractionDigits = 1, ), changeType = priceChange.getPriceChangeType(), chartData = // TODO (in [REDACTED_TASK_KEY] when endpoint is ready) when (priceChange.getPriceChangeType()) { PriceChangeType.UP -> persistentListOf(0f, 5f, 10f, 30f) PriceChangeType.DOWN -> persistentListOf(15f, 12f, 13f, 18f, 10f, 3f) + PriceChangeType.NEUTRAL -> persistentListOf(0f, 0f, 0f, 0f) }, ) } private fun BigDecimal.getPriceChangeType(): PriceChangeType { - return if (this >= BigDecimal.ZERO) PriceChangeType.UP else PriceChangeType.DOWN + return PriceChangeConverter.fromBigDecimal(value = this) } } \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt index 40d4334eb3..961253bf87 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt @@ -32,6 +32,7 @@ internal object ManageTokensStatePreviewData { get() = listOf( TokenItemStatePreviewData.loadedPriceDown, TokenItemStatePreviewData.loadedPriceUp, + TokenItemStatePreviewData.loadedPriceNeutral, ) private val searchState: SearchBarState diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/TokenItemStatePreviewData.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/TokenItemStatePreviewData.kt index 01ed9bdda9..1ba8f760e6 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/TokenItemStatePreviewData.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/TokenItemStatePreviewData.kt @@ -2,7 +2,11 @@ package com.tangem.managetokens.presentation.managetokens.state.previewdata import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.graphics.Color -import com.tangem.managetokens.presentation.managetokens.state.* +import com.tangem.core.ui.components.marketprice.PriceChangeType +import com.tangem.managetokens.presentation.managetokens.state.QuotesState +import com.tangem.managetokens.presentation.managetokens.state.TokenButtonType +import com.tangem.managetokens.presentation.managetokens.state.TokenIconState +import com.tangem.managetokens.presentation.managetokens.state.TokenItemState import kotlinx.collections.immutable.persistentListOf internal object TokenItemStatePreviewData { @@ -46,6 +50,24 @@ internal object TokenItemStatePreviewData { chooseNetworkState = ChooseNetworkStatePreviewData.state, ) + val loadedPriceNeutral: TokenItemState + get() = TokenItemState.Loaded( + id = "BTC", + name = "Bitcoin Bitcoin Bitcoin Bitcoin Bitcoin Bitcoin Bitcoin Bitcoin", + tokenId = "BTC", + currencySymbol = "BTC", + tokenIcon = tokenIconState, + quotes = QuotesState.Content( + priceChange = "0.00%", + changeType = PriceChangeType.NEUTRAL, + chartData = persistentListOf(10f, 2f, 5f, 3f, 4f, 8f, 9f, 7f, 10f), + ), + rate = "31 285.72$", + availableAction = mutableStateOf(TokenButtonType.ADD), + onButtonClick = {}, + chooseNetworkState = ChooseNetworkStatePreviewData.state, + ) + private val tokenIconState: TokenIconState get() = TokenIconState( iconReference = null, diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/PriceChangesChart.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/PriceChangesChart.kt index 9909709a8d..998dbebc72 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/PriceChangesChart.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/PriceChangesChart.kt @@ -120,4 +120,14 @@ private fun Chart_Negative_Preview() { persistentListOf(10f, 2f, 4f, 1f, 5f), ) } +} + +@Preview(widthDp = 150, heightDp = 150, showBackground = true) +@Composable +private fun Chart_Neutral_Preview() { + TangemTheme(isDark = true) { + PriceChangesChart( + persistentListOf(5f, 2f, 4f, 1f, 5f), + ) + } } \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenPriceChange.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenPriceChange.kt index 1b2d04c7a9..28b7691794 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenPriceChange.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenPriceChange.kt @@ -11,9 +11,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import com.tangem.core.ui.components.SpacerW4 +import com.tangem.core.ui.components.marketprice.PriceChangeType import com.tangem.core.ui.res.TangemTheme import com.tangem.features.managetokens.impl.R -import com.tangem.managetokens.presentation.managetokens.state.PriceChangeType import com.tangem.managetokens.presentation.managetokens.state.QuotesState @Composable @@ -48,11 +48,13 @@ private fun PriceChangeIcon(type: PriceChangeType?) { id = when (animatedType) { PriceChangeType.UP -> R.drawable.ic_arrow_up_8 PriceChangeType.DOWN -> R.drawable.ic_arrow_down_8 + PriceChangeType.NEUTRAL -> R.drawable.ic_elipse_8 }, ), tint = when (animatedType) { PriceChangeType.UP -> TangemTheme.colors.icon.accent PriceChangeType.DOWN -> TangemTheme.colors.icon.warning + PriceChangeType.NEUTRAL -> TangemTheme.colors.icon.inactive }, contentDescription = null, ) @@ -69,6 +71,7 @@ private fun PriceChangeText(type: PriceChangeType?, text: String?) { color = when (type) { PriceChangeType.UP -> TangemTheme.colors.text.accent PriceChangeType.DOWN -> TangemTheme.colors.text.warning + PriceChangeType.NEUTRAL -> TangemTheme.colors.text.disabled null -> TangemTheme.colors.text.primary1 }, overflow = TextOverflow.Ellipsis, diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenRowItem.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenRowItem.kt index 12a403e3e4..d92f0a8b81 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenRowItem.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/ui/components/TokenRowItem.kt @@ -180,7 +180,8 @@ private fun BaseSurface(modifier: Modifier = Modifier, content: @Composable () - } } -@Preview() +// region Preview +@Preview(showBackground = true, widthDp = 360) @Composable private fun Preview_Tokens_LightTheme(@PreviewParameter(TokenConfigProvider::class) state: TokenItemState) { TangemTheme(isDark = false) { @@ -188,7 +189,7 @@ private fun Preview_Tokens_LightTheme(@PreviewParameter(TokenConfigProvider::cla } } -@Preview +@Preview(showBackground = true, widthDp = 360) @Composable private fun Preview_Tokens_DarkTheme(@PreviewParameter(TokenConfigProvider::class) state: TokenItemState) { TangemTheme(isDark = true) { @@ -201,5 +202,7 @@ private class TokenConfigProvider : CollectionPreviewParameterProvider, @@ -118,9 +118,7 @@ internal class TokenDetailsLoadedBalanceConverter( } private fun getPriceChangeType(status: CryptoCurrencyStatus.Status): PriceChangeType { - val priceChange = status.priceChange ?: return PriceChangeType.DOWN - - return if (priceChange > BigDecimal.ZERO) PriceChangeType.UP else PriceChangeType.DOWN + return PriceChangeConverter.fromBigDecimal(status.priceChange) } private fun formatPriceChange(status: CryptoCurrencyStatus.Status): String { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenPrice.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenPrice.kt index 06cd93ccec..4822e0d489 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenPrice.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenPrice.kt @@ -87,11 +87,13 @@ private fun PriceChangeIcon(type: PriceChangeType) { id = when (animatedType) { PriceChangeType.UP -> R.drawable.ic_arrow_up_8 PriceChangeType.DOWN -> R.drawable.ic_arrow_down_8 + PriceChangeType.NEUTRAL -> R.drawable.ic_elipse_8 }, ), tint = when (animatedType) { PriceChangeType.UP -> TangemTheme.colors.icon.accent PriceChangeType.DOWN -> TangemTheme.colors.icon.warning + PriceChangeType.NEUTRAL -> TangemTheme.colors.icon.inactive }, contentDescription = null, ) @@ -106,6 +108,7 @@ private fun PriceChangeText(type: PriceChangeType?, text: String?, modifier: Mod color = when (type) { PriceChangeType.UP -> TangemTheme.colors.text.accent PriceChangeType.DOWN -> TangemTheme.colors.text.warning + PriceChangeType.NEUTRAL -> TangemTheme.colors.text.disabled null -> TangemTheme.colors.text.tertiary }, overflow = TextOverflow.Ellipsis, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletMarketPriceConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletMarketPriceConverter.kt index 60fcaa1c3c..157d0a1180 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletMarketPriceConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/SingleWalletMarketPriceConverter.kt @@ -3,11 +3,11 @@ package com.tangem.feature.wallet.presentation.wallet.state.transformers.convert import com.tangem.core.ui.components.marketprice.MarketPriceBlockState import com.tangem.core.ui.components.marketprice.PriceChangeState import com.tangem.core.ui.components.marketprice.PriceChangeType +import com.tangem.core.ui.components.marketprice.utils.PriceChangeConverter import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.utils.converter.Converter -import java.math.BigDecimal internal class SingleWalletMarketPriceConverter( private val status: CryptoCurrencyStatus.Status, @@ -61,8 +61,6 @@ internal class SingleWalletMarketPriceConverter( } private fun getPriceChangeType(status: CryptoCurrencyStatus.Status): PriceChangeType { - val priceChange = status.priceChange ?: return PriceChangeType.DOWN - - return if (priceChange > BigDecimal.ZERO) PriceChangeType.UP else PriceChangeType.DOWN + return PriceChangeConverter.fromBigDecimal(status.priceChange) } } \ No newline at end of file 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 77aa101de4..aa168db655 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 @@ -2,6 +2,7 @@ package com.tangem.feature.wallet.presentation.wallet.state.transformers.convert import com.tangem.core.ui.components.currency.tokenicon.converter.CryptoCurrencyToIconStateConverter import com.tangem.core.ui.components.marketprice.PriceChangeType +import com.tangem.core.ui.components.marketprice.utils.PriceChangeConverter import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus @@ -97,8 +98,6 @@ internal class TokenItemStateConverter( priceChangePercent = BigDecimalFormatter.formatPercent( percent = priceChange, useAbsoluteValue = true, - maxFractionDigits = 1, - minFractionDigits = 1, ), type = priceChange.getPriceChangeType(), ) @@ -117,6 +116,6 @@ internal class TokenItemStateConverter( } private fun BigDecimal.getPriceChangeType(): PriceChangeType { - return if (this > BigDecimal.ZERO) PriceChangeType.UP else PriceChangeType.DOWN + return PriceChangeConverter.fromBigDecimal(value = this) } } \ No newline at end of file