From a4eb7fce060295e898e9b5164eb5469919694d9a Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Apr 2025 17:54:38 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/tap/features/main/MainViewModel.kt | 2 +- .../datasource/di/StakingStoreModule.kt | 20 +++++++++++-- .../local/token/DefaultStakingYieldsStore.kt | 21 +++++-------- .../data/staking/DefaultStakingRepository.kt | 30 ++++++++----------- .../staking/FetchStakingTokensUseCase.kt | 4 +-- .../staking/repositories/StakingRepository.kt | 2 +- 6 files changed, 41 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt index 859d82a082..e6a4d37f48 100644 --- a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt @@ -124,7 +124,7 @@ internal class MainViewModel @Inject constructor( private fun fetchStakingTokens() { viewModelScope.launch(dispatchers.main) { - fetchStakingTokensUseCase(true) + fetchStakingTokensUseCase() .onLeft { Timber.e(it.toString(), "Unable to fetch the staking tokens list") } .onRight { Timber.d("Staking token list was fetched successfully") } } diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt index 655f4a41b3..3d632eaf97 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/StakingStoreModule.kt @@ -5,10 +5,12 @@ import androidx.datastore.core.DataStoreFactory import androidx.datastore.dataStoreFile import com.squareup.moshi.Moshi import com.tangem.datasource.api.stakekit.models.response.model.YieldBalanceWrapperDTO +import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO import com.tangem.datasource.local.datastore.RuntimeDataStore import com.tangem.datasource.local.datastore.RuntimeSharedStore import com.tangem.datasource.local.token.* import com.tangem.datasource.utils.MoshiDataStoreSerializer +import com.tangem.datasource.utils.listTypes import com.tangem.datasource.utils.mapWithStringKeyTypes import com.tangem.datasource.utils.setTypes import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -27,8 +29,22 @@ internal object StakingStoreModule { @Provides @Singleton - fun provideStakingTokensStore(): StakingYieldsStore { - return DefaultStakingYieldsStore(dataStore = RuntimeDataStore()) + fun provideStakingTokensStore( + @NetworkMoshi moshi: Moshi, + @ApplicationContext context: Context, + dispatchers: CoroutineDispatcherProvider, + ): StakingYieldsStore { + return DefaultStakingYieldsStore( + dataStore = DataStoreFactory.create( + serializer = MoshiDataStoreSerializer( + moshi = moshi, + types = listTypes(), + defaultValue = emptyList(), + ), + produceFile = { context.dataStoreFile(fileName = "yields_cache") }, + scope = CoroutineScope(context = dispatchers.io + SupervisorJob()), + ), + ) } @Provides diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt index eb27aad46b..874e884f87 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/token/DefaultStakingYieldsStore.kt @@ -1,32 +1,25 @@ package com.tangem.datasource.local.token +import androidx.datastore.core.DataStore import com.tangem.datasource.api.stakekit.models.response.model.YieldDTO -import com.tangem.datasource.local.datastore.core.StringKeyDataStore import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.flow.firstOrNull internal class DefaultStakingYieldsStore( - private val dataStore: StringKeyDataStore>, + private val dataStore: DataStore>, ) : StakingYieldsStore { - private val mutex = Mutex() - override fun get(): Flow> { - return dataStore.get(KEY) + return dataStore.data } override suspend fun getSync(): List { - return dataStore.getSyncOrNull(KEY) ?: emptyList() + return dataStore.data.firstOrNull().orEmpty() } override suspend fun store(items: List) { - mutex.withLock { - dataStore.store(KEY, items) + dataStore.updateData { _ -> + items } } - - companion object { - private const val KEY = "DefaultStakingYieldsStore" - } } \ No newline at end of file diff --git a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt index 9275635df5..198ecb2e5a 100644 --- a/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt +++ b/data/staking/src/main/java/com/tangem/data/staking/DefaultStakingRepository.kt @@ -108,25 +108,19 @@ internal class DefaultStakingRepository( return integrationIdMap.getOrDefault(getIntegrationKey(cryptoCurrencyId), null) } - override suspend fun fetchEnabledYields(refresh: Boolean) { + override suspend fun fetchEnabledYields() { withContext(dispatchers.io) { - cacheRegistry.invokeOnExpire( - key = YIELDS_STORE_KEY, - skipCache = refresh, - block = { - when (val stakingTokensWithYields = stakeKitApi.getEnabledYields(preferredValidatorsOnly = false)) { - is ApiResponse.Success -> stakingYieldsStore.store( - stakingTokensWithYields.data.data.filter { - it.isAvailable ?: false - }, - ) - else -> { - stakingYieldsStore.store(emptyList()) - throw (stakingTokensWithYields as ApiResponse.Error).cause - } - } - }, - ) + when (val stakingTokensWithYields = stakeKitApi.getEnabledYields(preferredValidatorsOnly = false)) { + is ApiResponse.Success -> stakingYieldsStore.store( + stakingTokensWithYields.data.data.filter { + it.isAvailable ?: false + }, + ) + else -> { + stakingYieldsStore.store(emptyList()) + throw (stakingTokensWithYields as ApiResponse.Error).cause + } + } } } diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/FetchStakingTokensUseCase.kt b/domain/staking/src/main/java/com/tangem/domain/staking/FetchStakingTokensUseCase.kt index c591ae2bc2..168a65fc0f 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/FetchStakingTokensUseCase.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/FetchStakingTokensUseCase.kt @@ -14,10 +14,10 @@ class FetchStakingTokensUseCase( private val stakingRepository: StakingRepository, private val stakingErrorResolver: StakingErrorResolver, ) { - suspend operator fun invoke(isRefresh: Boolean = false): Either { + suspend operator fun invoke(): Either { return either { catch( - block = { stakingRepository.fetchEnabledYields(isRefresh) }, + block = { stakingRepository.fetchEnabledYields() }, catch = { stakingErrorResolver.resolve(it) }, ) } diff --git a/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt b/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt index b583c5f491..d97ac0f2b9 100644 --- a/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt +++ b/domain/staking/src/main/java/com/tangem/domain/staking/repositories/StakingRepository.kt @@ -27,7 +27,7 @@ interface StakingRepository { fun getSupportedIntegrationId(cryptoCurrencyId: CryptoCurrency.ID): String? - suspend fun fetchEnabledYields(refresh: Boolean) + suspend fun fetchEnabledYields() suspend fun getEntryInfo(cryptoCurrencyId: CryptoCurrency.ID, symbol: String): StakingEntryInfo