Updated on 2026-08-14

This commit is contained in:
Tangem 2024-12-17 11:10:17 +05:00
parent c48ddbff25
commit cf53970ba8
12 changed files with 54 additions and 29 deletions

View file

@ -10,7 +10,12 @@ internal data class OnrampAmountBlockUM(
val secondaryFieldModel: OnrampAmountSecondaryFieldUM,
)
internal data class OnrampCurrencyUM(val code: String, val iconUrl: String, val precision: Int, val onClick: () -> Unit)
internal data class OnrampCurrencyUM(
val code: String,
val iconUrl: String?,
val precision: Int,
val onClick: () -> Unit,
)
@Immutable
internal sealed interface OnrampAmountSecondaryFieldUM {

View file

@ -75,7 +75,7 @@ internal class OnrampAmountStateFactory(
return currentState.copy(
amountBlockState = amountState.copy(
secondaryFieldModel = quote.toSecondaryFieldUiModel(amountState),
secondaryFieldModel = quote.toSecondaryFieldUiModel(amountState) ?: amountState.secondaryFieldModel,
),
providerBlockState = quote.toProviderBlockState(isBestRate),
buyButtonConfig = currentState.buyButtonConfig.copy(
@ -175,19 +175,20 @@ internal class OnrampAmountStateFactory(
)
}
private fun OnrampQuote.toSecondaryFieldUiModel(amountState: OnrampAmountBlockUM): OnrampAmountSecondaryFieldUM {
private fun OnrampQuote.toSecondaryFieldUiModel(amountState: OnrampAmountBlockUM): OnrampAmountSecondaryFieldUM? {
return when (this) {
is OnrampQuote.Error -> null
is OnrampQuote.Data -> {
val amount = toAmount.value.format {
crypto(symbol = toAmount.symbol, decimals = toAmount.decimals)
}
OnrampAmountSecondaryFieldUM.Content(stringReference(amount))
}
is OnrampQuote.Error -> this.toSecondaryFieldUiModel(amountState)
is OnrampQuote.AmountError -> this.toSecondaryFieldUiModel(amountState)
}
}
private fun OnrampQuote.Error.toSecondaryFieldUiModel(
private fun OnrampQuote.AmountError.toSecondaryFieldUiModel(
amountState: OnrampAmountBlockUM,
): OnrampAmountSecondaryFieldUM.Error {
val amount = error.requiredAmount.format {

View file

@ -196,6 +196,8 @@ internal class OnrampMainComponentModel @Inject constructor(
private fun subscribeToQuotesUpdate() {
getOnrampQuotesUseCase.invoke()
.distinctUntilChanged()
.conflate()
.onEach { maybeQuotes ->
maybeQuotes.fold(
ifLeft = ::handleOnrampError,
@ -269,7 +271,7 @@ internal class OnrampMainComponentModel @Inject constructor(
}
private fun handleQuoteResult(quotes: List<OnrampQuote>) {
quotes.filterIsInstance<OnrampQuote.Error>().forEach { errorState ->
quotes.filterIsInstance<OnrampQuote.AmountError>().forEach { errorState ->
sendOnrampErrorAnalytic(errorState.error)
}
@ -299,12 +301,12 @@ internal class OnrampMainComponentModel @Inject constructor(
paymentMethod = quote.paymentMethod.name,
),
)
}
_state.update {
amountStateFactory.getAmountSecondaryUpdatedState(
quote = quote,
isBestRate = isBestProvider,
)
_state.update {
amountStateFactory.getAmountSecondaryUpdatedState(
quote = quote,
isBestRate = isBestProvider,
)
}
}
}

View file

@ -20,6 +20,6 @@ sealed class SelectProviderResult {
data class ProviderWithError(
override val paymentMethod: OnrampPaymentMethod,
override val provider: OnrampProvider,
val quoteError: OnrampQuote.Error,
val quoteError: OnrampQuote.AmountError,
) : SelectProviderResult()
}

View file

@ -11,7 +11,7 @@ sealed class OnrampSuccessComponentUM {
data class Content(
val txId: String,
val timestamp: Long,
val currencyImageUrl: String,
val currencyImageUrl: String?,
val fromAmount: TextReference,
val toAmount: TextReference,
val statusBlock: ExpressStatusUM,