diff --git a/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt b/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt index dedbcb34e5..7dd1828915 100644 --- a/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt +++ b/data/networks/src/main/java/com/tangem/data/networks/store/DefaultNetworksStatusesStoreV2.kt @@ -19,6 +19,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch +import timber.log.Timber internal typealias WalletIdWithSimpleStatus = Map> internal typealias WalletIdWithStatusDM = Map> @@ -55,29 +56,17 @@ internal class DefaultNetworksStatusesStoreV2( } override suspend fun refresh(userWalletId: UserWalletId, network: Network) { - updateStatusSourceInRuntime(userWalletId = userWalletId, network = network, source = StatusSource.CACHE) + refresh(userWalletId = userWalletId, networks = setOf(network)) } override suspend fun refresh(userWalletId: UserWalletId, networks: Set) { - val simpleStatusIds = networks.map(SimpleNetworkStatus::Id) + if (networks.isEmpty()) { + Timber.d("Nothing to refresh: networks is empty") + return + } - runtimeStore.update(default = emptyMap()) { stored -> - stored.toMutableMap().apply { - val storedStatuses = this[userWalletId.stringValue].orEmpty() - - val statuses = simpleStatusIds.mapTo(hashSetOf()) { simpleStatusId -> - val status = storedStatuses.firstOrNull { it.id == simpleStatusId } - ?: createDefaultStatus(id = simpleStatusId) - - status.copy( - value = status.value.copySealed(source = StatusSource.CACHE), - ) - } - - val updatedStatuses = storedStatuses.addOrReplace(statuses) { old, new -> old.id == new.id } - - put(key = userWalletId.stringValue, value = updatedStatuses) - } + updateInRuntime(userWalletId = userWalletId, networks = networks) { status -> + status.copy(value = status.value.copySealed(source = StatusSource.CACHE)) } } @@ -93,28 +82,37 @@ internal class DefaultNetworksStatusesStoreV2( } override suspend fun storeError(userWalletId: UserWalletId, network: Network) { - updateStatusSourceInRuntime(userWalletId = userWalletId, network = network, source = StatusSource.ONLY_CACHE) + updateInRuntime( + userWalletId = userWalletId, + networks = setOf(network), + ifNotFound = ::createUnreachableStatus, + update = { status -> + status.copy(value = status.value.copySealed(source = StatusSource.ONLY_CACHE)) + }, + ) } - private suspend fun updateStatusSourceInRuntime( + private suspend fun updateInRuntime( userWalletId: UserWalletId, - network: Network, - source: StatusSource, + networks: Set, + ifNotFound: (SimpleNetworkStatus.Id) -> SimpleNetworkStatus? = { null }, + update: (SimpleNetworkStatus) -> SimpleNetworkStatus, ) { - val simpleStatusId = SimpleNetworkStatus.Id(network) + val simpleStatusIds = networks.map(SimpleNetworkStatus::Id) runtimeStore.update(default = emptyMap()) { stored -> stored.toMutableMap().apply { - val status = this[userWalletId.stringValue].orEmpty() - .firstOrNull { it.id == simpleStatusId } - ?: createDefaultStatus(id = simpleStatusId) + val storedStatuses = this[userWalletId.stringValue].orEmpty() - val updatedStatus = status.copy( - value = status.value.copySealed(source = source), - ) + val statuses = simpleStatusIds.mapNotNullTo(hashSetOf()) { simpleStatusId -> + val status = storedStatuses.firstOrNull { it.id == simpleStatusId } + ?: ifNotFound(simpleStatusId) + ?: return@mapNotNullTo null - val updatedStatuses = this[userWalletId.stringValue].orEmpty() - .addOrReplace(updatedStatus) { it.id == simpleStatusId } + update(status) + } + + val updatedStatuses = storedStatuses.addOrReplace(statuses) { old, new -> old.id == new.id } put(key = userWalletId.stringValue, value = updatedStatuses) } @@ -151,7 +149,7 @@ internal class DefaultNetworksStatusesStoreV2( } } - private fun createDefaultStatus(id: SimpleNetworkStatus.Id): SimpleNetworkStatus { + private fun createUnreachableStatus(id: SimpleNetworkStatus.Id): SimpleNetworkStatus { return SimpleNetworkStatus(id = id, value = NetworkStatus.Unreachable(address = null)) } } \ No newline at end of file diff --git a/data/networks/src/test/java/com/tangem/data/networks/store/NetworkStatusesStoreUpdateMethodsTest.kt b/data/networks/src/test/java/com/tangem/data/networks/store/NetworkStatusesStoreUpdateMethodsTest.kt index 57aea3c1e2..4331b3c8e4 100644 --- a/data/networks/src/test/java/com/tangem/data/networks/store/NetworkStatusesStoreUpdateMethodsTest.kt +++ b/data/networks/src/test/java/com/tangem/data/networks/store/NetworkStatusesStoreUpdateMethodsTest.kt @@ -35,14 +35,7 @@ internal class NetworkStatusesStoreUpdateMethodsTest { fun `refresh the single network if runtime store is empty`() = runTest { store.refresh(userWalletId = userWalletId, network = network) - val runtimeExpected = mapOf( - userWalletId.stringValue to setOf( - SimpleNetworkStatus( - id = SimpleNetworkStatus.Id(network), - value = NetworkStatus.Unreachable(address = null), - ), - ), - ) + val runtimeExpected = mapOf(userWalletId.stringValue to emptySet()) Truth.assertThat(runtimeStore.getSyncOrNull()).isEqualTo(runtimeExpected) Truth.assertThat(persistenceStore.data.firstOrNull()).isEqualTo(emptyMap>()) @@ -72,14 +65,7 @@ internal class NetworkStatusesStoreUpdateMethodsTest { fun `refresh the multi networks if runtime store is empty`() = runTest { store.refresh(userWalletId = userWalletId, networks = networks) - val runtimeExpected = mapOf( - userWalletId.stringValue to networks.mapTo(hashSetOf()) { - SimpleNetworkStatus( - id = SimpleNetworkStatus.Id(it), - value = NetworkStatus.Unreachable(address = null), - ) - }, - ) + val runtimeExpected = mapOf(userWalletId.stringValue to emptySet()) Truth.assertThat(runtimeStore.getSyncOrNull()).isEqualTo(runtimeExpected) Truth.assertThat(persistenceStore.data.firstOrNull()).isEqualTo(emptyMap>()) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt index 5359f89098..418cb39368 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt @@ -402,6 +402,13 @@ internal class WalletModel @Inject constructor( coroutineScope = modelScope, ) + if (action.selectedWallet.scanResponse.cardTypesResolver.isSingleWallet()) { + modelScope.launch { + fetchCurrencyStatusUseCase(userWalletId = action.selectedWallet.walletId) + .onLeft { Timber.e(it.toString()) } + } + } + stateHolder.update( AddWalletTransformer( userWallet = action.selectedWallet,