diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt index d1bc4dc436..5e4c6b350e 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultCurrenciesRepository.kt @@ -290,6 +290,21 @@ internal class DefaultCurrenciesRepository( responseCurrenciesFactory.createCurrencies(storedTokens, userWallet.scanResponse) } + override suspend fun getMultiCurrencyWalletCachedCurrenciesSync(userWalletId: UserWalletId) = + withContext(dispatchers.io) { + val userWallet = getUserWallet(userWalletId) + ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true) + + val storedTokens = requireNotNull( + value = getSavedUserTokensResponseSync(key = userWallet.walletId), + lazyMessage = { + "Unable to find tokens response for user wallet with provided ID: $userWalletId" + }, + ) + + responseCurrenciesFactory.createCurrencies(storedTokens, userWallet.scanResponse) + } + override suspend fun getMultiCurrencyWalletCurrency( userWalletId: UserWalletId, id: CryptoCurrency.ID, diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt index e108b21819..aeba9d2c14 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/RefreshMultiCurrencyWalletQuotesUseCase.kt @@ -20,7 +20,7 @@ class RefreshMultiCurrencyWalletQuotesUseCase( suspend operator fun invoke(userWalletId: UserWalletId): Either { return either { - val currencies = fetchCurrencies(userWalletId = userWalletId) + val currencies = getCurrencies(userWalletId = userWalletId) .getOrElse { raise(QuotesError.DataError(it)) } coroutineScope { @@ -35,10 +35,10 @@ class RefreshMultiCurrencyWalletQuotesUseCase( } } - private suspend fun fetchCurrencies(userWalletId: UserWalletId): Either> { + private suspend fun getCurrencies(userWalletId: UserWalletId): Either> { return either { catch( - block = { currenciesRepository.getMultiCurrencyWalletCurrenciesSync(userWalletId, false) }, + block = { currenciesRepository.getMultiCurrencyWalletCachedCurrenciesSync(userWalletId) }, catch = { raise(it) }, ) } @@ -46,7 +46,9 @@ class RefreshMultiCurrencyWalletQuotesUseCase( private suspend fun fetchQuotes(currenciesIds: Set) { catch( - block = { quotesRepository.fetchQuotes(currenciesIds) }, + block = { + quotesRepository.fetchQuotes(currenciesIds) + }, catch = { /* Ignore error */ }, ) } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt index 37efae4b4b..1bd10511b8 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/CurrenciesRepository.kt @@ -148,6 +148,17 @@ interface CurrenciesRepository { refresh: Boolean = false, ): List + /** + * Retrieves the list of cryptocurrencies within a multi-currency wallet. + * Returns previously loaded currencies or empty list + * + * @param userWalletId The unique identifier of the user wallet. + * @return A list of [CryptoCurrency]. + * @throws DataError.UserWalletError.WrongUserWallet If single-currency user wallet + * ID provided. + */ + suspend fun getMultiCurrencyWalletCachedCurrenciesSync(userWalletId: UserWalletId): List + /** * Retrieves the cryptocurrency for a specific multi-currency user wallet. * diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt index 8ef1dfea78..17f718c351 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockCurrenciesRepository.kt @@ -65,6 +65,10 @@ internal class MockCurrenciesRepository( return tokens.first().getOrElse { e -> throw e } } + override suspend fun getMultiCurrencyWalletCachedCurrenciesSync(userWalletId: UserWalletId): List { + return tokens.first().getOrElse { e -> throw e } + } + override suspend fun getSingleCurrencyWalletPrimaryCurrency(userWalletId: UserWalletId): CryptoCurrency { return token.getOrElse { e -> throw e } }