diff --git a/data/manage-tokens/build.gradle.kts b/data/manage-tokens/build.gradle.kts index a6acc9a452..d2ff6fbc92 100644 --- a/data/manage-tokens/build.gradle.kts +++ b/data/manage-tokens/build.gradle.kts @@ -12,6 +12,7 @@ android { dependencies { /** Project - Domain */ + implementation(projects.domain.demo) implementation(projects.domain.models) implementation(projects.domain.manageTokens) implementation(projects.domain.tokens.models) diff --git a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt index 6ac0700392..a62a1be508 100644 --- a/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt +++ b/data/manage-tokens/src/main/kotlin/com/tangem/data/managetokens/DefaultManageTokensRepository.kt @@ -5,10 +5,13 @@ import com.tangem.blockchainsdk.compatibility.l2BlockchainsCoinIds import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.blockchainsdk.utils.isSupportedInApp import com.tangem.blockchainsdk.utils.toNetworkId +import com.tangem.data.common.api.safeApiCall +import com.tangem.data.common.currency.UserTokensResponseFactory import com.tangem.data.common.currency.getBlockchain import com.tangem.data.common.utils.retryOnError import com.tangem.data.managetokens.utils.ManageTokensUpdateFetcher import com.tangem.data.managetokens.utils.ManagedCryptoCurrencyFactory +import com.tangem.data.tokens.utils.CardCryptoCurrenciesFactory import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.models.UserTokensResponse @@ -23,6 +26,7 @@ import com.tangem.domain.common.extensions.canHandleToken import com.tangem.domain.common.extensions.supportedBlockchains import com.tangem.domain.common.extensions.supportedTokens import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.demo.DemoConfig import com.tangem.domain.managetokens.model.* import com.tangem.domain.managetokens.model.ManagedCryptoCurrency.SourceNetwork import com.tangem.domain.managetokens.repository.ManageTokensRepository @@ -47,23 +51,27 @@ internal class DefaultManageTokensRepository( ) : ManageTokensRepository { private val managedCryptoCurrencyFactory = ManagedCryptoCurrencyFactory() + private val userTokensResponseFactory = UserTokensResponseFactory() + private val cardCurrenciesFactory = CardCryptoCurrenciesFactory(DemoConfig()) // region getTokenListBatchFlow override fun getTokenListBatchFlow( context: ManageTokensListBatchingContext, + loadUserTokensFromRemote: Boolean, batchSize: Int, ): ManageTokensListBatchFlow { return BatchListSource( fetchDispatcher = dispatchers.io, context = context, generateNewKey = { it.size.inc() }, - batchFetcher = createFetcher(batchSize), + batchFetcher = createFetcher(batchSize, loadUserTokensFromRemote), updateFetcher = manageTokensUpdateFetcher, ).toBatchFlow() } private fun createFetcher( batchSize: Int, + loadUserTokensFromRemote: Boolean, ): LimitOffsetBatchFetcher> = LimitOffsetBatchFetcher( prefetchDistance = batchSize, batchSize = batchSize, @@ -73,7 +81,12 @@ internal class DefaultManageTokensRepository( if (userWallet?.scanResponse?.card?.isTestCard == true) { fetchTestnetCurrencies(userWallet, request) } else { - fetchCurrencies(userWallet, request, isFirstBatchFetching) + fetchCurrencies( + userWallet = userWallet, + request = request, + isFirstBatchFetching = isFirstBatchFetching, + loadUserTokensFromRemote = loadUserTokensFromRemote, + ) } }, ) @@ -83,6 +96,7 @@ internal class DefaultManageTokensRepository( userWallet: UserWallet?, request: Request, isFirstBatchFetching: Boolean, + loadUserTokensFromRemote: Boolean, ): BatchFetchResult.Success> { val supportedBlockchains = getSupportedBlockchains(userWallet) @@ -109,7 +123,15 @@ internal class DefaultManageTokensRepository( coins = coinsResponse.coins.filterNot { l2BlockchainsCoinIds.contains(it.id) }, ) - val tokensResponse = request.params.userWalletId?.let { getSavedUserTokensResponseSync(it) } + val tokensResponse = request.params.userWalletId?.let { userWalletId -> + if (loadUserTokensFromRemote && userWallet != null) { + safeApiCall({ tangemTechApi.getUserTokens(userWalletId.stringValue).bind() }) { + createDefaultUserTokensResponse(userWallet) + } + } else { + getSavedUserTokensResponseSync(userWalletId) + } + } val items = if (isFirstBatchFetching && tokensResponse != null && userWallet != null && @@ -164,6 +186,13 @@ internal class DefaultManageTokensRepository( ) } + private fun createDefaultUserTokensResponse(userWallet: UserWallet) = + userTokensResponseFactory.createUserTokensResponse( + currencies = cardCurrenciesFactory.createDefaultCoinsForMultiCurrencyCard(userWallet.scanResponse), + isGroupedByNetwork = false, + isSortedByBalance = false, + ) + private suspend fun getUserWallet(userWalletId: UserWalletId): UserWallet { return requireNotNull(userWalletsStore.getSyncOrNull(userWalletId)) { "Unable to find a user wallet with provided ID: $userWalletId" diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt index b7dff69acb..2b7352adff 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/CardCryptoCurrenciesFactory.kt @@ -8,7 +8,7 @@ import com.tangem.domain.demo.DemoConfig import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.tokens.model.CryptoCurrency -internal class CardCryptoCurrenciesFactory(private val demoConfig: DemoConfig) { +class CardCryptoCurrenciesFactory(private val demoConfig: DemoConfig) { private val cryptoCurrencyFactory = CryptoCurrencyFactory() diff --git a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/GetManagedTokensUseCase.kt b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/GetManagedTokensUseCase.kt index b46140c043..e8a4b8d205 100644 --- a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/GetManagedTokensUseCase.kt +++ b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/GetManagedTokensUseCase.kt @@ -8,7 +8,11 @@ class GetManagedTokensUseCase( private val repository: ManageTokensRepository, ) { - operator fun invoke(context: ManageTokensListBatchingContext, batchSize: Int = 40): ManageTokensListBatchFlow { - return repository.getTokenListBatchFlow(context, batchSize) + operator fun invoke( + context: ManageTokensListBatchingContext, + loadUserTokensFromRemote: Boolean, + batchSize: Int = 40, + ): ManageTokensListBatchFlow { + return repository.getTokenListBatchFlow(context, loadUserTokensFromRemote, batchSize) } } \ No newline at end of file diff --git a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/ManageTokensRepository.kt b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/ManageTokensRepository.kt index 0d879955e8..ccf99d143a 100644 --- a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/ManageTokensRepository.kt +++ b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/repository/ManageTokensRepository.kt @@ -9,7 +9,11 @@ import com.tangem.domain.wallets.models.UserWalletId interface ManageTokensRepository { - fun getTokenListBatchFlow(context: ManageTokensListBatchingContext, batchSize: Int): ManageTokensListBatchFlow + fun getTokenListBatchFlow( + context: ManageTokensListBatchingContext, + loadUserTokensFromRemote: Boolean, + batchSize: Int, + ): ManageTokensListBatchFlow suspend fun hasLinkedTokens( userWalletId: UserWalletId, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt index 0c648acf6e..551debff20 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt @@ -89,6 +89,7 @@ internal class ManageTokensListManager @Inject constructor( actionsFlow = actionsFlow, coroutineScope = this, ), + loadUserTokensFromRemote = userWalletId != null && source == ManageTokensSource.ONBOARDING, ) batchFlow.state