diff --git a/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt index 0578e95316..090a030029 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt @@ -37,7 +37,7 @@ internal object NFTDomainModule { @Provides @Singleton - fun providesRefreshAllUseCase( + fun providesRefreshAllNFTUseCase( currenciesRepository: CurrenciesRepository, nftRepository: NFTRepository, ): RefreshAllNFTUseCase = RefreshAllNFTUseCase( diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/nft/DefaultNFTRuntimeStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/nft/DefaultNFTRuntimeStore.kt index cf693aab39..31a46a4a12 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/nft/DefaultNFTRuntimeStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/nft/DefaultNFTRuntimeStore.kt @@ -96,21 +96,33 @@ internal class DefaultNFTRuntimeStore( private fun NFTCollections.Content.Collections.mergeWithPrices(prices: Map) = copy( - collections = this.collections?.map { data -> - data.copy( - assets = when (val assets = data.assets) { + collections = this.collections + ?.map { data -> + val assets = when (val assets = data.assets) { is NFTCollection.Assets.Empty, is NFTCollection.Assets.Loading, is NFTCollection.Assets.Failed, -> assets is NFTCollection.Assets.Value -> assets.copy( - items = assets.items.map { asset -> - asset.mergeWithPrice(prices[asset.id] ?: NFTSalePrice.Empty(asset.id)) - }, + items = assets.items + .filter { !it.name.isNullOrEmpty() } + .sortedBy { it.name } + .map { asset -> + asset.mergeWithPrice(prices[asset.id] ?: NFTSalePrice.Empty(asset.id)) + }, ) - }, - ) - }, + } + val assetsCount = when (assets) { + is NFTCollection.Assets.Value -> assets.items.size + else -> data.count + } + data.copy( + assets = assets, + count = assetsCount, + ) + } + ?.filter { it.count > 0 } + ?.sortedBy { it.name }, source = this.source, ) diff --git a/domain/nft/src/main/kotlin/com/tangem/domain/nft/RefreshAllNFTUseCase.kt b/domain/nft/src/main/kotlin/com/tangem/domain/nft/RefreshAllNFTUseCase.kt index 2e365e88a8..b99c2c7cad 100644 --- a/domain/nft/src/main/kotlin/com/tangem/domain/nft/RefreshAllNFTUseCase.kt +++ b/domain/nft/src/main/kotlin/com/tangem/domain/nft/RefreshAllNFTUseCase.kt @@ -1,5 +1,6 @@ package com.tangem.domain.nft +import arrow.core.Either import com.tangem.domain.nft.repository.NFTRepository import com.tangem.domain.tokens.repository.CurrenciesRepository import com.tangem.domain.wallets.models.UserWalletId @@ -9,7 +10,7 @@ class RefreshAllNFTUseCase( private val nftRepository: NFTRepository, ) { - suspend operator fun invoke(userWalletId: UserWalletId) { + suspend operator fun invoke(userWalletId: UserWalletId): Either = Either.catch { val currencies = currenciesRepository.getMultiCurrencyWalletCurrenciesSync(userWalletId) nftRepository.refreshAll(userWalletId, currencies.map { it.network }.distinct()) } diff --git a/features/nft/impl/build.gradle.kts b/features/nft/impl/build.gradle.kts index df09cb6d6a..b30b854ca8 100644 --- a/features/nft/impl/build.gradle.kts +++ b/features/nft/impl/build.gradle.kts @@ -63,6 +63,7 @@ dependencies { implementation(deps.androidx.datastore) /** Other libraries */ + implementation(deps.arrow.core) implementation(deps.kotlin.immutable.collections) implementation(deps.kotlin.serialization) implementation(deps.timber) diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/ChangeCollectionExpandedStateTransformer.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/ChangeCollectionExpandedStateTransformer.kt index 867c3d2303..56ebea5c6b 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/ChangeCollectionExpandedStateTransformer.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/entity/transformer/ChangeCollectionExpandedStateTransformer.kt @@ -7,7 +7,8 @@ import com.tangem.utils.transformer.Transformer import kotlinx.collections.immutable.toPersistentList internal class ChangeCollectionExpandedStateTransformer( - private val collectionId: NFTCollection.Identifier, + private val collection: NFTCollection, + private val collectionIdProvider: NFTCollection.() -> String, private val onFirstExpanded: () -> Unit, ) : Transformer { @@ -19,7 +20,8 @@ internal class ChangeCollectionExpandedStateTransformer( -> prevState.content is NFTCollectionsUM.Content -> prevState.content.copy( collections = prevState.content.collections.map { - if (it.id == collectionId.toString()) { + val collectionId = collection.collectionIdProvider() + if (it.id == collectionId) { if (!it.isExpanded) { onFirstExpanded() } 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 bb684cf18b..a73a5aba58 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 @@ -23,6 +23,7 @@ internal class UpdateDataStateTransformer( private val onRetryAssetsClick: (NFTCollection) -> Unit, private val onAssetClick: (NFTAsset, String) -> Unit, private val initialSearchBarFactory: () -> SearchBarUM, + private val collectionIdProvider: NFTCollection.() -> String, ) : Transformer { override fun transform(prevState: NFTCollectionsStateUM): NFTCollectionsStateUM { @@ -47,9 +48,7 @@ internal class UpdateDataStateTransformer( else -> { NFTCollectionsUM.Content( search = if (prevState.content is NFTCollectionsUM.Content) { - prevState.content.search.copy( - query = searchQuery, - ) + prevState.content.search } else { initialSearchBarFactory() }, @@ -100,7 +99,7 @@ internal class UpdateDataStateTransformer( if (collectionFulfillQuery || assetsFulfillQuery) { NFTCollectionUM( - id = it.id.toString(), + id = it.collectionIdProvider(), networkIconId = getActiveIconRes(it.network.id.value), name = it.name, description = TextReference.PluralRes( @@ -165,7 +164,7 @@ internal class UpdateDataStateTransformer( private fun NFTCollection.isExpanded(state: NFTCollectionsStateUM): Boolean = (state.content as? NFTCollectionsUM.Content) ?.collections - ?.firstOrNull { it.id == id.toString() } + ?.firstOrNull { it.id == this.collectionIdProvider() } ?.isExpanded ?: false } \ No newline at end of file diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt index c35c9fc81f..72b200907a 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/collections/model/NFTCollectionsModel.kt @@ -23,6 +23,7 @@ import com.tangem.features.nft.impl.R import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @Suppress("LongParameterList") @@ -57,9 +58,12 @@ internal class NFTCollectionsModel @Inject constructor( ), ), ) - val state: StateFlow get() = _state + private val collectionIdProvider: NFTCollection.() -> String = { + "${network.name}_${network.derivationPath.value}_$id" + } + init { subscribeToNFTCollections() } @@ -83,6 +87,7 @@ internal class NFTCollectionsModel @Inject constructor( params.onAssetClick(asset, collectionName) }, initialSearchBarFactory = ::getInitialSearchBar, + collectionIdProvider = collectionIdProvider, ).transform(it) } } @@ -95,6 +100,7 @@ internal class NFTCollectionsModel @Inject constructor( _state.update { ChangeRefreshingStateTransformer(true).transform(it) } try { refreshAllNFTUseCase(params.userWalletId) + .onLeft { Timber.e(it) } } finally { _state.update { ChangeRefreshingStateTransformer(false).transform(it) } } @@ -126,7 +132,8 @@ internal class NFTCollectionsModel @Inject constructor( private fun onExpandCollectionClick(collection: NFTCollection) { _state.update { ChangeCollectionExpandedStateTransformer( - collectionId = collection.id, + collection = collection, + collectionIdProvider = collectionIdProvider, onFirstExpanded = { onFirstExpanded(collection) }, ).transform(it) }