From f6c6c5faed6e7c8b154351846944cfcbc1c3879f Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 2 Oct 2023 12:45:20 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../repository/DefaultNetworksRepository.kt | 3 +-- .../tokens/GetCurrencyStatusUpdatesUseCase.kt | 6 ++---- .../CurrenciesStatusesOperations.kt | 21 ++++++------------- .../tokens/repository/NetworksRepository.kt | 7 +------ .../repository/MockNetworksRepository.kt | 1 - .../viewmodels/TokenDetailsViewModel.kt | 18 +++++++++++++++- 6 files changed, 27 insertions(+), 29 deletions(-) diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt index 6f5615c1b6..e1d3826183 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultNetworksRepository.kt @@ -40,7 +40,6 @@ internal class DefaultNetworksRepository( override fun getNetworkStatusesUpdates( userWalletId: UserWalletId, networks: Set, - refresh: Boolean, ): Flow> = channelFlow { launch(dispatchers.io) { networksStatusesStore.get(userWalletId) @@ -48,7 +47,7 @@ internal class DefaultNetworksRepository( } withContext(dispatchers.io) { - fetchNetworksStatusesIfCacheExpired(userWalletId, networks, refresh) + fetchNetworksStatusesIfCacheExpired(userWalletId, networks, false) } }.cancellable() diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyStatusUpdatesUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyStatusUpdatesUseCase.kt index f3cf282b1d..d018b74e85 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyStatusUpdatesUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyStatusUpdatesUseCase.kt @@ -37,17 +37,15 @@ class GetCurrencyStatusUpdatesUseCase( operator fun invoke( userWalletId: UserWalletId, currencyId: CryptoCurrency.ID, - refresh: Boolean, ): Flow> { return flow { - emitAll(getCurrency(userWalletId, currencyId, refresh)) + emitAll(getCurrency(userWalletId, currencyId)) }.flowOn(dispatchers.io) } private suspend fun getCurrency( userWalletId: UserWalletId, currencyId: CryptoCurrency.ID, - refresh: Boolean, ): Flow> { val operations = CurrenciesStatusesOperations( currenciesRepository = currenciesRepository, @@ -56,7 +54,7 @@ class GetCurrencyStatusUpdatesUseCase( userWalletId = userWalletId, ) - return operations.getCurrencyStatusFlow(currencyId, refresh).map { maybeCurrency -> + return operations.getCurrencyStatusFlow(currencyId).map { maybeCurrency -> maybeCurrency.mapLeft(CurrenciesStatusesOperations.Error::mapToCurrencyError) } } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt index 3a2327b7cd..fc4ec95f89 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrenciesStatusesOperations.kt @@ -67,16 +67,13 @@ internal class CurrenciesStatusesOperations( } } - suspend fun getCurrencyStatusFlow( - currencyId: CryptoCurrency.ID, - refresh: Boolean = false, - ): Flow> { + suspend fun getCurrencyStatusFlow(currencyId: CryptoCurrency.ID): Flow> { val currency = recover( block = { getMultiCurrencyWalletCurrency(currencyId) }, recover = { return flowOf(it.left()) }, ) - return getCurrencyStatusFlow(currency, refresh) + return getCurrencyStatusFlow(currency) } suspend fun getNetworkCoinFlow(networkId: Network.ID): Flow> { @@ -97,10 +94,7 @@ internal class CurrenciesStatusesOperations( return getCurrencyStatusFlow(currency) } - private fun getCurrencyStatusFlow( - currency: CryptoCurrency, - refresh: Boolean = false, - ): Flow> { + private fun getCurrencyStatusFlow(currency: CryptoCurrency): Flow> { val (networks, currenciesIds) = getIds(nonEmptyListOf(currency)) val quoteFlow = getQuotes(currenciesIds) @@ -111,7 +105,7 @@ internal class CurrenciesStatusesOperations( } } - val statusFlow = getNetworksStatuses(networks, refresh) + val statusFlow = getNetworksStatuses(networks) .map { maybeStatuses -> maybeStatuses.flatMap { statuses -> statuses.singleOrNull { it.network == currency.network }?.right() @@ -210,11 +204,8 @@ internal class CurrenciesStatusesOperations( .onEmpty { emit(Error.EmptyQuotes.left()) } } - private fun getNetworksStatuses( - networks: NonEmptySet, - refresh: Boolean = false, - ): Flow>> { - return networksRepository.getNetworkStatusesUpdates(userWalletId, networks, refresh) + private fun getNetworksStatuses(networks: NonEmptySet): Flow>> { + return networksRepository.getNetworkStatusesUpdates(userWalletId, networks) .map, Either>> { it.right() } .catch { emit(Error.DataError(it).left()) } .onEmpty { emit(Error.EmptyNetworksStatuses.left()) } diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt index da67708111..30baab37f3 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt @@ -16,14 +16,9 @@ interface NetworksRepository { * * @param userWalletId The unique identifier of the user wallet. * @param networks A set of network which statuses are to be retrieved. - * @param refresh A boolean flag indicating whether the data should be refreshed from remote. * @return A [Flow] emitting a set of [NetworkStatus] objects corresponding to the specified networks. */ - fun getNetworkStatusesUpdates( - userWalletId: UserWalletId, - networks: Set, - refresh: Boolean = false, - ): Flow> + fun getNetworkStatusesUpdates(userWalletId: UserWalletId, networks: Set): Flow> /** * Retrieves network statuses of specified blockchain networks for a specific user wallet. diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockNetworksRepository.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockNetworksRepository.kt index 363ad6202a..ffefd750e0 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockNetworksRepository.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockNetworksRepository.kt @@ -17,7 +17,6 @@ internal class MockNetworksRepository( override fun getNetworkStatusesUpdates( userWalletId: UserWalletId, networks: Set, - refresh: Boolean, ): Flow> { return statuses.map { it.getOrElse { e -> throw e } } } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index b28ca2dff7..ab5d7f11d0 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -35,6 +35,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.JobHolder import com.tangem.utils.coroutines.saveIn import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import timber.log.Timber @@ -71,6 +72,7 @@ internal class TokenDetailsViewModel @Inject constructor( private val marketPriceJobHolder = JobHolder() private val refreshStateJobHolder = JobHolder() + private val networkStatusAutoUpdateStateJobHolder = JobHolder() private var cryptoCurrencyStatus: CryptoCurrencyStatus? = null private var wallet by Delegates.notNull() @@ -148,7 +150,6 @@ internal class TokenDetailsViewModel @Inject constructor( getCurrencyStatusUpdatesUseCase( userWalletId = selectedWallet.walletId, currencyId = cryptoCurrency.id, - refresh = true, ) .distinctUntilChanged() .onEach { either -> @@ -161,6 +162,17 @@ internal class TokenDetailsViewModel @Inject constructor( .flowOn(dispatchers.io) .launchIn(viewModelScope) .saveIn(marketPriceJobHolder) + + viewModelScope.launch(dispatchers.io) { + // Wait for blockchain updates pending transactions. + // Immediate update doesn't receive any changes. + delay(NETWORK_STATUS_AUTO_UPDATE_DELAY) + fetchCurrencyStatusUseCase.invoke( + userWalletId = wallet.walletId, + id = cryptoCurrency.id, + refresh = true, + ) + }.saveIn(networkStatusAutoUpdateStateJobHolder) } private fun updateTxHistory(refresh: Boolean = false) { @@ -377,4 +389,8 @@ internal class TokenDetailsViewModel @Inject constructor( override fun onCloseRentInfoNotification() { uiState = stateFactory.getStateWithRemovedRentNotification() } + + companion object { + private const val NETWORK_STATUS_AUTO_UPDATE_DELAY = 1000L + } } \ No newline at end of file