From b2ba33d09e4f6b03dab63c5cadb2f2e65c36a0e5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 13 Feb 2025 22:40:18 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../di/NetworksStatusesStoreModule.kt | 2 +- .../network/DefaultNetworksStatusesStore.kt | 41 +++++++++++-------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/NetworksStatusesStoreModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/NetworksStatusesStoreModule.kt index 6aa2a9f344..bbf8c38124 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/NetworksStatusesStoreModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/NetworksStatusesStoreModule.kt @@ -29,7 +29,7 @@ internal object NetworksStatusesStoreModule { ): NetworksStatusesStore { return DefaultNetworksStatusesStore( runtimeDataStore = RuntimeDataStore(), - persistneceDataStore = DataStoreFactory.create( + persistenceDataStore = DataStoreFactory.create( serializer = NetworkStatusesSerializer(moshi), produceFile = { context.dataStoreFile(fileName = "networks_statuses") }, scope = CoroutineScope(context = dispatchers.io + SupervisorJob()), diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/network/DefaultNetworksStatusesStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/network/DefaultNetworksStatusesStore.kt index 975f51a140..437628831c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/network/DefaultNetworksStatusesStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/network/DefaultNetworksStatusesStore.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.sync.withLock internal class DefaultNetworksStatusesStore( private val runtimeDataStore: RuntimeDataStore>, - private val persistneceDataStore: DataStore, + private val persistenceDataStore: DataStore, ) : NetworksStatusesStore { private val mutex = Mutex() @@ -26,7 +26,7 @@ internal class DefaultNetworksStatusesStore( } override fun get(key: UserWalletId, networks: Set): Flow> = channelFlow { - val cachedStatuses = persistneceDataStore.data.firstOrNull() + val cachedStatuses = persistenceDataStore.data.firstOrNull() ?.get(key.stringValue) ?.mapNotNullTo(mutableSetOf()) { status -> val network = networks @@ -43,22 +43,12 @@ internal class DefaultNetworksStatusesStore( runtimeDataStore.get(provideStringKey(key)) .onEach { runtimeStatuses -> - if (cachedStatuses.isEmpty()) { - send(runtimeStatuses) - } else { - val mergedStatuses = cachedStatuses.toMutableList() + val mergedStatuses = mergeStatuses( + cachedStatuses = cachedStatuses, + runtimeStatuses = runtimeStatuses, + ) - runtimeStatuses.forEach { runtimeStatus -> - val index = mergedStatuses.indexOfFirst { it.network == runtimeStatus.network } - if (index != -1) { - mergedStatuses[index] = runtimeStatus - } else { - mergedStatuses.add(runtimeStatus) - } - } - - send(mergedStatuses.toSet()) - } + send(mergedStatuses) } .launchIn(scope = this) } @@ -97,13 +87,28 @@ internal class DefaultNetworksStatusesStore( } } + /** + * Merge [cachedStatuses] with [runtimeStatuses] + * The resulting set contains statuses from both sets. + * If a status with the same network is in both sets, the status from [runtimeStatuses] is used. + */ + private fun mergeStatuses( + cachedStatuses: Set, + runtimeStatuses: Set, + ): Set { + val runtimeMap = runtimeStatuses.associateBy { it.network } + val mergedCached = cachedStatuses.filter { it.network !in runtimeMap.keys } + + return mergedCached.toSet() + runtimeStatuses + } + private suspend fun storeNetworkStatusInPersistence(userWalletId: UserWalletId, networkStatus: NetworkStatus) { val status = networkStatus.value val network = networkStatus.network if (status !is NetworkStatus.Verified) return - persistneceDataStore.updateData { storedStatuses -> + persistenceDataStore.updateData { storedStatuses -> val userWalletStatuses = storedStatuses[userWalletId.stringValue] ?: emptySet() val updatedStatuses = userWalletStatuses.addOrReplace(status.toDataModel(network)) { it.networkId == network.id