Updated on 2026-08-14

This commit is contained in:
Tangem 2025-10-02 11:15:26 +02:00
parent edbc2d8463
commit fb9bfa5258
3 changed files with 88 additions and 1 deletions

View file

@ -179,6 +179,20 @@ internal object OnrampDomainModule {
)
}
@Provides
@Singleton
fun provideGetOnrampV2QuotesUseCase(
settingsRepository: SettingsRepository,
onrampRepository: OnrampRepository,
onrampErrorResolver: OnrampErrorResolver,
): GetOnrampV2QuotesUseCase {
return GetOnrampV2QuotesUseCase(
settingsRepository = settingsRepository,
repository = onrampRepository,
errorResolver = onrampErrorResolver,
)
}
@Provides
@Singleton
fun provideGetOnrampProviderWithQuoteUseCase(

View file

@ -0,0 +1,73 @@
package com.tangem.domain.onramp
import arrow.core.Either
import arrow.core.left
import arrow.core.right
import com.tangem.domain.onramp.model.OnrampQuote
import com.tangem.domain.onramp.model.error.OnrampError
import com.tangem.domain.onramp.repositories.OnrampErrorResolver
import com.tangem.domain.onramp.repositories.OnrampRepository
import com.tangem.domain.settings.repositories.SettingsRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
import java.math.BigDecimal
import java.util.Comparator
class GetOnrampV2QuotesUseCase(
private val settingsRepository: SettingsRepository,
private val repository: OnrampRepository,
private val errorResolver: OnrampErrorResolver,
) {
operator fun invoke(): Flow<Either<OnrampError, List<OnrampQuote>>> {
return repository.getQuotes()
.map<List<OnrampQuote>, Either<OnrampError, List<OnrampQuote>>> { quotes ->
val isGooglePayAvailable = settingsRepository.isGooglePayAvailability()
quotes.sortedWith(
Comparator.comparing<OnrampQuote, SortableBigDecimalWrapper> { quote ->
getQuoteSortPriority(quote)
}
.thenComparingInt { quote ->
quote.paymentMethod.type.getPriority(isGooglePayAvailable)
},
).right()
}
.catch {
emit(errorResolver.resolve(it).left())
}
}
private class SortableBigDecimalWrapper(
val value: BigDecimal?,
val negateForSort: Boolean = false,
) : Comparable<SortableBigDecimalWrapper> {
override fun compareTo(other: SortableBigDecimalWrapper): Int {
return when {
value == null && other.value == null -> 0
value == null -> 1
other.value == null -> -1
else -> {
val thisValue = if (negateForSort) value.negate() else value
val otherValue = if (other.negateForSort) other.value.negate() else other.value
thisValue.compareTo(otherValue)
}
}
}
}
private fun getQuoteSortPriority(quote: OnrampQuote): SortableBigDecimalWrapper {
return when (quote) {
is OnrampQuote.Data -> SortableBigDecimalWrapper(quote.toAmount.value, negateForSort = true)
is OnrampQuote.Error -> SortableBigDecimalWrapper(null)
is OnrampQuote.AmountError -> {
when (val error = quote.error) {
is OnrampError.AmountError.TooSmallError ->
SortableBigDecimalWrapper((quote.fromAmount.value - error.requiredAmount).abs())
is OnrampError.AmountError.TooBigError ->
SortableBigDecimalWrapper((error.requiredAmount - quote.fromAmount.value).abs())
}
}
}
}
}

View file

@ -41,7 +41,7 @@ internal class OnrampV2MainComponentModel @Inject constructor(
private val getOnrampCountryUseCase: GetOnrampCountryUseCase,
private val clearOnrampCacheUseCase: ClearOnrampCacheUseCase,
private val fetchQuotesUseCase: OnrampFetchQuotesUseCase,
private val getOnrampQuotesUseCase: GetOnrampQuotesUseCase,
private val getOnrampQuotesUseCase: GetOnrampV2QuotesUseCase,
private val fetchPairsUseCase: OnrampFetchPairsUseCase,
private val amountInputManager: InputManager,
private val getOnrampOffersUseCase: GetOnrampOffersUseCase,