Updated on 2026-08-14

This commit is contained in:
Tangem 2024-12-05 12:45:38 +05:00
parent d71d29b72b
commit b750588ef9
21 changed files with 277 additions and 67 deletions

View file

@ -1,5 +1,6 @@
package com.tangem.features.onramp.main.model
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.res.stringResource
import com.arkivanov.decompose.router.slot.SlotNavigation
import com.arkivanov.decompose.router.slot.activate
@ -19,6 +20,7 @@ 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.wallets.usecase.GetWalletsUseCase
import com.tangem.features.onramp.impl.R
import com.tangem.features.onramp.main.OnrampMainComponent
@ -34,6 +36,7 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import timber.log.Timber
import java.math.BigDecimal
import javax.inject.Inject
@Suppress("LongParameterList")
@ -73,6 +76,8 @@ internal class OnrampMainComponentModel @Inject constructor(
val state: StateFlow<OnrampMainComponentUM> get() = _state.asStateFlow()
val bottomSheetNavigation: SlotNavigation<OnrampMainBottomSheetConfig> = SlotNavigation()
private val lastAmount = mutableStateOf(BigDecimal.ZERO)
init {
sendScreenOpenAnalytics()
checkResidenceCountry()
@ -83,7 +88,7 @@ internal class OnrampMainComponentModel @Inject constructor(
analyticsEventHandler.send(
OnrampAnalyticsEvent.ScreenOpened(
source = params.source,
cryptoCurrency = params.cryptoCurrency.name,
tokenSymbol = params.cryptoCurrency.symbol,
),
)
}
@ -143,6 +148,16 @@ internal class OnrampMainComponentModel @Inject constructor(
getOnrampQuotesUseCase.invoke()
.onEach { maybeQuotes ->
val quote = maybeQuotes.getOrNull()?.firstOrNull() ?: return@onEach
if (quote is OnrampQuote.Data && 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,
),
)
}
_state.update { amountStateFactory.getAmountSecondaryUpdatedState(quote) }
}
.launchIn(modelScope)
@ -166,7 +181,7 @@ internal class OnrampMainComponentModel @Inject constructor(
OnrampAnalyticsEvent.OnBuyClick(
providerName = quote.provider.info.name,
currency = currentContentState.amountBlockState.currencyUM.code,
cryptoCurrency = params.cryptoCurrency.name,
tokenSymbol = params.cryptoCurrency.symbol,
),
)
params.openRedirectPage(quote)

View file

@ -108,7 +108,7 @@ internal class SelectProviderModel @Inject constructor(
}
private fun onPaymentMethodSelected(paymentMethod: OnrampPaymentMethod) {
analyticsEventHandler.send(OnrampAnalyticsEvent.OnPaymentMethodChosen)
analyticsEventHandler.send(OnrampAnalyticsEvent.OnPaymentMethodChosen(paymentMethod = paymentMethod.name))
modelScope.launch {
saveSelectedPaymentMethod.invoke(paymentMethod)
_state.update { state ->
@ -141,7 +141,7 @@ internal class SelectProviderModel @Inject constructor(
analyticsEventHandler.send(
OnrampAnalyticsEvent.OnProviderChosen(
providerName = quote.provider.info.name,
cryptoCurrency = params.cryptoCurrency.name,
tokenSymbol = params.cryptoCurrency.symbol,
),
)
params.onProviderClick(quote)

View file

@ -1,12 +1,14 @@
package com.tangem.features.onramp.success.model
import arrow.core.getOrElse
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.domain.onramp.GetOnrampStatusUseCase
import com.tangem.domain.onramp.GetOnrampTransactionUseCase
import com.tangem.domain.onramp.OnrampRemoveTransactionUseCase
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
import com.tangem.domain.onramp.model.OnrampStatus
import com.tangem.domain.onramp.model.cache.OnrampTransaction
import com.tangem.domain.tokens.GetCryptoCurrencyUseCase
@ -31,6 +33,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
private val getOnrampStatusUseCase: GetOnrampStatusUseCase,
private val getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase,
private val onrampRemoveTransactionUseCase: OnrampRemoveTransactionUseCase,
private val analyticsEventHandler: AnalyticsEventHandler,
paramsContainer: ParamsContainer,
) : Model(), OnrampSuccessClickIntents {
@ -64,7 +67,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
}
private suspend fun loadTransactionStatus(transaction: OnrampTransaction) {
val cryptoCurrencies = getCryptoCurrencyUseCase(
val cryptoCurrency = getCryptoCurrencyUseCase(
transaction.userWalletId,
transaction.toCurrencyId,
).getOrElse { error("Crypto currency not found") }
@ -75,9 +78,18 @@ internal class OnrampSuccessComponentModel @Inject constructor(
Timber.e(it.toString())
},
ifRight = { status ->
analyticsEventHandler.send(
OnrampAnalyticsEvent.SuccessScreenOpened(
providerName = transaction.providerName,
currency = transaction.fromCurrency.code,
tokenSymbol = cryptoCurrency.symbol,
residence = transaction.residency,
paymentMethod = transaction.paymentMethod,
),
)
_state.update {
SetOnrampSuccessContentConverter(
cryptoCurrency = cryptoCurrencies,
cryptoCurrency = cryptoCurrency,
transaction = transaction,
goToProviderClick = ::goToProviderClick,
).convert(status)