From 6793aab99e5d4e2d43a005dc481c4377e989f719 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 24 Sep 2024 22:33:45 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../stakekit/action/StakingActionType.kt | 40 +++++++++---------- .../impl/analytics/StakingAnalyticsEvents.kt | 16 ++++++-- .../analytics/utils/StakingAnalyticSender.kt | 22 ++++++---- .../viewmodel/StakingViewModel.kt | 33 +++++++++------ 4 files changed, 66 insertions(+), 45 deletions(-) diff --git a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/action/StakingActionType.kt b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/action/StakingActionType.kt index 0c6a45bcc0..3d449ae82a 100644 --- a/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/action/StakingActionType.kt +++ b/domain/staking/models/src/main/kotlin/com/tangem/domain/staking/model/stakekit/action/StakingActionType.kt @@ -19,25 +19,23 @@ enum class StakingActionType { UNKNOWN, ; - companion object { - val StakingActionType.asAnalyticName - get() = when (this) { - STAKE -> "Stake" - UNSTAKE -> "Unstake" - CLAIM_REWARDS -> "Claim Rewards" - RESTAKE_REWARDS -> "Restake Rewards" - WITHDRAW -> "Withdraw" - RESTAKE -> "Restake" - CLAIM_UNSTAKED -> "Claim Unstaked" - UNLOCK_LOCKED -> "Unlock Locked" - STAKE_LOCKED -> "Stake Locked" - VOTE -> "Vote" - REVOKE -> "Revoke" - VOTE_LOCKED -> "Vote Locked" - REVOTE -> "Revote" - REBOND -> "Rebond" - MIGRATE -> "Migrate" - UNKNOWN -> "Unknown" - } - } + val asAnalyticName + get() = when (this) { + STAKE -> "Stake" + UNSTAKE -> "Unstake" + CLAIM_REWARDS -> "Claim Rewards" + RESTAKE_REWARDS -> "Restake Rewards" + WITHDRAW -> "Withdraw" + RESTAKE -> "Restake" + CLAIM_UNSTAKED -> "Claim Unstaked" + UNLOCK_LOCKED -> "Unlock Locked" + STAKE_LOCKED -> "Stake Locked" + VOTE -> "Vote" + REVOKE -> "Revoke" + VOTE_LOCKED -> "Vote Locked" + REVOTE -> "Revote" + REBOND -> "Rebond" + MIGRATE -> "Migrate" + UNKNOWN -> "Unknown" + } } \ No newline at end of file diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt index 30b7a01af8..920e6ce4cc 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt @@ -3,7 +3,6 @@ package com.tangem.features.staking.impl.analytics import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.staking.model.stakekit.action.StakingActionType -import com.tangem.domain.staking.model.stakekit.action.StakingActionType.Companion.asAnalyticName internal sealed class StakingAnalyticsEvents( event: String, @@ -101,6 +100,17 @@ internal sealed class StakingAnalyticsEvents( ), ) + data class ValidatorChosen( + val token: String, + val validator: String, + ) : StakingAnalyticsEvents( + event = "Validator Chosen", + params = mapOf( + AnalyticsParam.TOKEN_PARAM to token, + "Validator" to validator, + ), + ) + data class ButtonValidator( val source: StakeScreenSource, val token: String, @@ -122,11 +132,11 @@ internal sealed class StakingAnalyticsEvents( ) data class ButtonAction( - val action: String, + val action: StakingActionType, val token: String, val validator: String, ) : StakingAnalyticsEvents( - event = "Button - $action", + event = "Button - ${action.asAnalyticName}", params = mapOf( AnalyticsParam.TOKEN_PARAM to token, "Validator" to validator, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/utils/StakingAnalyticSender.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/utils/StakingAnalyticSender.kt index be35fd0eaa..0b3f4fcd35 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/utils/StakingAnalyticSender.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/utils/StakingAnalyticSender.kt @@ -82,14 +82,6 @@ internal class StakingAnalyticSender( val validatorState = confirmationState?.validatorState as? ValidatorState.Content val validatorName = validatorState?.chosenValidator?.name ?: return - analyticsEventHandler.send( - StakingAnalyticsEvents.ButtonAction( - action = getStakingActionType(value).name, - token = value.cryptoCurrencyName, - validator = validatorName, - ), - ) - analyticsEventHandler.send( Basic.TransactionSent( sentFrom = AnalyticsParam.TxSentFrom.Staking( @@ -109,6 +101,20 @@ internal class StakingAnalyticSender( ) } + fun sendTransactionStakingClickedAnalytics(value: StakingUiState) { + val confirmationState = value.confirmationState as? StakingStates.ConfirmationState.Data + val validatorState = confirmationState?.validatorState as? ValidatorState.Content + val validatorName = validatorState?.chosenValidator?.name ?: return + + analyticsEventHandler.send( + StakingAnalyticsEvents.ButtonAction( + action = getStakingActionType(value), + token = value.cryptoCurrencySymbol, + validator = validatorName, + ), + ) + } + private fun getStakingActionType(value: StakingUiState): StakingActionType { val confirmationState = value.confirmationState as? StakingStates.ConfirmationState.Data diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt index a5afd54f97..b138f2c300 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/viewmodel/StakingViewModel.kt @@ -262,7 +262,7 @@ internal class StakingViewModel @Inject constructor( onStakingFeeError = { error -> analyticsEventHandler.send( StakingAnalyticsEvents.StakingError( - value.cryptoCurrencyName, + value.cryptoCurrencySymbol, error.javaClass.simpleName, ), ) @@ -270,7 +270,7 @@ internal class StakingViewModel @Inject constructor( updateNotifications(GetFeeError.UnknownError) }, onFeeError = { error -> - analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName)) + analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol)) stateController.update(AddStakingErrorTransformer()) updateNotifications(error) }, @@ -291,6 +291,7 @@ internal class StakingViewModel @Inject constructor( private fun handleOnNextConfirmationClick() { if (isAssentState()) { viewModelScope.launch { + stakingAnalyticSender.sendTransactionStakingClickedAnalytics(value) stateController.update(SetConfirmationStateInProgressTransformer()) transactionSender.constructAndSendTransactions( onConstructSuccess = { constructedTransactions -> @@ -300,7 +301,7 @@ internal class StakingViewModel @Inject constructor( Timber.e(error.toString()) analyticsEventHandler.send( StakingAnalyticsEvents.StakingError( - token = value.cryptoCurrencyName, + token = value.cryptoCurrencySymbol, errorType = error.javaClass.simpleName, ), ) @@ -314,7 +315,7 @@ internal class StakingViewModel @Inject constructor( }, onSendError = { error -> Timber.e(error.toString()) - analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName)) + analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol)) stakingEventFactory.createSendTransactionErrorAlert(error) stateController.update(SetConfirmationStateResetAssentTransformer) }, @@ -353,7 +354,7 @@ internal class StakingViewModel @Inject constructor( } override fun onInitialInfoBannerClick() { - analyticsEventHandler.send(StakingAnalyticsEvents.WhatIsStaking(cryptoCurrencyStatus.currency.symbol)) + analyticsEventHandler.send(StakingAnalyticsEvents.WhatIsStaking(value.cryptoCurrencySymbol)) innerRouter.openUrl(WHAT_IS_STAKING_ARTICLE_URL) } @@ -374,13 +375,13 @@ internal class StakingViewModel @Inject constructor( } override fun onMaxValueClick() { - analyticsEventHandler.send(StakingAnalyticsEvents.ButtonMax(cryptoCurrencyStatus.currency.symbol)) + analyticsEventHandler.send(StakingAnalyticsEvents.ButtonMax(value.cryptoCurrencySymbol)) stateController.update(AmountMaxValueStateTransformer(cryptoCurrencyStatus, yield)) } override fun onCurrencyChangeClick(isFiat: Boolean) { analyticsEventHandler.send( - StakingAnalyticsEvents.AmountSelectCurrency(cryptoCurrencyStatus.currency.symbol, isFiat), + StakingAnalyticsEvents.AmountSelectCurrency(value.cryptoCurrencySymbol, isFiat), ) stateController.update(AmountCurrencyChangeStateTransformer(cryptoCurrencyStatus, isFiat)) } @@ -389,19 +390,25 @@ internal class StakingViewModel @Inject constructor( analyticsEventHandler.send( StakingAnalyticsEvents.ButtonValidator( source = StakeScreenSource.Confirmation, - token = cryptoCurrencyStatus.currency.symbol, + token = value.cryptoCurrencySymbol, ), ) stakingStateRouter.showValidators() } override fun onValidatorSelect(validator: Yield.Validator) { + analyticsEventHandler.send( + StakingAnalyticsEvents.ValidatorChosen( + value.cryptoCurrencySymbol, + validator.name, + ), + ) stateController.update(ValidatorSelectChangeTransformer(validator)) } override fun openRewardsValidators() { analyticsEventHandler.send( - StakingAnalyticsEvents.ButtonRewards(value.cryptoCurrencyName), + StakingAnalyticsEvents.ButtonRewards(value.cryptoCurrencySymbol), ) val rewardsValidators = stateController.value.rewardsValidatorsState as? StakingStates.RewardsValidatorsState.Data @@ -412,7 +419,7 @@ internal class StakingViewModel @Inject constructor( analyticsEventHandler.send( StakingAnalyticsEvents.ButtonValidator( source = StakeScreenSource.Info, - token = cryptoCurrencyStatus.currency.symbol, + token = value.cryptoCurrencySymbol, ), ) onNextClick(actionTypeToOverwrite = StakingActionCommonType.PENDING_REWARDS) @@ -466,7 +473,7 @@ internal class StakingViewModel @Inject constructor( analyticsEventHandler.send( StakingAnalyticsEvents.ButtonValidator( source = StakeScreenSource.Info, - token = cryptoCurrencyStatus.currency.symbol, + token = value.cryptoCurrencySymbol, ), ) } @@ -511,7 +518,7 @@ internal class StakingViewModel @Inject constructor( ).fold( ifLeft = { error -> Timber.e(error.toString()) - analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName)) + analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol)) stateController.update( SetConfirmationStateAssentApprovalTransformer( appCurrencyProvider = Provider { appCurrency }, @@ -533,7 +540,7 @@ internal class StakingViewModel @Inject constructor( ).fold( ifLeft = { error -> Timber.e(error.toString()) - analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName)) + analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencySymbol)) stateController.update( SetConfirmationStateAssentApprovalTransformer( appCurrencyProvider = Provider { appCurrency },