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 5098ec0ce1..9f8cbf56e0 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 @@ -1,20 +1,20 @@ package com.tangem.domain.staking.model.stakekit.action -enum class StakingActionType { - STAKE, - UNSTAKE, - CLAIM_REWARDS, - RESTAKE_REWARDS, - WITHDRAW, - RESTAKE, - CLAIM_UNSTAKED, - UNLOCK_LOCKED, - STAKE_LOCKED, - VOTE, - REVOKE, - VOTE_LOCKED, - REVOTE, - REBOND, - MIGRATE, - UNKNOWN, +enum class StakingActionType(val type: String) { + 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 336486156f..27d67bf6aa 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 @@ -47,18 +47,20 @@ internal sealed class StakingAnalyticsEvents( params = mapOf( AnalyticsParam.TOKEN_PARAM to token, "Validator" to validator, - "Action" to action.name, + "Action" to action.type, ), ) data class StakeInProgressScreenOpened( val validator: String, val token: String, + val action: StakingActionType, ) : StakingAnalyticsEvents( event = "Stake In Progress Screen Opened", params = mapOf( AnalyticsParam.TOKEN_PARAM to token, "Validator" to validator, + "Action" to action.type, ), ) @@ -136,9 +138,13 @@ internal sealed class StakingAnalyticsEvents( data class StakingError( val token: String, + val errorType: String, ) : StakingAnalyticsEvents( event = "Errors", - params = mapOf(AnalyticsParam.TOKEN_PARAM to token), + params = mapOf( + AnalyticsParam.TOKEN_PARAM to token, + "ErrorType" to errorType, + ), ) data class TransactionError( 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 013bf2e49f..be35fd0eaa 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 @@ -104,6 +104,7 @@ internal class StakingAnalyticSender( StakingAnalyticsEvents.StakeInProgressScreenOpened( validator = validatorName, token = value.cryptoCurrencySymbol, + action = getStakingActionType(value), ), ) } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt index 0fdda4ab88..4eb21da85c 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingFeeTransactionLoader.kt @@ -49,9 +49,10 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( suspend fun getFee( pendingAction: PendingAction?, pendingActions: ImmutableList?, - onFeeError: (GetFeeError) -> Unit, onStakingFee: (Fee) -> Unit, + onStakingFeeError: (StakingError) -> Unit, onApprovalFee: (TransactionFee) -> Unit, + onFeeError: (GetFeeError) -> Unit, ) { val state = stateController.value val confirmationState = state.confirmationState as? StakingStates.ConfirmationState.Data @@ -85,7 +86,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( pendingActions = pendingActions, amount = amount, validatorAddress = validatorAddress, - onFeeError = onFeeError, + onStakingFeeError = onStakingFeeError, onStakingFee = onStakingFee, ) } @@ -95,7 +96,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( pendingActions = pendingActions, amount = amount, validatorAddress = validatorAddress, - onFeeError = onFeeError, + onStakingFeeError = onStakingFeeError, onStakingFee = onStakingFee, ) } @@ -106,7 +107,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( pendingActions: ImmutableList?, amount: BigDecimal, validatorAddress: String, - onFeeError: (GetFeeError) -> Unit, + onStakingFeeError: (StakingError) -> Unit, onStakingFee: (Fee) -> Unit, ) { val sourceAddress = cryptoCurrencyStatus.value.networkAddress?.defaultAddress?.value @@ -125,7 +126,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( action = action, ) }.getOrElse { - onFeeError(GetFeeError.DataError(Throwable(it.toString()))) + onStakingFeeError(it) null } } @@ -133,7 +134,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( } if (result.isNullOrEmpty()) { - onFeeError(GetFeeError.UnknownError) + onStakingFeeError(StakingError.UnknownError) return } @@ -151,7 +152,7 @@ internal class StakingFeeTransactionLoader @AssistedInject constructor( validatorAddress = validatorAddress, action = pendingAction, ).getOrElse { - onFeeError(GetFeeError.DataError(Throwable(it.toString()))) + onStakingFeeError(it) return } } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt index 109dafb912..35b8a1ec9b 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/helpers/StakingTransactionSender.kt @@ -185,7 +185,12 @@ internal class StakingTransactionSender @AssistedInject constructor( type = action?.type, ), ).getOrElse { - analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(state.cryptoCurrencyName)) + analyticsEventHandler.send( + StakingAnalyticsEvents.StakingError( + token = state.cryptoCurrencyName, + errorType = it.javaClass.simpleName, + ), + ) onConstructError(it) return emptyList() } @@ -248,9 +253,12 @@ internal class StakingTransactionSender @AssistedInject constructor( rawCurrencyId = rawCurrencyId, ), ) - .onLeft { + .onLeft { error -> analyticsEventHandler.send( - StakingAnalyticsEvents.StakingError(stateController.value.cryptoCurrencyName), + StakingAnalyticsEvents.StakingError( + token = stateController.value.cryptoCurrencyName, + errorType = error.javaClass.simpleName, + ), ) saveUnsubmittedHashUseCase.invoke( transactionId = transactionId, 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 913bf9b07a..a5afd54f97 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 @@ -1,7 +1,10 @@ package com.tangem.features.staking.impl.presentation.viewmodel import android.os.Bundle -import androidx.lifecycle.* +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import arrow.core.getOrElse import com.tangem.blockchain.common.transaction.TransactionFee import com.tangem.common.routing.AppRoute @@ -256,8 +259,18 @@ internal class StakingViewModel @Inject constructor( ) updateNotifications() }, + onStakingFeeError = { error -> + analyticsEventHandler.send( + StakingAnalyticsEvents.StakingError( + value.cryptoCurrencyName, + error.javaClass.simpleName, + ), + ) + stateController.update(AddStakingErrorTransformer()) + updateNotifications(GetFeeError.UnknownError) + }, onFeeError = { error -> - analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(value.cryptoCurrencyName)) + analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName)) stateController.update(AddStakingErrorTransformer()) updateNotifications(error) }, @@ -285,7 +298,12 @@ internal class StakingViewModel @Inject constructor( }, onConstructError = { error -> Timber.e(error.toString()) - analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(value.cryptoCurrencyName)) + analyticsEventHandler.send( + StakingAnalyticsEvents.StakingError( + token = value.cryptoCurrencyName, + errorType = error.javaClass.simpleName, + ), + ) stakingEventFactory.createStakingErrorAlert(error) stateController.update(SetConfirmationStateResetAssentTransformer) }, @@ -296,7 +314,7 @@ internal class StakingViewModel @Inject constructor( }, onSendError = { error -> Timber.e(error.toString()) - analyticsEventHandler.send(StakingAnalyticsEvents.StakingError(value.cryptoCurrencyName)) + analyticsEventHandler.send(StakingAnalyticsEvents.TransactionError(value.cryptoCurrencyName)) stakingEventFactory.createSendTransactionErrorAlert(error) stateController.update(SetConfirmationStateResetAssentTransformer) },