Updated on 2026-08-14

This commit is contained in:
Tangem 2024-12-18 23:30:34 +05:00
commit 168619c5c4
6 changed files with 39 additions and 24 deletions

View file

@ -10,7 +10,7 @@ internal interface ConfirmResidencyComponent : ComposableBottomSheetComponent {
data class Params(
val cryptoCurrency: CryptoCurrency,
val country: OnrampCountry,
val onDismiss: (OnrampCountry) -> Unit,
val onDismiss: () -> Unit,
)
interface Factory : ComponentFactory<Params, ConfirmResidencyComponent>

View file

@ -66,11 +66,17 @@ internal class DefaultConfirmResidencyComponent @AssistedInject constructor(
config: ConfirmResidencyBottomSheetConfig,
componentContext: ComponentContext,
): ComposableBottomSheetComponent = when (config) {
ConfirmResidencyBottomSheetConfig.SelectCountry -> selectCountryComponentFactory.create(
is ConfirmResidencyBottomSheetConfig.SelectCountry -> selectCountryComponentFactory.create(
context = childByContext(componentContext),
params = SelectCountryComponent.Params(
cryptoCurrency = params.cryptoCurrency,
onDismiss = model.bottomSheetNavigation::dismiss,
onDismiss = {
// Dismiss country select sheet
model.bottomSheetNavigation.dismiss()
// Dismiss confirm residency sheet
config.onDismiss()
},
),
)
}

View file

@ -6,5 +6,5 @@ import kotlinx.serialization.Serializable
internal sealed class ConfirmResidencyBottomSheetConfig {
@Serializable
data object SelectCountry : ConfirmResidencyBottomSheetConfig()
data class SelectCountry(val onDismiss: () -> Unit) : ConfirmResidencyBottomSheetConfig()
}

View file

@ -10,6 +10,7 @@ import com.tangem.core.decompose.navigation.Router
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.onramp.OnrampSaveDefaultCountryUseCase
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
import com.tangem.domain.onramp.model.OnrampCountry
import com.tangem.features.onramp.confirmresidency.ConfirmResidencyComponent
import com.tangem.features.onramp.confirmresidency.entity.ConfirmResidencyBottomSheetConfig
import com.tangem.features.onramp.confirmresidency.entity.ConfirmResidencyUM
@ -35,7 +36,7 @@ internal class ConfirmResidencyModel @Inject constructor(
country = params.country.name,
countryFlagUrl = params.country.image,
isCountrySupported = params.country.onrampAvailable,
primaryButtonConfig = getPrimaryButtonConfig(),
primaryButtonConfig = getPrimaryButtonConfig(params.country),
secondaryButtonConfig = ConfirmResidencyUM.ActionButtonConfig(
onClick = ::onChangeClick,
text = resourceReference(R.string.common_change),
@ -47,11 +48,12 @@ internal class ConfirmResidencyModel @Inject constructor(
analyticsEventHandler.send(OnrampAnalyticsEvent.ResidenceConfirmScreenOpened(params.country.name))
}
private fun getPrimaryButtonConfig() = if (params.country.onrampAvailable) {
private fun getPrimaryButtonConfig(country: OnrampCountry) = if (country.onrampAvailable) {
ConfirmResidencyUM.ActionButtonConfig(
onClick = {
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceConfirm(params.country.name))
modelScope.launch { saveDefaultCountryUseCase.invoke(params.country) }
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceConfirm(country.name))
modelScope.launch { saveDefaultCountryUseCase.invoke(country) }
params.onDismiss()
},
text = resourceReference(R.string.common_confirm),
)
@ -67,6 +69,6 @@ internal class ConfirmResidencyModel @Inject constructor(
private fun onChangeClick() {
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceChange)
bottomSheetNavigation.activate(ConfirmResidencyBottomSheetConfig.SelectCountry)
bottomSheetNavigation.activate(ConfirmResidencyBottomSheetConfig.SelectCountry(params.onDismiss))
}
}

View file

@ -58,7 +58,7 @@ internal class DefaultOnrampMainComponent @AssistedInject constructor(
country = config.country,
onDismiss = {
model.bottomSheetNavigation.dismiss()
model.handleOnrampAvailable(it.defaultCurrency)
model.handleOnrampAvailable()
},
),
)

View file

@ -19,7 +19,6 @@ import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.onramp.*
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
import com.tangem.domain.onramp.model.OnrampAvailability
import com.tangem.domain.onramp.model.OnrampCurrency
import com.tangem.domain.onramp.model.OnrampProviderWithQuote
import com.tangem.domain.onramp.model.OnrampQuote
import com.tangem.domain.onramp.model.error.OnrampError
@ -105,8 +104,7 @@ internal class OnrampMainComponentModel @Inject constructor(
)
}
fun handleOnrampAvailable(currency: OnrampCurrency) {
_state.update { stateFactory.getReadyState(currency) }
fun handleOnrampAvailable() {
subscribeToCountryAndCurrencyUpdates()
subscribeToQuotesUpdate()
}
@ -125,7 +123,7 @@ internal class OnrampMainComponentModel @Inject constructor(
private fun handleOnrampAvailability(availability: OnrampAvailability) {
when (availability) {
is OnrampAvailability.Available -> handleOnrampAvailable(availability.currency)
is OnrampAvailability.Available -> handleOnrampAvailable()
is OnrampAvailability.ConfirmResidency,
is OnrampAvailability.NotSupported,
-> bottomSheetNavigation.activate(OnrampMainBottomSheetConfig.ConfirmResidency(availability.country))
@ -139,7 +137,13 @@ internal class OnrampMainComponentModel @Inject constructor(
ifLeft = ::handleOnrampError,
ifRight = { country ->
if (country == null) return@onEach
_state.update { amountStateFactory.getUpdatedCurrencyState(country.defaultCurrency) }
_state.update {
if (it is OnrampMainComponentUM.InitialLoading) {
stateFactory.getReadyState(country.defaultCurrency)
} else {
amountStateFactory.getUpdatedCurrencyState(country.defaultCurrency)
}
}
updatePairsAndQuotes()
},
)
@ -278,10 +282,11 @@ internal class OnrampMainComponentModel @Inject constructor(
private fun handleQuoteResult(quotes: List<OnrampQuote>) {
sendOnrampQuotesErrorAnalytic(quotes)
val quote = quotes.firstOrNull()
val quote = quotes.firstOrNull { it !is OnrampQuote.Error }
if (quote == null) {
_state.update { stateFactory.getErrorState() }
lastAmount.value = BigDecimal.ZERO
return
}
@ -295,15 +300,17 @@ internal class OnrampMainComponentModel @Inject constructor(
val isBestProvider = quote == bestProvider && hasBestProvider
if (quote is OnrampQuote.Data && lastAmount.value != quote.fromAmount.value) {
if (lastAmount.value != quote.fromAmount.value) {
lastAmount.value = quote.fromAmount.value
analyticsEventHandler.send(
OnrampAnalyticsEvent.ProviderCalculated(
providerName = quote.provider.info.name,
tokenSymbol = params.cryptoCurrency.symbol,
paymentMethod = quote.paymentMethod.name,
),
)
if (quote is OnrampQuote.Data) {
analyticsEventHandler.send(
OnrampAnalyticsEvent.ProviderCalculated(
providerName = quote.provider.info.name,
tokenSymbol = params.cryptoCurrency.symbol,
paymentMethod = quote.paymentMethod.name,
),
)
}
_state.update {
amountStateFactory.getAmountSecondaryUpdatedState(
quote = quote,