From 47d119c2dabe33eaf4fcad2ec555d6a656eddf28 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 2 Feb 2026 18:48:42 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../fetcher/DefaultWalletAccountsFetcher.kt | 6 +++ .../DefaultWalletAccountsFetcherTest.kt | 42 +++++++++++++++++++ .../common/account/WalletAccountsFetcher.kt | 4 ++ data/onramp/build.gradle.kts | 1 + .../data/onramp/DefaultHotCryptoRepository.kt | 11 ++++- .../tangem/data/onramp/di/OnrampDataModule.kt | 6 +++ 6 files changed, 69 insertions(+), 1 deletion(-) diff --git a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcher.kt b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcher.kt index 68bce0a025..b75e956b6e 100644 --- a/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcher.kt +++ b/data/account/src/main/kotlin/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcher.kt @@ -24,6 +24,8 @@ import com.tangem.datasource.api.tangemTech.models.orDefault import com.tangem.datasource.utils.getSyncOrNull import com.tangem.domain.models.wallet.UserWalletId import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @@ -77,6 +79,10 @@ internal class DefaultWalletAccountsFetcher @Inject constructor( return migratedResponse } + override fun get(userWalletId: UserWalletId): Flow { + return getAccountsResponseStore(userWalletId = userWalletId).data.filterNotNull() + } + override suspend fun getSaved(userWalletId: UserWalletId): GetWalletAccountsResponse? { return getAccountsResponseStore(userWalletId = userWalletId).getSyncOrNull() } diff --git a/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt b/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt index 49586e40b0..1dfc937810 100644 --- a/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt +++ b/data/account/src/test/java/com/tangem/data/account/fetcher/DefaultWalletAccountsFetcherTest.kt @@ -20,6 +20,7 @@ import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResp import com.tangem.datasource.api.tangemTech.models.account.SaveWalletAccountsResponse import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.domain.models.wallet.UserWalletId +import com.tangem.test.core.getEmittedValues import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider import io.mockk.* import kotlinx.coroutines.flow.MutableStateFlow @@ -340,6 +341,47 @@ class DefaultWalletAccountsFetcherTest { } } + @Nested + @TestInstance(TestInstance.Lifecycle.PER_CLASS) + inner class Get { + + @Test + fun get() = runTest { + // Arrange + val response = createGetWalletAccountsResponse(userWalletId = userWalletId) + accountsResponseStoreFlow.value = response + + // Act + val actual = getEmittedValues(fetcher.get(userWalletId)) + + // Assert + val expected = response + Truth.assertThat(actual).containsExactly(expected) + + coVerifyOrder { + accountsResponseStoreFactory.create(userWalletId) + accountsResponseStore.data + } + } + + @Test + fun `get if store is empty`() = runTest { + // Arrange + accountsResponseStoreFlow.value = null + + // Act + val actual = getEmittedValues(fetcher.get(userWalletId)) + + // Assert + Truth.assertThat(actual).isEmpty() + + coVerifyOrder { + accountsResponseStoreFactory.create(userWalletId) + accountsResponseStore.data + } + } + } + @Nested @TestInstance(TestInstance.Lifecycle.PER_CLASS) inner class Store { diff --git a/data/common/src/main/kotlin/com/tangem/data/common/account/WalletAccountsFetcher.kt b/data/common/src/main/kotlin/com/tangem/data/common/account/WalletAccountsFetcher.kt index 4004ed3fcf..81d7900564 100644 --- a/data/common/src/main/kotlin/com/tangem/data/common/account/WalletAccountsFetcher.kt +++ b/data/common/src/main/kotlin/com/tangem/data/common/account/WalletAccountsFetcher.kt @@ -2,6 +2,7 @@ package com.tangem.data.common.account import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse import com.tangem.domain.models.wallet.UserWalletId +import kotlinx.coroutines.flow.Flow /** * Component for fetching wallet accounts @@ -14,6 +15,9 @@ interface WalletAccountsFetcher { @Throws suspend fun fetch(userWalletId: UserWalletId): GetWalletAccountsResponse + /** Get wallet accounts by [userWalletId] */ + fun get(userWalletId: UserWalletId): Flow + /** Get saved wallet accounts by [userWalletId] */ suspend fun getSaved(userWalletId: UserWalletId): GetWalletAccountsResponse? } \ No newline at end of file diff --git a/data/onramp/build.gradle.kts b/data/onramp/build.gradle.kts index ada7a8f3b0..bf0adddbac 100644 --- a/data/onramp/build.gradle.kts +++ b/data/onramp/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation(projects.data.common) /** Domain modules */ + implementation(projects.domain.account) implementation(projects.domain.onramp) implementation(projects.domain.legacy) implementation(projects.domain.card) diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt index b1552db7cc..5b985a43fc 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultHotCryptoRepository.kt @@ -7,16 +7,19 @@ import com.tangem.blockchainsdk.utils.OLD_POLYGON_NAME import com.tangem.blockchainsdk.utils.fromNetworkId import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.event.MainScreenAnalyticsEvent +import com.tangem.data.common.account.WalletAccountsFetcher import com.tangem.data.onramp.converters.HotCryptoCurrencyConverter import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.models.HotCryptoResponse import com.tangem.datasource.api.tangemTech.models.UserTokensResponse +import com.tangem.datasource.api.tangemTech.models.account.toUserTokensResponse import com.tangem.datasource.appcurrency.AppCurrencyResponseStore import com.tangem.datasource.exchangeservice.hotcrypto.HotCryptoResponseStore import com.tangem.datasource.local.token.UserTokensResponseStore import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles import com.tangem.domain.card.common.extensions.canHandleBlockchain import com.tangem.domain.card.common.extensions.canHandleToken import com.tangem.domain.models.wallet.UserWallet @@ -54,7 +57,9 @@ internal class DefaultHotCryptoRepository( private val userWalletsStore: UserWalletsStore, private val tangemTechApi: TangemTechApi, private val appCurrencyResponseStore: AppCurrencyResponseStore, + private val accountsFeatureToggles: AccountsFeatureToggles, private val userTokensResponseStore: UserTokensResponseStore, + private val walletAccountsFetcher: WalletAccountsFetcher, private val dispatchers: CoroutineDispatcherProvider, private val analyticsEventHandler: AnalyticsEventHandler, ) : HotCryptoRepository { @@ -100,7 +105,11 @@ internal class DefaultHotCryptoRepository( private fun getWalletsWithTokensFlow(): Flow>> { return userWalletsStore.userWallets.flatMapLatest { userWallets -> val flows = userWallets.map { userWallet -> - userTokensResponseStore.get(userWalletId = userWallet.walletId) + if (accountsFeatureToggles.isFeatureEnabled) { + walletAccountsFetcher.get(userWalletId = userWallet.walletId).map { it.toUserTokensResponse() } + } else { + userTokensResponseStore.get(userWalletId = userWallet.walletId) + } .map { userWallet to it?.tokens.orEmpty() } } diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt b/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt index 2e80138833..a4e93fec4f 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/di/OnrampDataModule.kt @@ -3,6 +3,7 @@ package com.tangem.data.onramp.di import com.squareup.moshi.Moshi import com.tangem.blockchainsdk.utils.ExcludedBlockchains import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.data.common.account.WalletAccountsFetcher import com.tangem.data.onramp.DefaultHotCryptoRepository import com.tangem.data.onramp.DefaultOnrampErrorResolver import com.tangem.data.onramp.DefaultOnrampRepository @@ -28,6 +29,7 @@ import com.tangem.datasource.local.onramp.sepa.OnrampSepaAvailabilityStore import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.token.UserTokensResponseStore import com.tangem.datasource.local.userwallet.UserWalletsStore +import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles import com.tangem.domain.onramp.repositories.* import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -109,6 +111,8 @@ internal object OnrampDataModule { dispatchers: CoroutineDispatcherProvider, analyticsEventHandler: AnalyticsEventHandler, userTokensResponseStore: UserTokensResponseStore, + accountsFeatureToggles: AccountsFeatureToggles, + walletAccountsFetcher: WalletAccountsFetcher, ): HotCryptoRepository { return DefaultHotCryptoRepository( excludedBlockchains = excludedBlockchains, @@ -119,6 +123,8 @@ internal object OnrampDataModule { dispatchers = dispatchers, analyticsEventHandler = analyticsEventHandler, userTokensResponseStore = userTokensResponseStore, + accountsFeatureToggles = accountsFeatureToggles, + walletAccountsFetcher = walletAccountsFetcher, ) }