Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-27 16:35:45 +07:00
parent bd699c5bd9
commit ef5d0fec78
40 changed files with 600 additions and 642 deletions

View file

@ -1,6 +1,8 @@
package com.tangem.data.quotes.di
import com.tangem.data.quotes.multi.DefaultMultiQuoteStatusProducer
import com.tangem.data.quotes.single.DefaultSingleQuoteStatusProducer
import com.tangem.domain.quotes.multi.MultiQuoteStatusProducer
import com.tangem.domain.quotes.single.SingleQuoteStatusProducer
import dagger.Binds
import dagger.Module
@ -17,4 +19,10 @@ internal interface QuoteStatusProducerFactoryModule {
fun bindSingleQuoteStatusProducerFactory(
impl: DefaultSingleQuoteStatusProducer.Factory,
): SingleQuoteStatusProducer.Factory
@Binds
@Singleton
fun bindMultiQuoteStatusProducerFactory(
impl: DefaultMultiQuoteStatusProducer.Factory,
): MultiQuoteStatusProducer.Factory
}

View file

@ -1,5 +1,7 @@
package com.tangem.data.quotes.di
import com.tangem.domain.quotes.multi.MultiQuoteStatusProducer
import com.tangem.domain.quotes.multi.MultiQuoteStatusSupplier
import com.tangem.domain.quotes.single.SingleQuoteStatusProducer
import com.tangem.domain.quotes.single.SingleQuoteStatusSupplier
import dagger.Module
@ -20,4 +22,13 @@ internal object QuoteStatusSupplierModule {
keyCreator = { "single_quote_${it.rawCurrencyId.value}" },
) {}
}
@Provides
@Singleton
fun provideMultiQuoteStatusSupplier(factory: MultiQuoteStatusProducer.Factory): MultiQuoteStatusSupplier {
return object : MultiQuoteStatusSupplier(
factory = factory,
keyCreator = { "multi_quote_status_supplier" },
) {}
}
}

View file

@ -0,0 +1,37 @@
package com.tangem.data.quotes.multi
import arrow.core.Option
import arrow.core.none
import com.tangem.data.quotes.store.QuotesStatusesStore
import com.tangem.domain.core.flow.FlowProducerTools
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.quote.QuoteStatus
import com.tangem.domain.quotes.multi.MultiQuoteStatusProducer
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
internal class DefaultMultiQuoteStatusProducer @AssistedInject constructor(
@Assisted val params: Unit,
override val flowProducerTools: FlowProducerTools,
private val quotesStatusesStore: QuotesStatusesStore,
private val dispatchers: CoroutineDispatcherProvider,
) : MultiQuoteStatusProducer {
override val fallback: Option<Map<CryptoCurrency.RawID, QuoteStatus>> = none()
override fun produce(): Flow<Map<CryptoCurrency.RawID, QuoteStatus>> {
return quotesStatusesStore.get()
.map { statuses -> statuses.associateBy(QuoteStatus::rawCurrencyId) }
.flowOn(dispatchers.default)
}
@AssistedFactory
interface Factory : MultiQuoteStatusProducer.Factory {
override fun create(params: Unit): DefaultMultiQuoteStatusProducer
}
}

View file

@ -3,6 +3,7 @@ package com.tangem.data.quotes.single
import arrow.core.Option
import arrow.core.some
import com.tangem.data.quotes.store.QuotesStatusesStore
import com.tangem.domain.core.flow.FlowProducerTools
import com.tangem.domain.models.quote.QuoteStatus
import com.tangem.domain.quotes.single.SingleQuoteStatusProducer
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -10,7 +11,6 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.mapNotNull
@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.mapNotNull
*/
internal class DefaultSingleQuoteStatusProducer @AssistedInject constructor(
@Assisted val params: SingleQuoteStatusProducer.Params,
override val flowProducerTools: FlowProducerTools,
private val quotesStatusesStore: QuotesStatusesStore,
private val dispatchers: CoroutineDispatcherProvider,
) : SingleQuoteStatusProducer {
@ -32,7 +33,6 @@ internal class DefaultSingleQuoteStatusProducer @AssistedInject constructor(
override fun produce(): Flow<QuoteStatus> {
return quotesStatusesStore.get()
.mapNotNull { quotes -> quotes.firstOrNull { it.rawCurrencyId == params.rawCurrencyId } ?: default }
.distinctUntilChanged()
.flowOn(dispatchers.default)
}

View file

@ -2,6 +2,7 @@ package com.tangem.data.quotes.single
import com.google.common.truth.Truth
import com.tangem.data.quotes.store.QuotesStatusesStore
import com.tangem.domain.core.flow.FlowProducerTools
import com.tangem.domain.models.StatusSource
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.quote.QuoteStatus
@ -26,10 +27,12 @@ internal class DefaultSingleQuoteStatusProducerTest {
)
private val quotesStore = mockk<QuotesStatusesStore>()
private val flowProducerTools: FlowProducerTools = mockk()
private val producer = DefaultSingleQuoteStatusProducer(
params = params,
quotesStatusesStore = quotesStore,
flowProducerTools = flowProducerTools,
dispatchers = TestingCoroutineDispatcherProvider(),
)