diff --git a/features/nft/impl/build.gradle.kts b/features/nft/impl/build.gradle.kts index b30b854ca8..7ac4ae8799 100644 --- a/features/nft/impl/build.gradle.kts +++ b/features/nft/impl/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { /** Domain modules */ implementation(projects.domain.appCurrency.models) + implementation(projects.domain.appCurrency) implementation(projects.domain.models) implementation(projects.domain.nft) implementation(projects.domain.nft.models) diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/NFTSalePriceUM.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/NFTSalePriceUM.kt index 8747a49f55..19911a7d9b 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/NFTSalePriceUM.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/NFTSalePriceUM.kt @@ -1,10 +1,11 @@ package com.tangem.features.nft.collections.entity import androidx.compose.runtime.Immutable +import com.tangem.core.ui.extensions.TextReference @Immutable internal sealed class NFTSalePriceUM { data object Loading : NFTSalePriceUM() data object Failed : NFTSalePriceUM() - data class Content(val price: String) : NFTSalePriceUM() + data class Content(val price: TextReference) : NFTSalePriceUM() } \ No newline at end of file diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/UpdateDataStateTransformer.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/UpdateDataStateTransformer.kt index a73a5aba58..9a7e3bc93d 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/UpdateDataStateTransformer.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/UpdateDataStateTransformer.kt @@ -2,10 +2,9 @@ package com.tangem.features.nft.collections.entity.transformer import com.tangem.core.ui.components.fields.entity.SearchBarUM import com.tangem.core.ui.components.notifications.NotificationConfig -import com.tangem.core.ui.extensions.TextReference -import com.tangem.core.ui.extensions.getActiveIconRes -import com.tangem.core.ui.extensions.resourceReference -import com.tangem.core.ui.extensions.wrappedList +import com.tangem.core.ui.extensions.* +import com.tangem.core.ui.format.bigdecimal.crypto +import com.tangem.core.ui.format.bigdecimal.format import com.tangem.domain.nft.models.* import com.tangem.features.nft.collections.entity.* import com.tangem.features.nft.impl.R @@ -146,20 +145,31 @@ internal class UpdateDataStateTransformer( ) } - private fun NFTAsset.transform(collectionName: String): NFTCollectionAssetUM = NFTCollectionAssetUM( - id = id.toString(), - name = name.orEmpty(), - imageUrl = media?.url, - price = when (val salePrice = salePrice) { - is NFTSalePrice.Empty -> NFTSalePriceUM.Failed - is NFTSalePrice.Loading -> NFTSalePriceUM.Loading - is NFTSalePrice.Error -> NFTSalePriceUM.Failed - is NFTSalePrice.Value -> NFTSalePriceUM.Content(salePrice.value.toString()) - }, - onItemClick = { - onAssetClick(this, collectionName) - }, - ) + private fun NFTAsset.transform(collectionName: String): NFTCollectionAssetUM { + return NFTCollectionAssetUM( + id = id.toString(), + name = name.orEmpty(), + imageUrl = media?.url, + price = when (val salePrice = salePrice) { + is NFTSalePrice.Empty -> NFTSalePriceUM.Failed + is NFTSalePrice.Loading -> NFTSalePriceUM.Loading + is NFTSalePrice.Error -> NFTSalePriceUM.Failed + is NFTSalePrice.Value -> NFTSalePriceUM.Content( + price = stringReference( + salePrice.value.format { + crypto( + symbol = salePrice.symbol, + decimals = salePrice.decimals, + ) + }, + ), + ) + }, + onItemClick = { + onAssetClick(this, collectionName) + }, + ) + } private fun NFTCollection.isExpanded(state: NFTCollectionsStateUM): Boolean = (state.content as? NFTCollectionsUM.Content) diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/ui/NFTCollectionAsset.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/ui/NFTCollectionAsset.kt index dfb100463f..87832394e4 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/ui/NFTCollectionAsset.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/ui/NFTCollectionAsset.kt @@ -24,6 +24,7 @@ import coil.request.ImageRequest import com.tangem.core.ui.components.RectangleShimmer import com.tangem.core.ui.components.SpacerH12 import com.tangem.core.ui.components.SpacerH2 +import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.nft.collections.entity.NFTCollectionAssetUM @@ -116,7 +117,9 @@ private class NFTCollectionAssetProvider : CollectionPreviewParameterProvider { Text( modifier = modifier, - text = state.price, + text = state.price.resolveReference(), style = TangemTheme.typography.caption2, color = TangemTheme.colors.text.tertiary, maxLines = 1, diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTAssetUM.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTAssetUM.kt index 88808c889c..66d1c85e54 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTAssetUM.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTAssetUM.kt @@ -3,9 +3,7 @@ package com.tangem.features.nft.details.entity import androidx.compose.runtime.Immutable import com.tangem.core.ui.components.atoms.text.TextEllipsis import com.tangem.core.ui.extensions.TextReference -import com.tangem.domain.appcurrency.model.AppCurrency import kotlinx.collections.immutable.ImmutableList -import java.math.BigDecimal data class NFTAssetUM( val name: String, @@ -41,11 +39,9 @@ data class NFTAssetUM( data object Loading : SalePrice() data object Empty : SalePrice() data class Content( - val value: BigDecimal, - val symbol: String, - val decimals: Int, - val rate: BigDecimal?, - val appCurrency: AppCurrency, + val isFlickering: Boolean, + val cryptoPrice: TextReference, + val fiatPrice: TextReference, ) : SalePrice() } diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTDetailsUM.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTDetailsUM.kt index 95844969ae..b55a4dffa3 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTDetailsUM.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/NFTDetailsUM.kt @@ -1,7 +1,10 @@ package com.tangem.features.nft.details.entity +import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig + internal data class NFTDetailsUM( val nftAsset: NFTAssetUM, + val pullToRefreshConfig: PullToRefreshConfig, val onBackClick: () -> Unit, val onReadMoreClick: () -> Unit, val onSeeAllTraitsClick: () -> Unit, diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/factory/NFTDetailsUMFactory.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/factory/NFTDetailsUMFactory.kt index e2e64fdb2b..f4701906c6 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/factory/NFTDetailsUMFactory.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/factory/NFTDetailsUMFactory.kt @@ -1,9 +1,14 @@ package com.tangem.features.nft.details.entity.factory import com.tangem.core.ui.components.atoms.text.TextEllipsis +import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.format.bigdecimal.crypto +import com.tangem.core.ui.format.bigdecimal.fiat +import com.tangem.core.ui.format.bigdecimal.format +import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.nft.models.NFTAsset import com.tangem.domain.nft.models.NFTSalePrice import com.tangem.features.nft.details.entity.NFTAssetUM @@ -12,17 +17,24 @@ import com.tangem.features.nft.impl.R import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList +@Suppress("LongParameterList") internal class NFTDetailsUMFactory( + private val appCurrency: AppCurrency, private val onBackClick: () -> Unit, private val onReadMoreClick: () -> Unit, private val onSeeAllTraitsClick: () -> Unit, private val onExploreClick: () -> Unit, private val onSendClick: () -> Unit, + private val onRefresh: () -> Unit, private val onInfoBlockClick: (title: TextReference, text: TextReference) -> Unit, ) { fun getInitialState(nftAsset: NFTAsset): NFTDetailsUM = NFTDetailsUM( nftAsset = nftAsset.transform(), + pullToRefreshConfig = PullToRefreshConfig( + isRefreshing = false, + onRefresh = { onRefresh() }, + ), onBackClick = onBackClick, onReadMoreClick = onReadMoreClick, onSeeAllTraitsClick = onSeeAllTraitsClick, @@ -52,7 +64,7 @@ internal class NFTDetailsUMFactory( } else { null }, - salePrice = NFTAssetUM.SalePrice.Empty, + salePrice = toSalePrice(), description = description, rarity = if (rarity != null) { NFTAssetUM.Rarity.Content( @@ -91,6 +103,32 @@ internal class NFTDetailsUMFactory( private fun NFTAsset.hasSalePrice() = salePrice !is NFTSalePrice.Empty && salePrice !is NFTSalePrice.Error + private fun NFTAsset.toSalePrice() = when (val price = salePrice) { + is NFTSalePrice.Empty, + is NFTSalePrice.Error, + -> NFTAssetUM.SalePrice.Empty + is NFTSalePrice.Loading -> NFTAssetUM.SalePrice.Loading + is NFTSalePrice.Value -> NFTAssetUM.SalePrice.Content( + isFlickering = false, + cryptoPrice = stringReference( + price.value.format { + crypto( + symbol = price.symbol, + decimals = price.decimals, + ) + }, + ), + fiatPrice = stringReference( + price.fiatValue.format { + fiat( + fiatCurrencyCode = appCurrency.code, + fiatCurrencySymbol = appCurrency.symbol, + ) + }, + ), + ) + } + @Suppress("LongMethod") private fun NFTAsset.buildBaseInfoItems() = when (val id = id) { is NFTAsset.Identifier.EVM -> persistentListOf( diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/transformer/NFTPriceChangeTransformer.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/transformer/NFTPriceChangeTransformer.kt new file mode 100644 index 0000000000..8ab05b6d7b --- /dev/null +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/transformer/NFTPriceChangeTransformer.kt @@ -0,0 +1,53 @@ +package com.tangem.features.nft.details.entity.transformer + +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.format.bigdecimal.crypto +import com.tangem.core.ui.format.bigdecimal.fiat +import com.tangem.core.ui.format.bigdecimal.format +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.nft.models.NFTSalePrice +import com.tangem.features.nft.details.entity.NFTAssetUM +import com.tangem.features.nft.details.entity.NFTDetailsUM +import com.tangem.utils.transformer.Transformer + +internal class NFTPriceChangeTransformer( + private val appCurrency: AppCurrency, + private val nftSalePrice: NFTSalePrice, +) : Transformer { + + override fun transform(prevState: NFTDetailsUM): NFTDetailsUM { + val topInfo = prevState.nftAsset.topInfo as? NFTAssetUM.TopInfo.Content ?: return prevState + + return prevState.copy( + nftAsset = prevState.nftAsset.copy( + topInfo = topInfo.copy( + salePrice = when (nftSalePrice) { + is NFTSalePrice.Empty, + is NFTSalePrice.Error, + -> NFTAssetUM.SalePrice.Empty + is NFTSalePrice.Loading -> NFTAssetUM.SalePrice.Loading + is NFTSalePrice.Value -> NFTAssetUM.SalePrice.Content( + isFlickering = false, + cryptoPrice = stringReference( + nftSalePrice.value.format { + crypto( + symbol = nftSalePrice.symbol, + decimals = nftSalePrice.decimals, + ) + }, + ), + fiatPrice = stringReference( + nftSalePrice.fiatValue.format { + fiat( + fiatCurrencyCode = appCurrency.code, + fiatCurrencySymbol = appCurrency.symbol, + ) + }, + ), + ) + }, + ), + ), + ) + } +} \ No newline at end of file diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/transformer/NFTPriceUpdatingTransformer.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/transformer/NFTPriceUpdatingTransformer.kt new file mode 100644 index 0000000000..c0de663d5e --- /dev/null +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/entity/transformer/NFTPriceUpdatingTransformer.kt @@ -0,0 +1,22 @@ +package com.tangem.features.nft.details.entity.transformer + +import com.tangem.features.nft.details.entity.NFTAssetUM +import com.tangem.features.nft.details.entity.NFTDetailsUM +import com.tangem.utils.transformer.Transformer + +internal object NFTPriceUpdatingTransformer : Transformer { + + override fun transform(prevState: NFTDetailsUM): NFTDetailsUM { + val topInfo = prevState.nftAsset.topInfo as? NFTAssetUM.TopInfo.Content ?: return prevState + val salePrice = topInfo.salePrice as? NFTAssetUM.SalePrice.Content + return prevState.copy( + nftAsset = prevState.nftAsset.copy( + topInfo = topInfo.copy( + salePrice = salePrice?.copy( + isFlickering = true, + ) ?: topInfo.salePrice, + ), + ), + ) + } +} \ No newline at end of file diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt index dd61ccf4f8..8cdbd19cb9 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/model/NFTDetailsModel.kt @@ -1,5 +1,6 @@ package com.tangem.features.nft.details.model +import arrow.core.getOrElse import com.arkivanov.decompose.router.slot.SlotNavigation import com.arkivanov.decompose.router.slot.activate import com.tangem.common.routing.AppRoute @@ -12,20 +13,31 @@ import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference +import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.nft.FetchNFTCollectionAssetsUseCase +import com.tangem.domain.nft.FetchNFTPriceUseCase import com.tangem.domain.nft.GetNFTExploreUrlUseCase +import com.tangem.domain.nft.GetNFTPriceUseCase import com.tangem.domain.nft.analytics.NFTAnalyticsEvent import com.tangem.features.nft.details.NFTDetailsComponent import com.tangem.features.nft.details.entity.NFTAssetUM import com.tangem.features.nft.details.entity.NFTDetailsBottomSheetConfig import com.tangem.features.nft.details.entity.NFTDetailsUM import com.tangem.features.nft.details.entity.factory.NFTDetailsUMFactory +import com.tangem.features.nft.details.entity.transformer.NFTPriceChangeTransformer +import com.tangem.features.nft.details.entity.transformer.NFTPriceUpdatingTransformer import com.tangem.features.nft.impl.R import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow +import com.tangem.utils.transformer.update +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject +@Suppress("LongParameterList") @ModelScoped internal class NFTDetailsModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, @@ -33,6 +45,10 @@ internal class NFTDetailsModel @Inject constructor( private val analyticsEventHandler: AnalyticsEventHandler, private val urlOpener: UrlOpener, private val getNFTExploreUrlUseCase: GetNFTExploreUrlUseCase, + private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase, + private val getNFTPriceUseCase: GetNFTPriceUseCase, + private val fetchNFTCollectionAssetsUseCase: FetchNFTCollectionAssetsUseCase, + private val fetchNFTPriceUseCase: FetchNFTPriceUseCase, paramsContainer: ParamsContainer, ) : Model() { @@ -40,23 +56,88 @@ internal class NFTDetailsModel @Inject constructor( val state: StateFlow get() = _state + private var appCurrency: AppCurrency = AppCurrency.Default + private val stateFactory: NFTDetailsUMFactory = NFTDetailsUMFactory( + appCurrency = appCurrency, onBackClick = { params.onBackClick() }, onReadMoreClick = ::onReadMoreClick, onSeeAllTraitsClick = { params.onAllTraitsClick() }, onExploreClick = ::onExploreClick, onSendClick = ::onSendClick, onInfoBlockClick = ::onInfoBlockClick, + onRefresh = ::onRefresh, ) - private val _state = MutableStateFlow( - value = stateFactory.getInitialState(params.nftAsset), - ) + private val _state by lazy { + MutableStateFlow( + value = stateFactory.getInitialState(params.nftAsset), + ) + } val bottomSheetNavigation: SlotNavigation = SlotNavigation() init { analyticsEventHandler.send(NFTAnalyticsEvent.Details.ScreenOpened(params.nftAsset.network.name)) + initAppCurrency() + subscribeToPriceChanges() + } + + private fun initAppCurrency() { + modelScope.launch { + appCurrency = getSelectedAppCurrencyUseCase.invokeSync().getOrElse { AppCurrency.Default } + } + } + + private fun subscribeToPriceChanges() { + _state.update(NFTPriceUpdatingTransformer) + modelScope.launch { + getNFTPriceUseCase(params.userWalletId, params.nftAsset) + .fold( + ifLeft = { + Timber.w(it) + }, + ifRight = { quoteFlow -> + quoteFlow + .distinctUntilChanged() + .onEach { salePrice -> + _state.update( + NFTPriceChangeTransformer( + appCurrency = appCurrency, + nftSalePrice = salePrice, + ), + ) + }.launchIn(modelScope) + }, + ) + } + } + + private fun onRefresh() { + _state.update { + it.copy(pullToRefreshConfig = it.pullToRefreshConfig.copy(isRefreshing = true)) + } + _state.update(NFTPriceUpdatingTransformer) + modelScope.launch { + awaitAll( + async { + fetchNFTCollectionAssetsUseCase( + userWalletId = params.userWalletId, + network = params.nftAsset.network, + collectionId = params.nftAsset.collectionId, + ) + }, + async { + fetchNFTPriceUseCase( + network = params.nftAsset.network, + appCurrencyId = null, + ) + }, + ) + _state.update { + it.copy(pullToRefreshConfig = it.pullToRefreshConfig.copy(isRefreshing = false)) + } + } } private fun onInfoBlockClick(title: TextReference, text: TextReference) { diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetails.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetails.kt index b662151b8d..203288ef78 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetails.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetails.kt @@ -1,6 +1,7 @@ package com.tangem.features.nft.details.ui import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding @@ -11,6 +12,7 @@ import androidx.compose.ui.Modifier import com.tangem.core.ui.components.PrimaryButton import com.tangem.core.ui.components.appbar.TangemTopAppBar import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM +import com.tangem.core.ui.components.containers.pullToRefresh.TangemPullToRefreshContainer import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.features.nft.details.entity.NFTDetailsUM @@ -34,14 +36,19 @@ internal fun NFTDetails(state: NFTDetailsUM, modifier: Modifier = Modifier) { ) }, content = { innerPadding -> - NFTDetailsAsset( - state = state.nftAsset, - onReadMoreClick = state.onReadMoreClick, - onSeeAllTraitsClick = state.onSeeAllTraitsClick, - onExploreClick = state.onExploreClick, + TangemPullToRefreshContainer( + config = state.pullToRefreshConfig, modifier = Modifier - .padding(innerPadding), - ) + .padding(innerPadding) + .fillMaxSize(), + ) { + NFTDetailsAsset( + state = state.nftAsset, + onReadMoreClick = state.onReadMoreClick, + onSeeAllTraitsClick = state.onSeeAllTraitsClick, + onExploreClick = state.onExploreClick, + ) + } }, floatingActionButtonPosition = FabPosition.Center, floatingActionButton = { diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsAsset.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsAsset.kt index 1f955d7860..377935d368 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsAsset.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsAsset.kt @@ -16,11 +16,9 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview -import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.features.nft.details.entity.NFTAssetUM import com.tangem.features.nft.impl.R import kotlinx.collections.immutable.persistentListOf -import java.math.BigDecimal @Composable internal fun NFTDetailsAsset( @@ -127,11 +125,9 @@ private class NFTAssetProvider : CollectionPreviewParameterProvider( topInfo = NFTAssetUM.TopInfo.Content( title = resourceReference(R.string.nft_details_last_sale_price), salePrice = NFTAssetUM.SalePrice.Content( - value = BigDecimal("18.75"), - symbol = "ETH", - decimals = 18, - rate = BigDecimal("1"), - appCurrency = AppCurrency.Default, + cryptoPrice = stringReference("ETH 18.75"), + fiatPrice = stringReference("$ 1"), + isFlickering = true, ), description = "Base edition by Piux. An illustration of Crypto Robot #7804".repeat(3), rarity = NFTAssetUM.Rarity.Content( diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsInfoGroup.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsInfoGroup.kt index bb1580e513..5eac67fcd6 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsInfoGroup.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/details/ui/NFTDetailsInfoGroup.kt @@ -1,7 +1,10 @@ package com.tangem.features.nft.details.ui import android.content.res.Configuration -import androidx.compose.animation.* +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* @@ -14,21 +17,17 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider import androidx.compose.ui.unit.dp -import com.tangem.common.ui.amountScreen.utils.getFiatString import com.tangem.core.ui.components.TextShimmer import com.tangem.core.ui.components.atoms.text.ReadMoreText import com.tangem.core.ui.components.block.information.InformationBlock +import com.tangem.core.ui.components.flicker import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference -import com.tangem.core.ui.format.bigdecimal.crypto -import com.tangem.core.ui.format.bigdecimal.format import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview -import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.features.nft.details.entity.NFTAssetUM import com.tangem.features.nft.impl.R -import java.math.BigDecimal private const val READ_MORE_MAX_LINES = 3 @@ -68,7 +67,9 @@ internal fun NFTDetailsInfoGroup( @Composable private fun SalePrice(state: NFTAssetUM.SalePrice, modifier: Modifier = Modifier) { AnimatedVisibility( - modifier = Modifier.fillMaxWidth().animateContentSize(), + modifier = Modifier + .fillMaxWidth() + .animateContentSize(), visible = state !is NFTAssetUM.SalePrice.Empty, enter = fadeIn(), exit = fadeOut(), @@ -108,19 +109,15 @@ private fun SalePrice(state: NFTAssetUM.SalePrice, modifier: Modifier = Modifier verticalArrangement = Arrangement.SpaceAround, ) { Text( - text = state.value.format { - crypto( - symbol = state.symbol, - decimals = state.decimals, - ) - }, + text = state.cryptoPrice.resolveReference(), style = TangemTheme.typography.head, color = TangemTheme.colors.text.primary1, ) Text( modifier = Modifier - .padding(top = TangemTheme.dimens.spacing4), - text = getFiatString(state.value, state.rate, state.appCurrency), + .padding(top = TangemTheme.dimens.spacing4) + .flicker(state.isFlickering), + text = state.fiatPrice.resolveReference(), style = TangemTheme.typography.caption2, color = TangemTheme.colors.text.tertiary, ) @@ -237,11 +234,9 @@ private class NFTAssetInfoProvider : CollectionPreviewParameterProvider