Updated on 2026-08-14

This commit is contained in:
Tangem 2024-12-17 17:10:14 +05:00
parent f6151916ad
commit fb5c125110
9 changed files with 49 additions and 10 deletions

View file

@ -468,6 +468,7 @@ internal class DefaultOnrampRepository(
OnrampQuote.Error(
paymentMethod = paymentMethod,
provider = provider,
error = onrampError,
)
}
} else {

View file

@ -26,5 +26,6 @@ sealed class OnrampQuote {
data class Error(
override val paymentMethod: OnrampPaymentMethod,
override val provider: OnrampProvider,
val error: OnrampError,
) : OnrampQuote()
}

View file

@ -1,7 +1,6 @@
package com.tangem.domain.onramp.analytics
import com.tangem.core.analytics.models.AnalyticsEvent
import com.tangem.core.analytics.models.AnalyticsParam.Key.CURRENCY
import com.tangem.core.analytics.models.AnalyticsParam.Key.ERROR_CODE
import com.tangem.core.analytics.models.AnalyticsParam.Key.ERROR_DESCRIPTION
import com.tangem.core.analytics.models.AnalyticsParam.Key.PAYMENT_METHOD
@ -37,7 +36,7 @@ sealed class OnrampAnalyticsEvent(
private val currency: String,
) : OnrampAnalyticsEvent(
event = "Currency Chosen",
params = mapOf(CURRENCY to currency),
params = mapOf("Currency Type" to currency),
)
data object CloseOnramp : OnrampAnalyticsEvent(event = "Button - Close")
@ -114,7 +113,7 @@ sealed class OnrampAnalyticsEvent(
event = "Button - Buy",
params = mapOf(
PROVIDER to providerName,
CURRENCY to currency,
"Currency Type" to currency,
TOKEN_PARAM to tokenSymbol,
),
)
@ -131,7 +130,7 @@ sealed class OnrampAnalyticsEvent(
TOKEN_PARAM to tokenSymbol,
PROVIDER to providerName,
RESIDENCE to residence,
CURRENCY to currency,
"Currency Type" to currency,
PAYMENT_METHOD to paymentMethod,
),
)
@ -143,11 +142,13 @@ sealed class OnrampAnalyticsEvent(
private val tokenSymbol: String,
private val errorCode: String,
private val providerName: String?,
private val paymentMethod: String?,
) : OnrampAnalyticsEvent(
event = "Errors",
params = buildMap {
put(TOKEN_PARAM, tokenSymbol)
providerName?.let { put(PROVIDER, providerName) }
paymentMethod?.let { put(PAYMENT_METHOD, paymentMethod) }
put(ERROR_CODE, errorCode)
},
)

View file

@ -204,7 +204,7 @@ internal class OnrampAmountStateFactory(
R.string.onramp_max_amount_restriction
}
is OnrampError.AmountError.TooSmallError -> {
analyticsEventHandler.send(OnrampAnalyticsEvent.MaxAmountError)
analyticsEventHandler.send(OnrampAnalyticsEvent.MinAmountError)
R.string.onramp_min_amount_restriction
}
}

View file

@ -81,7 +81,7 @@ internal class OnrampMainComponentModel @Inject constructor(
private val _state: MutableStateFlow<OnrampMainComponentUM> = MutableStateFlow(
value = stateFactory.getInitialState(
currency = params.cryptoCurrency.name,
onClose = router::pop,
onClose = ::onCloseClick,
),
)
private val quotesTaskScheduler = SingleTaskScheduler<Unit>()
@ -270,10 +270,13 @@ internal class OnrampMainComponentModel @Inject constructor(
super.onDestroy()
}
private fun onCloseClick() {
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp)
router.pop()
}
private fun handleQuoteResult(quotes: List<OnrampQuote>) {
quotes.filterIsInstance<OnrampQuote.AmountError>().forEach { errorState ->
sendOnrampErrorAnalytic(errorState.error)
}
sendOnrampQuotesErrorAnalytic(quotes)
val quote = quotes.firstOrNull()
@ -346,9 +349,30 @@ internal class OnrampMainComponentModel @Inject constructor(
error = error,
tokenSymbol = params.cryptoCurrency.symbol,
providerName = providerContent?.providerName,
paymentMethod = providerContent?.paymentMethod?.name,
)
}
private fun sendOnrampQuotesErrorAnalytic(quotes: List<OnrampQuote>) {
quotes.forEach { errorState ->
when (errorState) {
is OnrampQuote.Error -> analyticsEventHandler.sendOnrampErrorEvent(
error = errorState.error,
tokenSymbol = params.cryptoCurrency.symbol,
providerName = errorState.provider.info.name,
paymentMethod = errorState.paymentMethod.name,
)
is OnrampQuote.AmountError -> analyticsEventHandler.sendOnrampErrorEvent(
error = errorState.error,
tokenSymbol = params.cryptoCurrency.symbol,
providerName = errorState.provider.info.name,
paymentMethod = errorState.paymentMethod.name,
)
else -> { /* no-op */ }
}
}
}
private companion object {
const val UPDATE_DELAY = 10_000L
}

View file

@ -259,6 +259,7 @@ internal class SelectProviderModel @Inject constructor(
error = error,
tokenSymbol = params.cryptoCurrency.symbol,
providerName = selectedProvider?.name,
paymentMethod = state.value.selectedPaymentMethod.paymentMethod.name,
)
}

View file

@ -84,6 +84,7 @@ internal class OnrampRedirectModel @Inject constructor(
error = error,
tokenSymbol = params.cryptoCurrency.symbol,
providerName = params.onrampProviderWithQuote.provider.info.name,
paymentMethod = params.onrampProviderWithQuote.paymentMethod.name,
)
val contentMessage = ContentMessage { onDismiss ->
BasicDialog(

View file

@ -81,6 +81,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
error = error,
tokenSymbol = cryptoCurrency.symbol,
providerName = transaction.providerName,
paymentMethod = transaction.paymentMethod,
)
Timber.e(error.toString())
},
@ -101,7 +102,12 @@ internal class OnrampSuccessComponentModel @Inject constructor(
goToProviderClick = ::goToProviderClick,
).convert(status)
}
removeTransactionIfTerminalStatus(cryptoCurrency, transaction.providerName, status)
removeTransactionIfTerminalStatus(
cryptoCurrency = cryptoCurrency,
providerName = transaction.providerName,
paymentMethod = transaction.paymentMethod,
status = status,
)
},
)
}
@ -109,6 +115,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
private fun removeTransactionIfTerminalStatus(
cryptoCurrency: CryptoCurrency,
providerName: String,
paymentMethod: String,
status: OnrampStatus,
) {
modelScope.launch {
@ -118,6 +125,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
error = error,
tokenSymbol = cryptoCurrency.symbol,
providerName = providerName,
paymentMethod = paymentMethod,
)
}
}

View file

@ -8,11 +8,13 @@ internal fun AnalyticsEventHandler.sendOnrampErrorEvent(
error: OnrampError,
tokenSymbol: String,
providerName: String? = null,
paymentMethod: String? = null,
) = when (error) {
is OnrampError.DataError -> send(
OnrampAnalyticsEvent.Errors(
tokenSymbol = tokenSymbol,
providerName = providerName,
paymentMethod = paymentMethod,
errorCode = error.code,
),
)