Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-11 18:49:21 +05:00
parent e48ff5956d
commit 2633d562b5
6 changed files with 26 additions and 18 deletions

View file

@ -8,42 +8,47 @@ sealed class TangemPayAnalyticsEvents(
params: Map<String, String> = emptyMap(), params: Map<String, String> = emptyMap(),
) : AnalyticsEvent(category = categoryName, event = event, params = params) { ) : AnalyticsEvent(category = categoryName, event = event, params = params) {
data object ActivationScreenOpened : TangemPayAnalyticsEvents( class ActivationScreenOpened : TangemPayAnalyticsEvents(
categoryName = "Visa Onboarding", categoryName = "Visa Onboarding",
event = "Activation Screen Opened", event = "Visa Activation Screen Opened",
) )
data object ViewTermsClicked : TangemPayAnalyticsEvents( class ViewTermsClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Onboarding", categoryName = "Visa Onboarding",
event = "Button - Visa View Terms", event = "Button - Visa View Terms",
) )
data object GetCardClicked : TangemPayAnalyticsEvents( class GetCardClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Onboarding", categoryName = "Visa Onboarding",
event = "Button - Visa Get Card", event = "Button - Visa Get Card",
) )
data object KycFlowOpened : TangemPayAnalyticsEvents( class KycFlowOpened : TangemPayAnalyticsEvents(
categoryName = "Visa Onboarding", categoryName = "Visa Onboarding",
event = "Visa KYC Flow Opened", event = "Visa KYC Flow Opened",
) )
data object IssuingBannerDisplayed : TangemPayAnalyticsEvents( class IssuingBannerDisplayed : TangemPayAnalyticsEvents(
categoryName = "Visa Onboarding", categoryName = "Visa Onboarding",
event = "Visa Issuing Banner Displayed", event = "Visa Issuing Banner Displayed",
) )
data object MainScreenOpened : TangemPayAnalyticsEvents( class MainScreenOpened : TangemPayAnalyticsEvents(
categoryName = "Visa Screen", categoryName = "Visa Screen",
event = "Visa Main Screen Opened", event = "Visa Main Screen Opened",
) )
data object ReceiveFundsClicked : TangemPayAnalyticsEvents( class AddFundsClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Visa Add Funds",
)
class ReceiveFundsClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen", categoryName = "Visa Screen",
event = "Button - Visa Receive", event = "Button - Visa Receive",
) )
data object SwapClicked : TangemPayAnalyticsEvents( class SwapClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen", categoryName = "Visa Screen",
event = "Button - Visa Swap", event = "Button - Visa Swap",
) )

View file

@ -30,7 +30,7 @@ class DefaultKycModel @Inject constructor(
val uiState = _uiState.asStateFlow() val uiState = _uiState.asStateFlow()
init { init {
analytics.send(TangemPayAnalyticsEvents.KycFlowOpened) analytics.send(TangemPayAnalyticsEvents.KycFlowOpened())
modelScope.launch { modelScope.launch {
try { try {
kycRepository.getKycStartInfo(params.userWalletId).getOrNull()?.let { _uiState.emit(it) } kycRepository.getKycStartInfo(params.userWalletId).getOrNull()?.let { _uiState.emit(it) }

View file

@ -101,6 +101,7 @@ internal class TangemPayDetailsModel @Inject constructor(
val bottomSheetNavigation: SlotNavigation<TangemPayDetailsNavigation> = SlotNavigation() val bottomSheetNavigation: SlotNavigation<TangemPayDetailsNavigation> = SlotNavigation()
init { init {
analytics.send(TangemPayAnalyticsEvents.MainScreenOpened())
handleBalanceHiding() handleBalanceHiding()
fetchAddToWalletBanner() fetchAddToWalletBanner()
fetchBalance() fetchBalance()
@ -212,6 +213,7 @@ internal class TangemPayDetailsModel @Inject constructor(
} }
override fun onClickAddFunds() { override fun onClickAddFunds() {
analytics.send(TangemPayAnalyticsEvents.AddFundsClicked())
val currentBalance = balance val currentBalance = balance
val depositAddress = currentBalance?.depositAddress val depositAddress = currentBalance?.depositAddress
if (currentBalance == null || depositAddress == null) { if (currentBalance == null || depositAddress == null) {
@ -352,7 +354,7 @@ internal class TangemPayDetailsModel @Inject constructor(
} }
override fun onClickSwap(data: TangemPayTopUpData) { override fun onClickSwap(data: TangemPayTopUpData) {
analytics.send(TangemPayAnalyticsEvents.SwapClicked) analytics.send(TangemPayAnalyticsEvents.SwapClicked())
bottomSheetNavigation.dismiss() bottomSheetNavigation.dismiss()
router.push( router.push(
AppRoute.Swap( AppRoute.Swap(
@ -371,7 +373,7 @@ internal class TangemPayDetailsModel @Inject constructor(
} }
override fun onClickReceive(data: TangemPayTopUpData) { override fun onClickReceive(data: TangemPayTopUpData) {
analytics.send(TangemPayAnalyticsEvents.ReceiveFundsClicked) analytics.send(TangemPayAnalyticsEvents.ReceiveFundsClicked())
bottomSheetNavigation.dismiss() bottomSheetNavigation.dismiss()
val config = TokenReceiveConfig( val config = TokenReceiveConfig(
shouldShowWarning = false, shouldShowWarning = false,

View file

@ -234,7 +234,7 @@ internal object TangemPayTxHistoryDetailsConverter :
) )
is TangemPayTxHistoryItem.Spend -> persistentListOf( is TangemPayTxHistoryItem.Spend -> persistentListOf(
ButtonState( ButtonState(
text = resourceReference(R.string.tangem_pay_dispute), text = resourceReference(R.string.tangem_pay_get_help),
onClick = this.onDisputeClick, onClick = this.onDisputeClick,
), ),
) )

View file

@ -50,7 +50,6 @@ internal class TangemPayOnboardingModel @Inject constructor(
field = MutableStateFlow(getInitialState()) field = MutableStateFlow(getInitialState())
init { init {
analytics.send(TangemPayAnalyticsEvents.ActivationScreenOpened)
modelScope.launch { modelScope.launch {
when (params) { when (params) {
is TangemPayOnboardingComponent.Params.ContinueOnboarding -> { is TangemPayOnboardingComponent.Params.ContinueOnboarding -> {
@ -66,6 +65,8 @@ internal class TangemPayOnboardingModel @Inject constructor(
} }
private fun showOnboarding() { private fun showOnboarding() {
// TODO: move analytics to init block [REDACTED_JIRA]
analytics.send(TangemPayAnalyticsEvents.ActivationScreenOpened())
uiState.update { uiState.update {
TangemPayOnboardingScreenState.Content( TangemPayOnboardingScreenState.Content(
onBack = it.onBack, onBack = it.onBack,
@ -118,12 +119,12 @@ internal class TangemPayOnboardingModel @Inject constructor(
} }
private fun onTermsClick() { private fun onTermsClick() {
analytics.send(TangemPayAnalyticsEvents.ViewTermsClicked) analytics.send(TangemPayAnalyticsEvents.ViewTermsClicked())
urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK) urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK)
} }
private fun onGetCardClick() { private fun onGetCardClick() {
analytics.send(TangemPayAnalyticsEvents.GetCardClicked) analytics.send(TangemPayAnalyticsEvents.GetCardClicked())
uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = true)) uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = true))
modelScope.launch { modelScope.launch {
// TODO implement selector // TODO implement selector

View file

@ -27,8 +27,8 @@ internal class WalletTangemPayAnalyticsEventSender @Inject constructor(
val event = when { val event = when {
customerInfo.orderStatus == OrderStatus.CANCELED -> return // ignore cancelled state on analytics customerInfo.orderStatus == OrderStatus.CANCELED -> return // ignore cancelled state on analytics
!customerInfo.info.isKycApproved -> return // ignore kyc not approved state on analytics !customerInfo.info.isKycApproved -> return // ignore kyc not approved state on analytics
cardInfo != null && productInstance != null -> TangemPayAnalyticsEvents.MainScreenOpened cardInfo != null && productInstance != null -> return
else -> TangemPayAnalyticsEvents.IssuingBannerDisplayed else -> TangemPayAnalyticsEvents.IssuingBannerDisplayed()
} }
if (sentEvents.add(event)) { if (sentEvents.add(event)) {