From b9db5dce07d85831863f9d48e5edcd465cea4345 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 14 Oct 2024 14:43:41 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../repository/DefaultCurrenciesRepository.kt | 33 +++++++++++ .../managetokens/SaveManagedTokensUseCase.kt | 55 +++++++++---------- .../tokens/repository/CurrenciesRepository.kt | 8 +++ .../repository/MockCurrenciesRepository.kt | 2 + 4 files changed, 68 insertions(+), 30 deletions(-) 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 8d14d7cd8f..a3b8911411 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 @@ -87,6 +87,26 @@ internal class DefaultCurrenciesRepository( storeAndPushTokens(userWalletId, response) } + override suspend fun saveNewCurrenciesList(userWalletId: UserWalletId, currencies: List) { + val savedResponse = requireNotNull( + value = getSavedUserTokensResponseSync(key = userWalletId), + lazyMessage = { "Saved tokens empty. Can not perform add currencies action" }, + ) + val newCoins = createCoinsForNewTokenList( + userWalletId = userWalletId, + newTokens = currencies.filterIsInstance(), + ) + val newCurrencies = (newCoins + currencies).distinct() + val updatedResponse = savedResponse.copy( + tokens = newCurrencies.map(userTokensResponseFactory::createResponseToken), + ) + storeAndPushTokens( + userWalletId = userWalletId, + response = updatedResponse, + ) + fetchExchangeableUserMarketCoinsByIds(userWalletId, updatedResponse) + } + override suspend fun addCurrencies(userWalletId: UserWalletId, currencies: List) { return withContext(dispatchers.io) { val savedCurrencies = requireNotNull( @@ -125,6 +145,19 @@ internal class DefaultCurrenciesRepository( } } + private suspend fun createCoinsForNewTokenList( + userWalletId: UserWalletId, + newTokens: List, + ): List { + return newTokens.mapNotNull { + cryptoCurrencyFactory.createCoin( + blockchain = getBlockchain(networkId = it.network.id), + extraDerivationPath = it.network.derivationPath.value, + scanResponse = getUserWallet(userWalletId).scanResponse, + ) + }.distinct() + } + private suspend fun createCoinsForNewTokens( userWalletId: UserWalletId, newTokens: List, diff --git a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt index f39a31dc49..cb42f40234 100644 --- a/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt +++ b/domain/manage-tokens/src/main/kotlin/com/tangem/domain/managetokens/SaveManagedTokensUseCase.kt @@ -26,21 +26,36 @@ class SaveManagedTokensUseCase( currenciesToRemove: Map>, ): Either { return Either.catch { - // TODO: Currently order is matter. [REDACTED_JIRA] - removeCurrencies(userWalletId, currenciesToRemove) - addCurrencies(userWalletId, currenciesToAdd) + val removingCurrencies = currenciesToRemove.mapToCryptoCurrencies(userWalletId) + val addingCurrencies = currenciesToAdd.mapToCryptoCurrencies(userWalletId) + derivationsRepository.derivePublicKeysByNetworks( + userWalletId = userWalletId, + networks = currenciesToAdd.values.flatten(), + ) + val newCurrenciesList = currenciesRepository + .getMultiCurrencyWalletCurrenciesSync(userWalletId) + .filterNot(removingCurrencies::contains) + .toMutableList() + .also { it.addAll(addingCurrencies) } + currenciesRepository.saveNewCurrenciesList(userWalletId, newCurrenciesList) + + val existingCurrencies = currenciesRepository.getMultiCurrencyWalletCurrenciesSync(userWalletId) + removeCurrenciesFromWalletManager( + userWalletId = userWalletId, + currencies = removingCurrencies.filterNot(existingCurrencies::contains), + ) + refreshUpdatedNetworks( + userWalletId = userWalletId, + existingCurrencies = existingCurrencies, + currenciesToAdd = addingCurrencies, + ) } } - private suspend fun removeCurrencies( + private suspend fun removeCurrenciesFromWalletManager( userWalletId: UserWalletId, - currenciesToRemove: Map>, + currencies: List, ) { - if (currenciesToRemove.isEmpty()) return - - val currencies = currenciesToRemove.mapToCryptoCurrencies(userWalletId) - currenciesRepository.removeCurrencies(userWalletId = userWalletId, currencies = currencies) - walletManagersFacade.remove( userWalletId = userWalletId, networks = currencies @@ -54,26 +69,6 @@ class SaveManagedTokensUseCase( ) } - private suspend fun addCurrencies( - userWalletId: UserWalletId, - currenciesToAdd: Map>, - ) { - if (currenciesToAdd.isEmpty()) return - - val existingCurrencies = currenciesRepository.getMultiCurrencyWalletCurrenciesSync(userWalletId) - val currencies = currenciesToAdd.mapToCryptoCurrencies(userWalletId) - derivationsRepository.derivePublicKeysByNetworks( - userWalletId = userWalletId, - networks = currenciesToAdd.values.flatten(), - ) - currenciesRepository.addCurrencies(userWalletId, currencies) - refreshUpdatedNetworks( - userWalletId = userWalletId, - existingCurrencies = existingCurrencies, - currenciesToAdd = currencies, - ) - } - private suspend fun refreshUpdatedNetworks( userWalletId: UserWalletId, currenciesToAdd: List, 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 a119091c42..d8c8c7cf37 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 @@ -34,6 +34,14 @@ interface CurrenciesRepository { isSortedByBalance: Boolean, ) + /** + * Saves the given list of cryptocurrencies for a specific multi-currency user wallet. + * + * @param userWalletId The unique identifier of the user wallet. + * @param currencies The list of cryptocurrencies to be saved. + */ + suspend fun saveNewCurrenciesList(userWalletId: UserWalletId, currencies: List) + /** * Add currencies to a specific 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 0ca8bd3b12..cc16af1aba 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 @@ -47,6 +47,8 @@ internal class MockCurrenciesRepository( isTokensSortedByBalanceAfterSortingApply = isSortedByBalance } + override suspend fun saveNewCurrenciesList(userWalletId: UserWalletId, currencies: List) = Unit + override suspend fun addCurrencies(userWalletId: UserWalletId, currencies: List) = Unit override suspend fun removeCurrency(userWalletId: UserWalletId, currency: CryptoCurrency) {