Updated on 2026-08-14
This commit is contained in:
parent
784161880d
commit
3d214007f4
14 changed files with 161 additions and 30 deletions
|
|
@ -7,6 +7,7 @@ import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||||
import com.tangem.domain.networks.single.SingleNetworkStatusFetcher
|
import com.tangem.domain.networks.single.SingleNetworkStatusFetcher
|
||||||
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
|
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
|
||||||
import com.tangem.domain.promo.PromoRepository
|
import com.tangem.domain.promo.PromoRepository
|
||||||
|
import com.tangem.domain.quotes.QuotesRepositoryV2
|
||||||
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
|
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
|
||||||
import com.tangem.domain.quotes.single.SingleQuoteSupplier
|
import com.tangem.domain.quotes.single.SingleQuoteSupplier
|
||||||
import com.tangem.domain.staking.repositories.StakingRepository
|
import com.tangem.domain.staking.repositories.StakingRepository
|
||||||
|
|
@ -59,6 +60,7 @@ internal object TokensDomainModule {
|
||||||
networksRepository: NetworksRepository,
|
networksRepository: NetworksRepository,
|
||||||
stakingRepository: StakingRepository,
|
stakingRepository: StakingRepository,
|
||||||
multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
||||||
|
multiQuoteFetcher: MultiQuoteFetcher,
|
||||||
tokensFeatureToggles: TokensFeatureToggles,
|
tokensFeatureToggles: TokensFeatureToggles,
|
||||||
): FetchTokenListUseCase {
|
): FetchTokenListUseCase {
|
||||||
return FetchTokenListUseCase(
|
return FetchTokenListUseCase(
|
||||||
|
|
@ -67,6 +69,7 @@ internal object TokensDomainModule {
|
||||||
quotesRepository = quotesRepository,
|
quotesRepository = quotesRepository,
|
||||||
stakingRepository = stakingRepository,
|
stakingRepository = stakingRepository,
|
||||||
multiNetworkStatusFetcher = multiNetworkStatusFetcher,
|
multiNetworkStatusFetcher = multiNetworkStatusFetcher,
|
||||||
|
multiQuoteFetcher = multiQuoteFetcher,
|
||||||
tokensFeatureToggles = tokensFeatureToggles,
|
tokensFeatureToggles = tokensFeatureToggles,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -172,6 +175,7 @@ internal object TokensDomainModule {
|
||||||
networksRepository: NetworksRepository,
|
networksRepository: NetworksRepository,
|
||||||
stakingRepository: StakingRepository,
|
stakingRepository: StakingRepository,
|
||||||
singleNetworkStatusFetcher: SingleNetworkStatusFetcher,
|
singleNetworkStatusFetcher: SingleNetworkStatusFetcher,
|
||||||
|
multiQuoteFetcher: MultiQuoteFetcher,
|
||||||
tokensFeatureToggles: TokensFeatureToggles,
|
tokensFeatureToggles: TokensFeatureToggles,
|
||||||
): FetchCurrencyStatusUseCase {
|
): FetchCurrencyStatusUseCase {
|
||||||
return FetchCurrencyStatusUseCase(
|
return FetchCurrencyStatusUseCase(
|
||||||
|
|
@ -180,6 +184,7 @@ internal object TokensDomainModule {
|
||||||
quotesRepository = quotesRepository,
|
quotesRepository = quotesRepository,
|
||||||
stakingRepository = stakingRepository,
|
stakingRepository = stakingRepository,
|
||||||
singleNetworkStatusFetcher = singleNetworkStatusFetcher,
|
singleNetworkStatusFetcher = singleNetworkStatusFetcher,
|
||||||
|
multiQuoteFetcher = multiQuoteFetcher,
|
||||||
tokensFeatureToggles = tokensFeatureToggles,
|
tokensFeatureToggles = tokensFeatureToggles,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -192,6 +197,7 @@ internal object TokensDomainModule {
|
||||||
networksRepository: NetworksRepository,
|
networksRepository: NetworksRepository,
|
||||||
stakingRepository: StakingRepository,
|
stakingRepository: StakingRepository,
|
||||||
multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
||||||
|
multiQuoteFetcher: MultiQuoteFetcher,
|
||||||
tokensFeatureToggles: TokensFeatureToggles,
|
tokensFeatureToggles: TokensFeatureToggles,
|
||||||
): FetchCardTokenListUseCase {
|
): FetchCardTokenListUseCase {
|
||||||
return FetchCardTokenListUseCase(
|
return FetchCardTokenListUseCase(
|
||||||
|
|
@ -200,6 +206,7 @@ internal object TokensDomainModule {
|
||||||
quotesRepository = quotesRepository,
|
quotesRepository = quotesRepository,
|
||||||
stakingRepository = stakingRepository,
|
stakingRepository = stakingRepository,
|
||||||
multiNetworkStatusFetcher = multiNetworkStatusFetcher,
|
multiNetworkStatusFetcher = multiNetworkStatusFetcher,
|
||||||
|
multiQuoteFetcher = multiQuoteFetcher,
|
||||||
tokensFeatureToggles = tokensFeatureToggles,
|
tokensFeatureToggles = tokensFeatureToggles,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -394,6 +401,7 @@ internal object TokensDomainModule {
|
||||||
tokensFeatureToggles: TokensFeatureToggles,
|
tokensFeatureToggles: TokensFeatureToggles,
|
||||||
currenciesRepository: CurrenciesRepository,
|
currenciesRepository: CurrenciesRepository,
|
||||||
quotesRepository: QuotesRepository,
|
quotesRepository: QuotesRepository,
|
||||||
|
quotesRepositoryV2: QuotesRepositoryV2,
|
||||||
networksRepository: NetworksRepository,
|
networksRepository: NetworksRepository,
|
||||||
stakingRepository: StakingRepository,
|
stakingRepository: StakingRepository,
|
||||||
singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
|
singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
|
||||||
|
|
@ -405,6 +413,7 @@ internal object TokensDomainModule {
|
||||||
return CachedCurrenciesStatusesOperations(
|
return CachedCurrenciesStatusesOperations(
|
||||||
currenciesRepository = currenciesRepository,
|
currenciesRepository = currenciesRepository,
|
||||||
quotesRepository = quotesRepository,
|
quotesRepository = quotesRepository,
|
||||||
|
quotesRepositoryV2 = quotesRepositoryV2,
|
||||||
networksRepository = networksRepository,
|
networksRepository = networksRepository,
|
||||||
stakingRepository = stakingRepository,
|
stakingRepository = stakingRepository,
|
||||||
singleNetworkStatusSupplier = singleNetworkStatusSupplier,
|
singleNetworkStatusSupplier = singleNetworkStatusSupplier,
|
||||||
|
|
@ -422,6 +431,7 @@ internal object TokensDomainModule {
|
||||||
tokensFeatureToggles: TokensFeatureToggles,
|
tokensFeatureToggles: TokensFeatureToggles,
|
||||||
currenciesRepository: CurrenciesRepository,
|
currenciesRepository: CurrenciesRepository,
|
||||||
quotesRepository: QuotesRepository,
|
quotesRepository: QuotesRepository,
|
||||||
|
quotesRepositoryV2: QuotesRepositoryV2,
|
||||||
networksRepository: NetworksRepository,
|
networksRepository: NetworksRepository,
|
||||||
stakingRepository: StakingRepository,
|
stakingRepository: StakingRepository,
|
||||||
singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
|
singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
|
||||||
|
|
@ -433,6 +443,7 @@ internal object TokensDomainModule {
|
||||||
return CachedCurrenciesStatusesOperations(
|
return CachedCurrenciesStatusesOperations(
|
||||||
currenciesRepository = currenciesRepository,
|
currenciesRepository = currenciesRepository,
|
||||||
quotesRepository = quotesRepository,
|
quotesRepository = quotesRepository,
|
||||||
|
quotesRepositoryV2 = quotesRepositoryV2,
|
||||||
networksRepository = networksRepository,
|
networksRepository = networksRepository,
|
||||||
stakingRepository = stakingRepository,
|
stakingRepository = stakingRepository,
|
||||||
singleNetworkStatusSupplier = singleNetworkStatusSupplier,
|
singleNetworkStatusSupplier = singleNetworkStatusSupplier,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.tangem.data.quotes
|
||||||
|
|
||||||
|
import com.tangem.data.quotes.store.QuotesStoreV2
|
||||||
|
import com.tangem.domain.quotes.QuotesRepositoryV2
|
||||||
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
|
import com.tangem.domain.tokens.model.Quote
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of [QuotesRepositoryV2]
|
||||||
|
*
|
||||||
|
* @property quotesStore quotes store
|
||||||
|
*
|
||||||
|
[REDACTED_AUTHOR]
|
||||||
|
*/
|
||||||
|
internal class DefaultQuotesRepositoryV2 @Inject constructor(
|
||||||
|
private val quotesStore: QuotesStoreV2,
|
||||||
|
) : QuotesRepositoryV2 {
|
||||||
|
|
||||||
|
override suspend fun getMultiQuoteSyncOrNull(currenciesIds: Set<CryptoCurrency.RawID>): Set<Quote>? {
|
||||||
|
return quotesStore.getAllSyncOrNull()?.mapTo(hashSetOf()) {
|
||||||
|
it.takeIf { it.rawCurrencyId in currenciesIds } ?: Quote.Empty(it.rawCurrencyId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.tangem.data.quotes.di
|
||||||
|
|
||||||
|
import com.tangem.data.quotes.DefaultQuotesRepositoryV2
|
||||||
|
import com.tangem.domain.quotes.QuotesRepositoryV2
|
||||||
|
import dagger.Binds
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.hilt.InstallIn
|
||||||
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
internal interface QuotesDataModule {
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
@Singleton
|
||||||
|
fun bindQuotesRepositoryV2(impl: DefaultQuotesRepositoryV2): QuotesRepositoryV2
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.tangem.domain.quotes
|
||||||
|
|
||||||
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
|
import com.tangem.domain.tokens.model.Quote
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quotes repository
|
||||||
|
*
|
||||||
|
[REDACTED_AUTHOR]
|
||||||
|
*/
|
||||||
|
interface QuotesRepositoryV2 {
|
||||||
|
|
||||||
|
/** Get quotes by [currenciesIds] synchronously or null */
|
||||||
|
suspend fun getMultiQuoteSyncOrNull(currenciesIds: Set<CryptoCurrency.RawID>): Set<Quote>?
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ import arrow.core.raise.Raise
|
||||||
import arrow.core.raise.catch
|
import arrow.core.raise.catch
|
||||||
import arrow.core.raise.either
|
import arrow.core.raise.either
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
|
import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
|
||||||
|
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
|
||||||
import com.tangem.domain.staking.repositories.StakingRepository
|
import com.tangem.domain.staking.repositories.StakingRepository
|
||||||
import com.tangem.domain.tokens.error.TokenListError
|
import com.tangem.domain.tokens.error.TokenListError
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
|
|
@ -17,12 +18,14 @@ import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.awaitAll
|
import kotlinx.coroutines.awaitAll
|
||||||
import kotlinx.coroutines.coroutineScope
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
|
||||||
|
@Suppress("LongParameterList")
|
||||||
class FetchCardTokenListUseCase(
|
class FetchCardTokenListUseCase(
|
||||||
private val currenciesRepository: CurrenciesRepository,
|
private val currenciesRepository: CurrenciesRepository,
|
||||||
private val networksRepository: NetworksRepository,
|
private val networksRepository: NetworksRepository,
|
||||||
private val quotesRepository: QuotesRepository,
|
private val quotesRepository: QuotesRepository,
|
||||||
private val stakingRepository: StakingRepository,
|
private val stakingRepository: StakingRepository,
|
||||||
private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
||||||
|
private val multiQuoteFetcher: MultiQuoteFetcher,
|
||||||
private val tokensFeatureToggles: TokensFeatureToggles,
|
private val tokensFeatureToggles: TokensFeatureToggles,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
@ -90,10 +93,16 @@ class FetchCardTokenListUseCase(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.RawID>, refresh: Boolean) {
|
private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.RawID>, refresh: Boolean) {
|
||||||
catch(
|
if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
|
||||||
block = { quotesRepository.getQuotesSync(currenciesIds, refresh) },
|
multiQuoteFetcher(
|
||||||
catch = { /* Ignore error */ },
|
params = MultiQuoteFetcher.Params(currenciesIds = currenciesIds, appCurrencyId = null),
|
||||||
)
|
)
|
||||||
|
} else {
|
||||||
|
catch(
|
||||||
|
block = { quotesRepository.getQuotesSync(currenciesIds, refresh) },
|
||||||
|
catch = { /* Ignore error */ },
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun fetchYieldBalances(
|
private suspend fun fetchYieldBalances(
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import arrow.core.raise.Raise
|
||||||
import arrow.core.raise.catch
|
import arrow.core.raise.catch
|
||||||
import arrow.core.raise.either
|
import arrow.core.raise.either
|
||||||
import com.tangem.domain.networks.single.SingleNetworkStatusFetcher
|
import com.tangem.domain.networks.single.SingleNetworkStatusFetcher
|
||||||
|
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
|
||||||
import com.tangem.domain.staking.repositories.StakingRepository
|
import com.tangem.domain.staking.repositories.StakingRepository
|
||||||
import com.tangem.domain.tokens.error.CurrencyStatusError
|
import com.tangem.domain.tokens.error.CurrencyStatusError
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
|
|
@ -27,12 +28,14 @@ import kotlinx.coroutines.coroutineScope
|
||||||
* @param quotesRepository The repository for retrieving cryptocurrency quotes.
|
* @param quotesRepository The repository for retrieving cryptocurrency quotes.
|
||||||
*/
|
*/
|
||||||
// TODO: Add tests
|
// TODO: Add tests
|
||||||
|
@Suppress("LongParameterList")
|
||||||
class FetchCurrencyStatusUseCase(
|
class FetchCurrencyStatusUseCase(
|
||||||
private val currenciesRepository: CurrenciesRepository,
|
private val currenciesRepository: CurrenciesRepository,
|
||||||
private val networksRepository: NetworksRepository,
|
private val networksRepository: NetworksRepository,
|
||||||
private val quotesRepository: QuotesRepository,
|
private val quotesRepository: QuotesRepository,
|
||||||
private val stakingRepository: StakingRepository,
|
private val stakingRepository: StakingRepository,
|
||||||
private val singleNetworkStatusFetcher: SingleNetworkStatusFetcher,
|
private val singleNetworkStatusFetcher: SingleNetworkStatusFetcher,
|
||||||
|
private val multiQuoteFetcher: MultiQuoteFetcher,
|
||||||
private val tokensFeatureToggles: TokensFeatureToggles,
|
private val tokensFeatureToggles: TokensFeatureToggles,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
@ -134,10 +137,19 @@ class FetchCurrencyStatusUseCase(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun Raise<CurrencyStatusError>.fetchQuote(currencyId: CryptoCurrency.ID, refresh: Boolean) {
|
private suspend fun Raise<CurrencyStatusError>.fetchQuote(currencyId: CryptoCurrency.ID, refresh: Boolean) {
|
||||||
catch(
|
if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
|
||||||
block = { quotesRepository.getQuotesSync(setOfNotNull(currencyId.rawCurrencyId), refresh) },
|
multiQuoteFetcher(
|
||||||
) {
|
params = MultiQuoteFetcher.Params(
|
||||||
raise(CurrencyStatusError.DataError(it))
|
currenciesIds = setOfNotNull(currencyId.rawCurrencyId),
|
||||||
|
appCurrencyId = null,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
catch(
|
||||||
|
block = { quotesRepository.getQuotesSync(setOfNotNull(currencyId.rawCurrencyId), refresh) },
|
||||||
|
) {
|
||||||
|
raise(CurrencyStatusError.DataError(it))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import arrow.core.raise.either
|
||||||
import arrow.core.raise.ensureNotNull
|
import arrow.core.raise.ensureNotNull
|
||||||
import arrow.core.toNonEmptyListOrNull
|
import arrow.core.toNonEmptyListOrNull
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
|
import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
|
||||||
|
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
|
||||||
import com.tangem.domain.staking.repositories.StakingRepository
|
import com.tangem.domain.staking.repositories.StakingRepository
|
||||||
import com.tangem.domain.tokens.error.TokenListError
|
import com.tangem.domain.tokens.error.TokenListError
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
|
|
@ -29,12 +30,14 @@ import kotlinx.coroutines.coroutineScope
|
||||||
* @param stakingRepository The repository for retrieving staking-related data.
|
* @param stakingRepository The repository for retrieving staking-related data.
|
||||||
*/
|
*/
|
||||||
// TODO: Add tests
|
// TODO: Add tests
|
||||||
|
@Suppress("LongParameterList")
|
||||||
class FetchTokenListUseCase(
|
class FetchTokenListUseCase(
|
||||||
private val currenciesRepository: CurrenciesRepository,
|
private val currenciesRepository: CurrenciesRepository,
|
||||||
private val networksRepository: NetworksRepository,
|
private val networksRepository: NetworksRepository,
|
||||||
private val quotesRepository: QuotesRepository,
|
private val quotesRepository: QuotesRepository,
|
||||||
private val stakingRepository: StakingRepository,
|
private val stakingRepository: StakingRepository,
|
||||||
private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher,
|
||||||
|
private val multiQuoteFetcher: MultiQuoteFetcher,
|
||||||
private val tokensFeatureToggles: TokensFeatureToggles,
|
private val tokensFeatureToggles: TokensFeatureToggles,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
|
@ -125,13 +128,22 @@ class FetchTokenListUseCase(
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.ID>, refresh: Boolean) {
|
private suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.ID>, refresh: Boolean) {
|
||||||
catch(
|
if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
|
||||||
block = {
|
multiQuoteFetcher(
|
||||||
val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet()
|
params = MultiQuoteFetcher.Params(
|
||||||
quotesRepository.getQuotesSync(rawIds, refresh)
|
currenciesIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet(),
|
||||||
},
|
appCurrencyId = null,
|
||||||
) {
|
),
|
||||||
/* Ignore error */
|
)
|
||||||
|
} else {
|
||||||
|
catch(
|
||||||
|
block = {
|
||||||
|
val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet()
|
||||||
|
quotesRepository.getQuotesSync(rawIds, refresh)
|
||||||
|
},
|
||||||
|
) {
|
||||||
|
/* Ignore error */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import com.tangem.domain.networks.multi.MultiNetworkStatusProducer
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||||
import com.tangem.domain.networks.single.SingleNetworkStatusProducer
|
import com.tangem.domain.networks.single.SingleNetworkStatusProducer
|
||||||
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
|
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
|
||||||
|
import com.tangem.domain.quotes.QuotesRepositoryV2
|
||||||
import com.tangem.domain.quotes.single.SingleQuoteProducer
|
import com.tangem.domain.quotes.single.SingleQuoteProducer
|
||||||
import com.tangem.domain.quotes.single.SingleQuoteSupplier
|
import com.tangem.domain.quotes.single.SingleQuoteSupplier
|
||||||
import com.tangem.domain.staking.model.stakekit.YieldBalance
|
import com.tangem.domain.staking.model.stakekit.YieldBalance
|
||||||
|
|
@ -39,6 +40,7 @@ import kotlinx.coroutines.flow.*
|
||||||
abstract class BaseCurrencyStatusOperations(
|
abstract class BaseCurrencyStatusOperations(
|
||||||
private val currenciesRepository: CurrenciesRepository,
|
private val currenciesRepository: CurrenciesRepository,
|
||||||
private val quotesRepository: QuotesRepository,
|
private val quotesRepository: QuotesRepository,
|
||||||
|
private val quotesRepositoryV2: QuotesRepositoryV2,
|
||||||
private val networksRepository: NetworksRepository,
|
private val networksRepository: NetworksRepository,
|
||||||
private val stakingRepository: StakingRepository,
|
private val stakingRepository: StakingRepository,
|
||||||
private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
|
private val multiNetworkStatusSupplier: MultiNetworkStatusSupplier,
|
||||||
|
|
@ -249,7 +251,12 @@ abstract class BaseCurrencyStatusOperations(
|
||||||
?: return emptyList<CryptoCurrencyStatus>().right()
|
?: return emptyList<CryptoCurrencyStatus>().right()
|
||||||
val (networks, currenciesIds) = getIds(nonEmptyCurrencies)
|
val (networks, currenciesIds) = getIds(nonEmptyCurrencies)
|
||||||
val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet()
|
val rawIds = currenciesIds.mapNotNull { it.rawCurrencyId }.toSet()
|
||||||
val quotes = quotesRepository.getQuotesSync(rawIds, false).right()
|
|
||||||
|
val quotes = if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
|
||||||
|
quotesRepositoryV2.getMultiQuoteSyncOrNull(currenciesIds = rawIds)?.right()
|
||||||
|
} else {
|
||||||
|
quotesRepository.getQuotesSync(rawIds, false).right()
|
||||||
|
}
|
||||||
|
|
||||||
val networkStatuses = if (tokensFeatureToggles.isNetworksLoadingRefactoringEnabled) {
|
val networkStatuses = if (tokensFeatureToggles.isNetworksLoadingRefactoringEnabled) {
|
||||||
multiNetworkStatusSupplier(
|
multiNetworkStatusSupplier(
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher
|
||||||
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
import com.tangem.domain.networks.multi.MultiNetworkStatusSupplier
|
||||||
import com.tangem.domain.networks.single.SingleNetworkStatusProducer
|
import com.tangem.domain.networks.single.SingleNetworkStatusProducer
|
||||||
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
|
import com.tangem.domain.networks.single.SingleNetworkStatusSupplier
|
||||||
|
import com.tangem.domain.quotes.QuotesRepositoryV2
|
||||||
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
|
import com.tangem.domain.quotes.multi.MultiQuoteFetcher
|
||||||
import com.tangem.domain.quotes.single.SingleQuoteProducer
|
import com.tangem.domain.quotes.single.SingleQuoteProducer
|
||||||
import com.tangem.domain.quotes.single.SingleQuoteSupplier
|
import com.tangem.domain.quotes.single.SingleQuoteSupplier
|
||||||
|
|
@ -37,6 +38,7 @@ import kotlinx.coroutines.flow.*
|
||||||
class CachedCurrenciesStatusesOperations(
|
class CachedCurrenciesStatusesOperations(
|
||||||
private val currenciesRepository: CurrenciesRepository,
|
private val currenciesRepository: CurrenciesRepository,
|
||||||
private val quotesRepository: QuotesRepository,
|
private val quotesRepository: QuotesRepository,
|
||||||
|
quotesRepositoryV2: QuotesRepositoryV2,
|
||||||
private val networksRepository: NetworksRepository,
|
private val networksRepository: NetworksRepository,
|
||||||
private val stakingRepository: StakingRepository,
|
private val stakingRepository: StakingRepository,
|
||||||
private val singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
|
private val singleNetworkStatusSupplier: SingleNetworkStatusSupplier,
|
||||||
|
|
@ -49,6 +51,7 @@ class CachedCurrenciesStatusesOperations(
|
||||||
BaseCurrencyStatusOperations(
|
BaseCurrencyStatusOperations(
|
||||||
currenciesRepository = currenciesRepository,
|
currenciesRepository = currenciesRepository,
|
||||||
quotesRepository = quotesRepository,
|
quotesRepository = quotesRepository,
|
||||||
|
quotesRepositoryV2 = quotesRepositoryV2,
|
||||||
networksRepository = networksRepository,
|
networksRepository = networksRepository,
|
||||||
stakingRepository = stakingRepository,
|
stakingRepository = stakingRepository,
|
||||||
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
multiNetworkStatusSupplier = multiNetworkStatusSupplier,
|
||||||
|
|
|
||||||
|
|
@ -188,6 +188,7 @@ internal class GetPrimaryCurrencyStatusUpdatesUseCaseTest {
|
||||||
multiNetworkStatusSupplier = mockk(),
|
multiNetworkStatusSupplier = mockk(),
|
||||||
multiQuoteFetcher = mockk(),
|
multiQuoteFetcher = mockk(),
|
||||||
singleQuoteSupplier = mockk(),
|
singleQuoteSupplier = mockk(),
|
||||||
|
quotesRepositoryV2 = mockk(),
|
||||||
),
|
),
|
||||||
dispatchers = dispatchers,
|
dispatchers = dispatchers,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
import com.tangem.plugin.configuration.configurations.extension.kaptForObfuscatingVariants
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(deps.plugins.android.library)
|
alias(deps.plugins.android.library)
|
||||||
alias(deps.plugins.kotlin.android)
|
alias(deps.plugins.kotlin.android)
|
||||||
|
|
@ -23,22 +21,24 @@ dependencies {
|
||||||
|
|
||||||
/** Domain */
|
/** Domain */
|
||||||
implementation(projects.domain.appCurrency)
|
implementation(projects.domain.appCurrency)
|
||||||
|
implementation(projects.domain.appCurrency.models)
|
||||||
|
implementation(projects.domain.card)
|
||||||
|
implementation(projects.domain.demo)
|
||||||
|
implementation(projects.domain.legacy)
|
||||||
implementation(projects.domain.models)
|
implementation(projects.domain.models)
|
||||||
|
implementation(projects.domain.quotes)
|
||||||
|
implementation(projects.domain.staking)
|
||||||
implementation(projects.domain.tokens)
|
implementation(projects.domain.tokens)
|
||||||
implementation(projects.domain.tokens.models)
|
implementation(projects.domain.tokens.models)
|
||||||
|
implementation(projects.domain.transaction)
|
||||||
|
implementation(projects.domain.transaction.models)
|
||||||
|
implementation(projects.domain.txhistory.models)
|
||||||
implementation(projects.domain.wallets)
|
implementation(projects.domain.wallets)
|
||||||
implementation(projects.domain.wallets.models)
|
implementation(projects.domain.wallets.models)
|
||||||
implementation(projects.domain.transaction)
|
|
||||||
implementation(projects.domain.legacy)
|
|
||||||
implementation(projects.libs.blockchainSdk)
|
|
||||||
implementation(projects.domain.demo)
|
|
||||||
implementation(projects.domain.card)
|
|
||||||
implementation(projects.domain.appCurrency.models)
|
|
||||||
implementation(projects.domain.txhistory.models)
|
|
||||||
implementation(projects.domain.transaction.models)
|
|
||||||
implementation(projects.features.swap.domain.api)
|
implementation(projects.features.swap.domain.api)
|
||||||
implementation(projects.features.swap.domain.models)
|
implementation(projects.features.swap.domain.models)
|
||||||
implementation(projects.domain.staking)
|
implementation(projects.libs.blockchainSdk)
|
||||||
|
|
||||||
/** Core modules */
|
/** Core modules */
|
||||||
implementation(projects.core.utils)
|
implementation(projects.core.utils)
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,10 @@ import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
|
||||||
import com.tangem.domain.appcurrency.extenstions.unwrap
|
import com.tangem.domain.appcurrency.extenstions.unwrap
|
||||||
import com.tangem.domain.appcurrency.repository.AppCurrencyRepository
|
import com.tangem.domain.appcurrency.repository.AppCurrencyRepository
|
||||||
import com.tangem.domain.demo.IsDemoCardUseCase
|
import com.tangem.domain.demo.IsDemoCardUseCase
|
||||||
|
import com.tangem.domain.quotes.QuotesRepositoryV2
|
||||||
import com.tangem.domain.tokens.GetCryptoCurrencyStatusesSyncUseCase
|
import com.tangem.domain.tokens.GetCryptoCurrencyStatusesSyncUseCase
|
||||||
import com.tangem.domain.tokens.GetCurrencyCheckUseCase
|
import com.tangem.domain.tokens.GetCurrencyCheckUseCase
|
||||||
|
import com.tangem.domain.tokens.TokensFeatureToggles
|
||||||
import com.tangem.domain.tokens.model.*
|
import com.tangem.domain.tokens.model.*
|
||||||
import com.tangem.domain.tokens.model.warnings.CryptoCurrencyCheck
|
import com.tangem.domain.tokens.model.warnings.CryptoCurrencyCheck
|
||||||
import com.tangem.domain.tokens.repository.CurrenciesRepository
|
import com.tangem.domain.tokens.repository.CurrenciesRepository
|
||||||
|
|
@ -62,6 +64,8 @@ internal class SwapInteractorImpl @AssistedInject constructor(
|
||||||
private val createTransactionExtrasUseCase: CreateTransactionDataExtrasUseCase,
|
private val createTransactionExtrasUseCase: CreateTransactionDataExtrasUseCase,
|
||||||
private val isDemoCardUseCase: IsDemoCardUseCase,
|
private val isDemoCardUseCase: IsDemoCardUseCase,
|
||||||
private val quotesRepository: QuotesRepository,
|
private val quotesRepository: QuotesRepository,
|
||||||
|
private val quotesRepositoryV2: QuotesRepositoryV2,
|
||||||
|
private val tokensFeatureToggles: TokensFeatureToggles,
|
||||||
private val swapTransactionRepository: SwapTransactionRepository,
|
private val swapTransactionRepository: SwapTransactionRepository,
|
||||||
private val currencyChecksRepository: CurrencyChecksRepository,
|
private val currencyChecksRepository: CurrencyChecksRepository,
|
||||||
private val appCurrencyRepository: AppCurrencyRepository,
|
private val appCurrencyRepository: AppCurrencyRepository,
|
||||||
|
|
@ -2166,7 +2170,11 @@ internal class SwapInteractorImpl @AssistedInject constructor(
|
||||||
|
|
||||||
private suspend fun Set<CryptoCurrency.RawID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> {
|
private suspend fun Set<CryptoCurrency.RawID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> {
|
||||||
return try {
|
return try {
|
||||||
quotesRepository.getQuotesSync(this, refresh)
|
if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
|
||||||
|
quotesRepositoryV2.getMultiQuoteSyncOrNull(currenciesIds = this).orEmpty()
|
||||||
|
} else {
|
||||||
|
quotesRepository.getQuotesSync(this, refresh)
|
||||||
|
}
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
emptySet()
|
emptySet()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,7 @@ dependencies {
|
||||||
implementation(projects.domain.onramp.models)
|
implementation(projects.domain.onramp.models)
|
||||||
implementation(projects.domain.promo)
|
implementation(projects.domain.promo)
|
||||||
implementation(projects.domain.promo.models)
|
implementation(projects.domain.promo.models)
|
||||||
|
implementation(projects.domain.quotes)
|
||||||
|
|
||||||
/** Temp dependency to swap domain */
|
/** Temp dependency to swap domain */
|
||||||
implementation(projects.features.swap.domain)
|
implementation(projects.features.swap.domain)
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,9 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.datasource.local.swaptx.ExpressAnalyticsStatus
|
import com.tangem.datasource.local.swaptx.ExpressAnalyticsStatus
|
||||||
import com.tangem.datasource.local.swaptx.SwapTransactionStatusStore
|
import com.tangem.datasource.local.swaptx.SwapTransactionStatusStore
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
|
import com.tangem.domain.quotes.QuotesRepositoryV2
|
||||||
import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase
|
import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase
|
||||||
|
import com.tangem.domain.tokens.TokensFeatureToggles
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
import com.tangem.domain.tokens.model.Quote
|
import com.tangem.domain.tokens.model.Quote
|
||||||
import com.tangem.domain.tokens.model.analytics.TokenExchangeAnalyticsEvent
|
import com.tangem.domain.tokens.model.analytics.TokenExchangeAnalyticsEvent
|
||||||
|
|
@ -15,10 +17,10 @@ import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
|
||||||
import com.tangem.feature.swap.domain.SwapTransactionRepository
|
import com.tangem.feature.swap.domain.SwapTransactionRepository
|
||||||
import com.tangem.feature.swap.domain.api.SwapRepository
|
import com.tangem.feature.swap.domain.api.SwapRepository
|
||||||
import com.tangem.feature.swap.domain.models.domain.*
|
import com.tangem.feature.swap.domain.models.domain.*
|
||||||
|
import com.tangem.feature.tokendetails.presentation.tokendetails.model.TokenDetailsClickIntents
|
||||||
import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsState
|
import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsState
|
||||||
import com.tangem.feature.tokendetails.presentation.tokendetails.state.express.ExchangeUM
|
import com.tangem.feature.tokendetails.presentation.tokendetails.state.express.ExchangeUM
|
||||||
import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.TokenDetailsSwapTransactionsStateConverter
|
import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.TokenDetailsSwapTransactionsStateConverter
|
||||||
import com.tangem.feature.tokendetails.presentation.tokendetails.model.TokenDetailsClickIntents
|
|
||||||
import com.tangem.utils.Provider
|
import com.tangem.utils.Provider
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
|
|
@ -35,6 +37,8 @@ internal class ExchangeStatusFactory @AssistedInject constructor(
|
||||||
private val swapTransactionRepository: SwapTransactionRepository,
|
private val swapTransactionRepository: SwapTransactionRepository,
|
||||||
private val swapRepository: SwapRepository,
|
private val swapRepository: SwapRepository,
|
||||||
private val quotesRepository: QuotesRepository,
|
private val quotesRepository: QuotesRepository,
|
||||||
|
private val quotesRepositoryV2: QuotesRepositoryV2,
|
||||||
|
private val tokensFeatureToggles: TokensFeatureToggles,
|
||||||
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
|
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
|
||||||
private val addCryptoCurrenciesUseCase: AddCryptoCurrenciesUseCase,
|
private val addCryptoCurrenciesUseCase: AddCryptoCurrenciesUseCase,
|
||||||
private val swapTransactionStatusStore: SwapTransactionStatusStore,
|
private val swapTransactionStatusStore: SwapTransactionStatusStore,
|
||||||
|
|
@ -198,7 +202,12 @@ internal class ExchangeStatusFactory @AssistedInject constructor(
|
||||||
private suspend fun Set<CryptoCurrency.ID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> {
|
private suspend fun Set<CryptoCurrency.ID>.getQuotesOrEmpty(refresh: Boolean): Set<Quote> {
|
||||||
return try {
|
return try {
|
||||||
val rawIds = mapNotNull { it.rawCurrencyId }.toSet()
|
val rawIds = mapNotNull { it.rawCurrencyId }.toSet()
|
||||||
quotesRepository.getQuotesSync(rawIds, refresh)
|
|
||||||
|
if (tokensFeatureToggles.isQuotesLoadingRefactoringEnabled) {
|
||||||
|
quotesRepositoryV2.getMultiQuoteSyncOrNull(currenciesIds = rawIds).orEmpty()
|
||||||
|
} else {
|
||||||
|
quotesRepository.getQuotesSync(rawIds, refresh)
|
||||||
|
}
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
emptySet()
|
emptySet()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue