Updated on 2026-08-14
This commit is contained in:
commit
e07f8df56f
6 changed files with 5 additions and 93 deletions
|
|
@ -168,15 +168,6 @@ internal object OnrampDomainModule {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideGetOnrampSelectedPaymentMethodUseCase(
|
|
||||||
onrampRepository: OnrampRepository,
|
|
||||||
onrampErrorResolver: OnrampErrorResolver,
|
|
||||||
): GetOnrampSelectedPaymentMethodUseCase {
|
|
||||||
return GetOnrampSelectedPaymentMethodUseCase(onrampRepository, onrampErrorResolver)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideGetOnrampProviderWithQuoteUseCase(
|
fun provideGetOnrampProviderWithQuoteUseCase(
|
||||||
|
|
@ -186,15 +177,6 @@ internal object OnrampDomainModule {
|
||||||
return GetOnrampProviderWithQuoteUseCase(onrampRepository, onrampErrorResolver)
|
return GetOnrampProviderWithQuoteUseCase(onrampRepository, onrampErrorResolver)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
fun provideOnrampSaveSelectedPaymentMethod(
|
|
||||||
onrampRepository: OnrampRepository,
|
|
||||||
onrampErrorResolver: OnrampErrorResolver,
|
|
||||||
): OnrampSaveSelectedPaymentMethod {
|
|
||||||
return OnrampSaveSelectedPaymentMethod(onrampRepository, onrampErrorResolver)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideOnrampFetchPairsUseCase(
|
fun provideOnrampFetchPairsUseCase(
|
||||||
|
|
|
||||||
|
|
@ -409,17 +409,6 @@ internal class DefaultOnrampRepository(
|
||||||
return quotes.mapTo(hashSetOf(), OnrampQuote::paymentMethod)
|
return quotes.mapTo(hashSetOf(), OnrampQuote::paymentMethod)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun saveSelectedPaymentMethod(paymentMethod: OnrampPaymentMethod) {
|
|
||||||
val dto = paymentMethodsConverter.convertBack(paymentMethod)
|
|
||||||
paymentMethodsStore.store(SELECTED_PAYMENT_METHOD_KEY, listOf(dto))
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getSelectedPaymentMethod(): Flow<OnrampPaymentMethod> {
|
|
||||||
return paymentMethodsStore
|
|
||||||
.get(SELECTED_PAYMENT_METHOD_KEY)
|
|
||||||
.mapNotNull { paymentMethods -> paymentMethods.firstOrNull()?.let(paymentMethodsConverter::convert) }
|
|
||||||
}
|
|
||||||
|
|
||||||
override suspend fun clearCache() = withContext(NonCancellable) {
|
override suspend fun clearCache() = withContext(NonCancellable) {
|
||||||
paymentMethodsStore.clear()
|
paymentMethodsStore.clear()
|
||||||
pairsStore.clear()
|
pairsStore.clear()
|
||||||
|
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
package com.tangem.domain.onramp
|
|
||||||
|
|
||||||
import arrow.core.Either
|
|
||||||
import arrow.core.left
|
|
||||||
import arrow.core.right
|
|
||||||
import com.tangem.domain.core.utils.EitherFlow
|
|
||||||
import com.tangem.domain.onramp.model.OnrampPaymentMethod
|
|
||||||
import com.tangem.domain.onramp.model.error.OnrampError
|
|
||||||
import com.tangem.domain.onramp.repositories.OnrampErrorResolver
|
|
||||||
import com.tangem.domain.onramp.repositories.OnrampRepository
|
|
||||||
import kotlinx.coroutines.flow.catch
|
|
||||||
import kotlinx.coroutines.flow.map
|
|
||||||
|
|
||||||
class GetOnrampSelectedPaymentMethodUseCase(
|
|
||||||
private val repository: OnrampRepository,
|
|
||||||
private val errorResolver: OnrampErrorResolver,
|
|
||||||
) {
|
|
||||||
|
|
||||||
operator fun invoke(): EitherFlow<OnrampError, OnrampPaymentMethod> {
|
|
||||||
return repository.getSelectedPaymentMethod()
|
|
||||||
.map<OnrampPaymentMethod, Either<OnrampError, OnrampPaymentMethod>> { it.right() }
|
|
||||||
.catch {
|
|
||||||
emit(errorResolver.resolve(it).left())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
package com.tangem.domain.onramp
|
|
||||||
|
|
||||||
import arrow.core.Either
|
|
||||||
import com.tangem.domain.onramp.model.OnrampPaymentMethod
|
|
||||||
import com.tangem.domain.onramp.model.error.OnrampError
|
|
||||||
import com.tangem.domain.onramp.repositories.OnrampErrorResolver
|
|
||||||
import com.tangem.domain.onramp.repositories.OnrampRepository
|
|
||||||
|
|
||||||
class OnrampSaveSelectedPaymentMethod(
|
|
||||||
private val repository: OnrampRepository,
|
|
||||||
private val errorResolver: OnrampErrorResolver,
|
|
||||||
) {
|
|
||||||
|
|
||||||
suspend operator fun invoke(paymentMethod: OnrampPaymentMethod): Either<OnrampError, Unit> {
|
|
||||||
return Either.catch { repository.saveSelectedPaymentMethod(paymentMethod) }
|
|
||||||
.mapLeft(errorResolver::resolve)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -41,8 +41,6 @@ interface OnrampRepository {
|
||||||
suspend fun getDefaultCountrySync(): OnrampCountry?
|
suspend fun getDefaultCountrySync(): OnrampCountry?
|
||||||
fun getDefaultCountry(): Flow<OnrampCountry?>
|
fun getDefaultCountry(): Flow<OnrampCountry?>
|
||||||
suspend fun getAvailablePaymentMethods(): Set<OnrampPaymentMethod>
|
suspend fun getAvailablePaymentMethods(): Set<OnrampPaymentMethod>
|
||||||
suspend fun saveSelectedPaymentMethod(paymentMethod: OnrampPaymentMethod)
|
|
||||||
fun getSelectedPaymentMethod(): Flow<OnrampPaymentMethod>
|
|
||||||
fun getQuotes(): Flow<List<OnrampQuote>>
|
fun getQuotes(): Flow<List<OnrampQuote>>
|
||||||
suspend fun getQuotesSync(): List<OnrampQuote>?
|
suspend fun getQuotesSync(): List<OnrampQuote>?
|
||||||
suspend fun clearCache()
|
suspend fun clearCache()
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,6 @@ import com.tangem.core.ui.format.bigdecimal.format
|
||||||
import com.tangem.core.ui.format.bigdecimal.percent
|
import com.tangem.core.ui.format.bigdecimal.percent
|
||||||
import com.tangem.domain.onramp.GetOnrampPaymentMethodsUseCase
|
import com.tangem.domain.onramp.GetOnrampPaymentMethodsUseCase
|
||||||
import com.tangem.domain.onramp.GetOnrampProviderWithQuoteUseCase
|
import com.tangem.domain.onramp.GetOnrampProviderWithQuoteUseCase
|
||||||
import com.tangem.domain.onramp.GetOnrampSelectedPaymentMethodUseCase
|
|
||||||
import com.tangem.domain.onramp.OnrampSaveSelectedPaymentMethod
|
|
||||||
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
||||||
import com.tangem.domain.onramp.model.OnrampPaymentMethod
|
import com.tangem.domain.onramp.model.OnrampPaymentMethod
|
||||||
import com.tangem.domain.onramp.model.OnrampProviderWithQuote
|
import com.tangem.domain.onramp.model.OnrampProviderWithQuote
|
||||||
|
|
@ -36,7 +34,10 @@ import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.flow.update
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
|
|
@ -49,9 +50,7 @@ internal class SelectProviderModel @Inject constructor(
|
||||||
override val dispatchers: CoroutineDispatcherProvider,
|
override val dispatchers: CoroutineDispatcherProvider,
|
||||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||||
private val getOnrampPaymentMethodsUseCase: GetOnrampPaymentMethodsUseCase,
|
private val getOnrampPaymentMethodsUseCase: GetOnrampPaymentMethodsUseCase,
|
||||||
private val getOnrampSelectedPaymentMethodUseCase: GetOnrampSelectedPaymentMethodUseCase,
|
|
||||||
private val getOnrampProviderWithQuoteUseCase: GetOnrampProviderWithQuoteUseCase,
|
private val getOnrampProviderWithQuoteUseCase: GetOnrampProviderWithQuoteUseCase,
|
||||||
private val saveSelectedPaymentMethod: OnrampSaveSelectedPaymentMethod,
|
|
||||||
getUserCountryUseCase: GetUserCountryUseCase,
|
getUserCountryUseCase: GetUserCountryUseCase,
|
||||||
paramsContainer: ParamsContainer,
|
paramsContainer: ParamsContainer,
|
||||||
) : Model() {
|
) : Model() {
|
||||||
|
|
@ -70,7 +69,6 @@ internal class SelectProviderModel @Inject constructor(
|
||||||
analyticsEventHandler.send(OnrampAnalyticsEvent.ProvidersScreenOpened)
|
analyticsEventHandler.send(OnrampAnalyticsEvent.ProvidersScreenOpened)
|
||||||
getPaymentMethods()
|
getPaymentMethods()
|
||||||
getProviders(params.selectedPaymentMethod)
|
getProviders(params.selectedPaymentMethod)
|
||||||
subscribeToPaymentMethodUpdates()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getPaymentMethods() {
|
private fun getPaymentMethods() {
|
||||||
|
|
@ -104,17 +102,6 @@ internal class SelectProviderModel @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun subscribeToPaymentMethodUpdates() {
|
|
||||||
getOnrampSelectedPaymentMethodUseCase.invoke()
|
|
||||||
.onEach { maybePaymentMethod ->
|
|
||||||
maybePaymentMethod.fold(
|
|
||||||
ifLeft = ::sendOnrampErrorEvent,
|
|
||||||
ifRight = ::getProviders,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.launchIn(modelScope)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getProviders(paymentMethod: OnrampPaymentMethod) {
|
private fun getProviders(paymentMethod: OnrampPaymentMethod) {
|
||||||
modelScope.launch {
|
modelScope.launch {
|
||||||
getOnrampProviderWithQuoteUseCase.invoke(paymentMethod)
|
getOnrampProviderWithQuoteUseCase.invoke(paymentMethod)
|
||||||
|
|
@ -176,7 +163,6 @@ internal class SelectProviderModel @Inject constructor(
|
||||||
val firstProvider = methodContainer.providers.firstOrNull()
|
val firstProvider = methodContainer.providers.firstOrNull()
|
||||||
analyticsEventHandler.send(OnrampAnalyticsEvent.OnPaymentMethodChosen(paymentMethod = paymentMethod.name))
|
analyticsEventHandler.send(OnrampAnalyticsEvent.OnPaymentMethodChosen(paymentMethod = paymentMethod.name))
|
||||||
modelScope.launch {
|
modelScope.launch {
|
||||||
saveSelectedPaymentMethod.invoke(paymentMethod)
|
|
||||||
_state.update { state ->
|
_state.update { state ->
|
||||||
state.copy(
|
state.copy(
|
||||||
selectedPaymentMethod = state.selectedPaymentMethod.copy(
|
selectedPaymentMethod = state.selectedPaymentMethod.copy(
|
||||||
|
|
@ -184,6 +170,7 @@ internal class SelectProviderModel @Inject constructor(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
getProviders(paymentMethod)
|
||||||
if (firstProvider is ProviderListItemUM.Available) {
|
if (firstProvider is ProviderListItemUM.Available) {
|
||||||
onProviderSelected(firstProvider.providerResult, firstProvider.isBestRate)
|
onProviderSelected(firstProvider.providerResult, firstProvider.isBestRate)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue