Updated on 2026-08-14
This commit is contained in:
parent
b6a8a4937b
commit
22cbd1b422
10 changed files with 64 additions and 69 deletions
|
|
@ -7,7 +7,10 @@ import com.squareup.moshi.Moshi
|
|||
import com.tangem.datasource.local.datastore.RuntimeDataStore
|
||||
import com.tangem.datasource.local.network.DefaultNetworksStatusesStore
|
||||
import com.tangem.datasource.local.network.NetworksStatusesStore
|
||||
import com.tangem.datasource.local.network.utils.NetworkStatusesSerializer
|
||||
import com.tangem.datasource.local.network.entity.NetworkStatusDM
|
||||
import com.tangem.datasource.utils.MoshiDataStoreSerializer
|
||||
import com.tangem.datasource.utils.mapWithStringKeyTypes
|
||||
import com.tangem.datasource.utils.setTypes
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
|
|
@ -30,7 +33,11 @@ internal object NetworksStatusesStoreModule {
|
|||
return DefaultNetworksStatusesStore(
|
||||
runtimeDataStore = RuntimeDataStore(),
|
||||
persistenceDataStore = DataStoreFactory.create(
|
||||
serializer = NetworkStatusesSerializer(moshi),
|
||||
serializer = MoshiDataStoreSerializer(
|
||||
moshi = moshi,
|
||||
types = mapWithStringKeyTypes(valueTypes = setTypes<NetworkStatusDM>()),
|
||||
defaultValue = emptyMap(),
|
||||
),
|
||||
produceFile = { context.dataStoreFile(fileName = "networks_statuses") },
|
||||
scope = CoroutineScope(context = dispatchers.io + SupervisorJob()),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package com.tangem.datasource.local.network
|
|||
|
||||
import androidx.datastore.core.DataStore
|
||||
import com.tangem.datasource.local.datastore.RuntimeDataStore
|
||||
import com.tangem.datasource.local.network.entity.NetworkStatusesDM
|
||||
import com.tangem.datasource.local.network.entity.NetworkStatusesByWalletId
|
||||
import com.tangem.datasource.local.network.utils.toDataModel
|
||||
import com.tangem.datasource.local.network.utils.toDomainModel
|
||||
import com.tangem.domain.tokens.model.Network
|
||||
|
|
@ -16,7 +16,7 @@ import kotlinx.coroutines.sync.withLock
|
|||
|
||||
internal class DefaultNetworksStatusesStore(
|
||||
private val runtimeDataStore: RuntimeDataStore<Set<NetworkStatus>>,
|
||||
private val persistenceDataStore: DataStore<NetworkStatusesDM>,
|
||||
private val persistenceDataStore: DataStore<NetworkStatusesByWalletId>,
|
||||
) : NetworksStatusesStore {
|
||||
|
||||
private val mutex = Mutex()
|
||||
|
|
@ -33,7 +33,7 @@ internal class DefaultNetworksStatusesStore(
|
|||
.firstOrNull { it.id == status.networkId }
|
||||
?: return@mapNotNullTo null
|
||||
|
||||
status.toDomainModel(network)
|
||||
status.toDomainModel(network = network, isCached = true)
|
||||
}
|
||||
.orEmpty()
|
||||
|
||||
|
|
@ -110,7 +110,7 @@ internal class DefaultNetworksStatusesStore(
|
|||
|
||||
persistenceDataStore.updateData { storedStatuses ->
|
||||
val userWalletStatuses = storedStatuses[userWalletId.stringValue] ?: emptySet()
|
||||
val updatedStatuses = userWalletStatuses.addOrReplace(status.toDataModel(network)) {
|
||||
val updatedStatuses = userWalletStatuses.addOrReplace(item = status.toDataModel(network)) {
|
||||
it.networkId == network.id
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,27 +1,34 @@
|
|||
package com.tangem.datasource.local.network.entity
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
import com.tangem.domain.tokens.model.Network
|
||||
import java.math.BigDecimal
|
||||
|
||||
internal typealias NetworkStatusesDM = Map<String, Set<NetworkStatusDM>>
|
||||
internal typealias NetworkStatusesByWalletId = Map<String, Set<NetworkStatusDM>>
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class NetworkStatusDM(
|
||||
val networkId: Network.ID,
|
||||
val selectedAddress: String,
|
||||
val availableAddresses: Set<Address>,
|
||||
val amounts: Map<String, BigDecimal>,
|
||||
@Json(name = "network_id") val networkId: Network.ID,
|
||||
@Json(name = "selected_address") val selectedAddress: String,
|
||||
@Json(name = "available_addresses") val availableAddresses: Set<Address>,
|
||||
@Json(name = "amounts") val amounts: Map<String, BigDecimal>,
|
||||
) {
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class Address(
|
||||
val value: String,
|
||||
val type: Type,
|
||||
@Json(name = "value") val value: String,
|
||||
@Json(name = "type") val type: Type,
|
||||
) {
|
||||
|
||||
@JsonClass(generateAdapter = false)
|
||||
enum class Type {
|
||||
Primary, Secondary,
|
||||
|
||||
@Json(name = "primary")
|
||||
Primary,
|
||||
|
||||
@Json(name = "secondary")
|
||||
Secondary,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,7 @@ internal fun NetworkStatus.Verified.toDataModel(network: Network): NetworkStatus
|
|||
)
|
||||
}
|
||||
|
||||
internal fun NetworkStatusDM.toDomainModel(network: Network): NetworkStatus {
|
||||
internal fun NetworkStatusDM.toDomainModel(network: Network, isCached: Boolean): NetworkStatus {
|
||||
return NetworkStatus(
|
||||
network = network,
|
||||
value = NetworkStatus.Verified(
|
||||
|
|
@ -40,6 +40,7 @@ internal fun NetworkStatusDM.toDomainModel(network: Network): NetworkStatus {
|
|||
amounts = mapToDomainAmounts(amounts),
|
||||
pendingTransactions = mapOf(),
|
||||
),
|
||||
isCached = isCached,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,36 +0,0 @@
|
|||
package com.tangem.datasource.local.network.utils
|
||||
|
||||
import androidx.datastore.core.Serializer
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.squareup.moshi.Types
|
||||
import com.tangem.datasource.local.network.entity.NetworkStatusDM
|
||||
import com.tangem.datasource.local.network.entity.NetworkStatusesDM
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
|
||||
internal class NetworkStatusesSerializer(moshi: Moshi) : Serializer<NetworkStatusesDM> {
|
||||
|
||||
private val adapter by lazy {
|
||||
val type = Types.newParameterizedType(
|
||||
Map::class.java,
|
||||
String::class.java,
|
||||
Types.newParameterizedType(Set::class.java, NetworkStatusDM::class.java),
|
||||
)
|
||||
|
||||
moshi.adapter<NetworkStatusesDM>(type)
|
||||
}
|
||||
|
||||
override val defaultValue: NetworkStatusesDM = emptyMap()
|
||||
|
||||
override suspend fun readFrom(input: InputStream): NetworkStatusesDM {
|
||||
return input.bufferedReader().use { reader ->
|
||||
adapter.fromJson(reader.readText()) ?: defaultValue
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun writeTo(t: NetworkStatusesDM, output: OutputStream) {
|
||||
output.bufferedWriter().use { writer ->
|
||||
writer.write(adapter.toJson(t))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,10 @@ package com.tangem.datasource.utils
|
|||
import com.squareup.moshi.Types
|
||||
import java.lang.reflect.ParameterizedType
|
||||
|
||||
fun mapWithStringKeyTypes(valueTypes: ParameterizedType): ParameterizedType {
|
||||
return Types.newParameterizedType(Map::class.java, String::class.java, valueTypes)
|
||||
}
|
||||
|
||||
inline fun <reified T> mapWithStringKeyTypes(): ParameterizedType {
|
||||
return Types.newParameterizedType(Map::class.java, String::class.java, T::class.java)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue