Updated on 2026-08-14
This commit is contained in:
parent
96154e6983
commit
18201957b1
22 changed files with 460 additions and 18 deletions
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue