Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-19 12:46:39 +01:00
parent 96154e6983
commit 18201957b1
22 changed files with 460 additions and 18 deletions

View file

@ -0,0 +1,29 @@
package com.tangem.datasource.di
import com.tangem.datasource.local.datastore.RuntimeSharedStore
import com.tangem.datasource.local.news.details.DefaultNewsDetailsStore
import com.tangem.datasource.local.news.details.NewsDetailsStore
import com.tangem.datasource.local.news.trending.DefaultTrendingNewsStore
import com.tangem.datasource.local.news.trending.TrendingNewsStore
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal object NewsStoreModule {
@Provides
@Singleton
fun provideNewsDetailsStore(): NewsDetailsStore {
return DefaultNewsDetailsStore(store = RuntimeSharedStore())
}
@Provides
@Singleton
fun provideTrendingNewsStore(): TrendingNewsStore {
return DefaultTrendingNewsStore(store = RuntimeSharedStore())
}
}

View file

@ -1,3 +1,7 @@
package com.tangem.datasource.local.datastore.core
@Deprecated(
message = "Use RuntimeSharedStore instead",
replaceWith = ReplaceWith("RuntimeSharedStore"),
)
internal interface StringKeyDataStore<Value : Any> : DataStore<String, Value>

View file

@ -0,0 +1,37 @@
package com.tangem.datasource.local.news.details
import com.tangem.datasource.local.datastore.RuntimeSharedStore
import com.tangem.domain.models.news.DetailedArticle
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
internal class DefaultNewsDetailsStore(
private val store: RuntimeSharedStore<Map<Int, DetailedArticle>>,
) : NewsDetailsStore {
override fun getAll(): Flow<List<DetailedArticle>> {
return store.get().map { it.values.toList() }
}
override suspend fun getSyncOrNull(id: Int): DetailedArticle? {
return store.getSyncOrNull()?.get(id)
}
override suspend fun store(id: Int, article: DetailedArticle) {
store.update(emptyMap()) { current ->
current + (id to article)
}
}
override suspend fun store(articles: Map<Int, DetailedArticle>) {
if (articles.isEmpty()) return
store.update(emptyMap()) { current ->
current + articles
}
}
override suspend fun clear() {
store.store(emptyMap())
}
}

View file

@ -0,0 +1,17 @@
package com.tangem.datasource.local.news.details
import com.tangem.domain.models.news.DetailedArticle
import kotlinx.coroutines.flow.Flow
interface NewsDetailsStore {
fun getAll(): Flow<List<DetailedArticle>>
suspend fun getSyncOrNull(id: Int): DetailedArticle?
suspend fun store(id: Int, article: DetailedArticle)
suspend fun store(articles: Map<Int, DetailedArticle>)
suspend fun clear()
}

View file

@ -0,0 +1,31 @@
package com.tangem.datasource.local.news.trending
import com.tangem.datasource.local.datastore.RuntimeSharedStore
import com.tangem.domain.models.news.ShortArticle
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
private typealias TrendingCache = Map<String, List<ShortArticle>>
internal class DefaultTrendingNewsStore(
private val store: RuntimeSharedStore<TrendingCache>,
) : TrendingNewsStore {
override fun get(key: String): Flow<List<ShortArticle>> {
return store.get().map { it[key].orEmpty() }
}
override suspend fun getSyncOrNull(key: String): List<ShortArticle>? {
return store.getSyncOrNull()?.get(key)
}
override suspend fun store(key: String, value: List<ShortArticle>) {
store.update(emptyMap()) { current ->
current + (key to value)
}
}
override suspend fun clear() {
store.store(emptyMap())
}
}

View file

@ -0,0 +1,15 @@
package com.tangem.datasource.local.news.trending
import com.tangem.domain.models.news.ShortArticle
import kotlinx.coroutines.flow.Flow
interface TrendingNewsStore {
fun get(key: String): Flow<List<ShortArticle>>
suspend fun getSyncOrNull(key: String): List<ShortArticle>?
suspend fun store(key: String, value: List<ShortArticle>)
suspend fun clear()
}