Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-07 08:48:37 +01:00
parent 714eb51ce5
commit d5ca4e59b5
5 changed files with 49 additions and 14 deletions

View file

@ -5,6 +5,7 @@ import java.math.BigDecimal
data class OnrampOffersBlock(
val category: OnrampOfferCategory,
val offers: List<OnrampOffer>,
val hasMoreOffers: Boolean,
)
data class OnrampOffer(

View file

@ -63,6 +63,7 @@ class GetOnrampOffersUseCase(
recentOffer = recentOffer,
bestRateOffer = bestRateOffer,
fastestOffer = fastestOffer,
allOffers = offers,
)
}
@ -142,13 +143,20 @@ class GetOnrampOffersUseCase(
recentOffer: OnrampOffer?,
bestRateOffer: OnrampOffer?,
fastestOffer: OnrampOffer?,
allOffers: List<OnrampOffer>,
): List<OnrampOffersBlock> {
val isSingleOffer = allOffers.size == 1
val recommendedOffers = buildRecommendedOffers(
recentOffer = recentOffer,
bestRateOffer = bestRateOffer,
fastestOffer = fastestOffer,
isSingleOffer = isSingleOffer,
)
val shownOffersCount = (if (recentOffer != null) 1 else 0) + recommendedOffers.size
val hasMoreOffers = allOffers.size > shownOffersCount
return buildList {
if (recentOffer != null) {
add(
@ -160,10 +168,12 @@ class GetOnrampOffersUseCase(
recentOffer,
bestRateOffer,
fastestOffer,
isSingleOffer,
),
rateDif = if (bestRateOffer != null) recentOffer.rateDif else null,
),
),
hasMoreOffers = false,
),
)
}
@ -173,6 +183,7 @@ class GetOnrampOffersUseCase(
OnrampOffersBlock(
category = OnrampOfferCategory.Recommended,
offers = recommendedOffers,
hasMoreOffers = hasMoreOffers,
),
)
}
@ -183,7 +194,11 @@ class GetOnrampOffersUseCase(
recentOffer: OnrampOffer,
bestRateOffer: OnrampOffer?,
fastestOffer: OnrampOffer?,
isSingleOffer: Boolean,
): OnrampOfferAdvantages {
if (isSingleOffer) {
return OnrampOfferAdvantages.Default
}
if (isSameOffer(recentOffer, bestRateOffer) && isSameOffer(recentOffer, fastestOffer)) {
return OnrampOfferAdvantages.GreatRate
}
@ -200,13 +215,18 @@ class GetOnrampOffersUseCase(
recentOffer: OnrampOffer?,
bestRateOffer: OnrampOffer?,
fastestOffer: OnrampOffer?,
isSingleOffer: Boolean,
): List<OnrampOffer> {
return buildList {
if (isSameOffer(bestRateOffer, fastestOffer)) {
if (bestRateOffer != null && !isSameOffer(bestRateOffer, recentOffer)) {
add(
bestRateOffer.copy(
advantages = OnrampOfferAdvantages.GreatRate,
advantages = if (isSingleOffer) {
OnrampOfferAdvantages.Default
} else {
OnrampOfferAdvantages.GreatRate
},
rateDif = null,
),
)
@ -215,7 +235,11 @@ class GetOnrampOffersUseCase(
if (bestRateOffer != null && !isSameOffer(bestRateOffer, recentOffer)) {
add(
bestRateOffer.copy(
advantages = OnrampOfferAdvantages.GreatRate,
advantages = if (isSingleOffer) {
OnrampOfferAdvantages.Default
} else {
OnrampOfferAdvantages.GreatRate
},
rateDif = null,
),
)
@ -226,7 +250,11 @@ class GetOnrampOffersUseCase(
) {
add(
fastestOffer.copy(
advantages = OnrampOfferAdvantages.Fastest,
advantages = if (isSingleOffer) {
OnrampOfferAdvantages.Default
} else {
OnrampOfferAdvantages.Fastest
},
rateDif = if (bestRateOffer != null) fastestOffer.rateDif else null,
),
)

View file

@ -16,7 +16,7 @@ internal sealed interface OnrampOffersBlockUM {
data class Content(
val recentOffer: OnrampOfferUM?,
val recommended: ImmutableList<OnrampOfferUM>,
val onrampAllOffersButtonConfig: OnrampAllOffersButtonConfig,
val onrampAllOffersButtonConfig: OnrampAllOffersButtonConfig?,
) : OnrampOffersBlockUM
}

View file

@ -76,10 +76,14 @@ internal class OnrampOffersStateFactory(
return OnrampOffersBlockUM.Content(
recentOffer = allOffersUM.firstOrNull { it.category == OnrampOfferCategoryUM.RecentlyUsed },
recommended = allOffersUM.filter { it.category == OnrampOfferCategoryUM.Recommended }.toPersistentList(),
onrampAllOffersButtonConfig = OnrampAllOffersButtonConfig(
title = TextReference.Res(R.string.onramp_all_offers_button_title),
onClick = { onrampIntents.openProviders() },
),
onrampAllOffersButtonConfig = if (offersBlocks.any { it.hasMoreOffers }) {
OnrampAllOffersButtonConfig(
title = TextReference.Res(R.string.onramp_all_offers_button_title),
onClick = { onrampIntents.openProviders() },
)
} else {
null
},
)
}

View file

@ -79,12 +79,14 @@ internal fun OnrampOffersContent(state: OnrampOffersBlockUM) {
}
}
SpacerH(12.dp)
SecondaryButton(
modifier = Modifier.fillMaxWidth(),
text = state.onrampAllOffersButtonConfig.title.resolveReference(),
onClick = state.onrampAllOffersButtonConfig.onClick,
)
state.onrampAllOffersButtonConfig?.let {
SpacerH(12.dp)
SecondaryButton(
modifier = Modifier.fillMaxWidth(),
text = it.title.resolveReference(),
onClick = it.onClick,
)
}
}
}
OnrampOffersBlockUM.Loading -> {