From 58428d773b42fadd1e64bbd060359dfe3def2b8f Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 18 Jan 2026 18:58:54 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../tangempay/TangemPayAnalyticsEvents.kt | 124 ++++++++++++++++++ .../TangemPayCardDetailsBlockStateFactory.kt | 3 +- .../entity/TangemPayDetailsStateFactory.kt | 2 + .../entity/TangemPayDetailsTopBarConfig.kt | 1 + .../tangempay/entity/TangemPayDetailsUM.kt | 3 +- .../model/TangemPayCardDetailsBlockModel.kt | 17 ++- .../model/TangemPayChangePinModel.kt | 13 +- .../tangempay/model/TangemPayDetailsModel.kt | 24 ++++ .../model/TangemPayTxHistoryDetailsModel.kt | 5 + .../tangempay/model/TangemPayViewPinModel.kt | 4 + .../ui/TangemPayAddToWalletScreen.kt | 2 +- .../tangempay/ui/TangemPayCardDetailsBlock.kt | 15 ++- .../tangempay/ui/TangemPayDetailsScreen.kt | 15 ++- .../model/TangemPayOnboardingModel.kt | 1 + 14 files changed, 212 insertions(+), 17 deletions(-) diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt b/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt index 2f944349f5..e4b6af4d70 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/tangempay/TangemPayAnalyticsEvents.kt @@ -52,4 +52,128 @@ sealed class TangemPayAnalyticsEvents( categoryName = "Visa Screen", event = "Button - Visa Swap", ) + + class ChooseWalletPopup : TangemPayAnalyticsEvents( + categoryName = "Visa Onboarding", + event = "Choose Wallet Popup", + ) + + class CardSettingsClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Card Settings", + ) + + class TermsAndLimitsClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Terms And Limits", + ) + + class FreezeCardClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Freeze Card", + ) + + class FreezeCardConfirmShown : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Popup - Freeze Confirmation", + ) + + class FreezeCardConfirmClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Freeze Confirmation On Popup", + ) + + class UnfreezeCardClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Unfreeze Card", + ) + + class UnfreezeCardConfirmShown : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Popup - Unfreeze Confirmation", + ) + + class UnfreezeCardConfirmClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Unfreeze Confirmation On Popup", + ) + + class PinCodeClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - PIN Code", + ) + + class ChangePinScreenShown : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Screen - Change PIN", + ) + + class ChangePinSubmitClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Set PIN On Change PIN Screen", + ) + + class ChangePinSuccessShown : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Message - PIN Setup Success", + ) + + class CurrentPinShown : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Popup - Current PIN", + ) + + class ChangePinOnCurrentPinClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Change PIN On Current PIN", + ) + + class ViewCardDetailsClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - View Card Details", + ) + + class CopyCardNumberClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Copy Card Number", + ) + + class CopyCardExpiryClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Copy Card Expiry", + ) + + class CopyCardCVVClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Copy CVV", + ) + + class AddToWalletClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Add Card To Wallet", + ) + + class WithdrawClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Visa Withdraw", + ) + + class GoToSupportOnBetaBannerClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Go To Support On Beta Banner", + ) + + class TransactionInListClicked(type: String, status: String) : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Clicked On Transaction In List", + params = mapOf( + "type" to type, + "status" to status, + ), + ) + + class SupportOnTransactionPopupClicked : TangemPayAnalyticsEvents( + categoryName = "Visa Screen", + event = "Button - Support On Transaction Popup", + ) } \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayCardDetailsBlockStateFactory.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayCardDetailsBlockStateFactory.kt index 7904ea72d9..e79a05f253 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayCardDetailsBlockStateFactory.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayCardDetailsBlockStateFactory.kt @@ -3,12 +3,13 @@ package com.tangem.features.tangempay.entity import com.tangem.core.ui.extensions.resourceReference import com.tangem.domain.visa.model.TangemPayCardFrozenState import com.tangem.features.tangempay.details.impl.R +import com.tangem.features.tangempay.model.CardDataType import com.tangem.utils.StringsSigns internal class TangemPayCardDetailsBlockStateFactory( private val cardNumberEnd: String, private val onReveal: () -> Unit, - private val onCopy: (String) -> Unit, + private val onCopy: (String, CardDataType) -> Unit, ) { fun getInitialState() = TangemPayCardDetailsUM( diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt index 55b429059a..8fb38c33bc 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt @@ -18,6 +18,7 @@ import kotlinx.collections.immutable.toPersistentList @Suppress("LongParameterList") internal class TangemPayDetailsStateFactory( private val onBack: () -> Unit, + private val onOpenMenu: () -> Unit, private val intents: TangemPayDetailIntents, private val cardFrozenState: TangemPayCardFrozenState, private val converter: TangemPayCardFrozenStateConverter, @@ -47,6 +48,7 @@ internal class TangemPayDetailsStateFactory( return TangemPayDetailsUM( topBarConfig = TangemPayDetailsTopBarConfig( onBackClick = onBack, + onOpenMenu = onOpenMenu, items = listOfNotNull( TangemPayDetailsTopBarMenuItem( type = TangemPayDetailsTopBarMenuItemType.ChangePin, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt index 1010496a66..bd4daa10c9 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt @@ -5,6 +5,7 @@ import kotlinx.collections.immutable.ImmutableList internal data class TangemPayDetailsTopBarConfig( val onBackClick: () -> Unit, + val onOpenMenu: () -> Unit, val items: ImmutableList?, ) diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsUM.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsUM.kt index 37663aa1f0..f67ed6b7b0 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsUM.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsUM.kt @@ -5,6 +5,7 @@ import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfi import com.tangem.core.ui.components.notifications.NotificationConfig import com.tangem.core.ui.extensions.TextReference import com.tangem.domain.visa.model.TangemPayCardFrozenState +import com.tangem.features.tangempay.model.CardDataType import kotlinx.collections.immutable.ImmutableList internal data class TangemPayDetailsUM( @@ -25,7 +26,7 @@ internal data class TangemPayCardDetailsUM( val cvv: String, val buttonText: TextReference = TextReference.EMPTY, val onClick: () -> Unit = {}, - val onCopy: (String) -> Unit = {}, + val onCopy: (String, CardDataType) -> Unit, val isHidden: Boolean = true, val isLoading: Boolean = false, val cardFrozenState: TangemPayCardFrozenState, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardDetailsBlockModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardDetailsBlockModel.kt index 5c83a87360..fcee864f89 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardDetailsBlockModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayCardDetailsBlockModel.kt @@ -1,6 +1,7 @@ package com.tangem.features.tangempay.model import androidx.compose.runtime.Stable +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -9,6 +10,7 @@ import com.tangem.core.ui.clipboard.ClipboardManager import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.message.SnackbarMessage import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository +import com.tangem.domain.tangempay.TangemPayAnalyticsEvents import com.tangem.features.tangempay.components.cardDetails.TangemPayCardDetailsBlockComponent import com.tangem.features.tangempay.details.impl.R import com.tangem.features.tangempay.entity.TangemPayCardDetailsBlockStateFactory @@ -29,6 +31,7 @@ import com.tangem.utils.transformer.update as transformerUpdate private const val SHOW_DETAILS_TIME = 30_000L +@Suppress("LongParameterList") @Stable @ModelScoped internal class TangemPayCardDetailsBlockModel @Inject constructor( @@ -38,6 +41,7 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor( private val clipboardManager: ClipboardManager, private val uiMessageSender: UiMessageSender, private val cardDetailsEventListener: CardDetailsEventListener, + private val analytics: AnalyticsEventHandler, ) : Model() { private val params: TangemPayCardDetailsBlockComponent.Params = paramsContainer.require() @@ -74,6 +78,7 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor( } private fun revealCardDetails() { + analytics.send(TangemPayAnalyticsEvents.ViewCardDetailsClicked()) modelScope.launch { uiState.transformerUpdate( transformer = DetailsRevealProgressStateTransformer(onClickHide = ::hideCardDetails), @@ -115,7 +120,17 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor( ) } - private fun copyData(text: String) { + private fun copyData(text: String, type: CardDataType) { + val event = when (type) { + CardDataType.Number -> TangemPayAnalyticsEvents.CopyCardNumberClicked() + CardDataType.Expiry -> TangemPayAnalyticsEvents.CopyCardExpiryClicked() + CardDataType.CVV -> TangemPayAnalyticsEvents.CopyCardCVVClicked() + } + analytics.send(event) clipboardManager.setText(text = text.filterNot { it.isWhitespace() }, isSensitive = true) } +} + +internal enum class CardDataType { + Number, Expiry, CVV } \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt index 6d9f9d47f2..634b5a0e69 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt @@ -1,6 +1,7 @@ package com.tangem.features.tangempay.model import androidx.compose.runtime.Stable +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -10,6 +11,7 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.message.ToastMessage import com.tangem.domain.pay.model.SetPinResult import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository +import com.tangem.domain.tangempay.TangemPayAnalyticsEvents import com.tangem.features.tangempay.components.TangemPayDetailsContainerComponent import com.tangem.features.tangempay.details.impl.R import com.tangem.features.tangempay.entity.TangemPayChangePinUM @@ -30,17 +32,23 @@ internal class TangemPayChangePinModel @Inject constructor( private val uiMessageSender: UiMessageSender, private val router: Router, private val cardDetailsRepository: TangemPayCardDetailsRepository, + private val analytics: AnalyticsEventHandler, ) : Model() { private val params: TangemPayDetailsContainerComponent.Params = paramsContainer.require() val uiState: StateFlow field = MutableStateFlow(getInitialState()) + init { + analytics.send(TangemPayAnalyticsEvents.ChangePinScreenShown()) + } + private fun onPinCodeChange(pin: String) { uiState.update(transformer = PinCodeChangeTransformer(newPin = pin)) } private fun onClickSubmit() { + analytics.send(TangemPayAnalyticsEvents.ChangePinSubmitClicked()) modelScope.launch { uiState.update { it.copy(submitButtonLoading = true) } val result = try { @@ -59,7 +67,10 @@ internal class TangemPayChangePinModel @Inject constructor( message = ToastMessage(resourceReference(R.string.tangempay_pin_validation_error_message)), ) } - SetPinResult.SUCCESS -> router.push(TangemPayDetailsInnerRoute.ChangePINSuccess) + SetPinResult.SUCCESS -> { + analytics.send(TangemPayAnalyticsEvents.ChangePinSuccessShown()) + router.push(TangemPayDetailsInnerRoute.ChangePINSuccess) + } SetPinResult.DECRYPTION_ERROR, SetPinResult.UNKNOWN_ERROR, null, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt index 8f7b249781..b2e479da7a 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt @@ -86,6 +86,7 @@ internal class TangemPayDetailsModel @Inject constructor( private val cardFrozenStateConverter = TangemPayCardFrozenStateConverter(onUnfreezeClick = ::onClickUnfreezeCard) private val stateFactory = TangemPayDetailsStateFactory( onBack = router::pop, + onOpenMenu = ::onOpenMenu, intents = this, cardFrozenState = params.config.cardFrozenState, converter = cardFrozenStateConverter, @@ -127,6 +128,7 @@ internal class TangemPayDetailsModel @Inject constructor( } override fun onClickPinCode() { + analytics.send(TangemPayAnalyticsEvents.PinCodeClicked()) if (!params.config.isPinSet) { router.push(TangemPayDetailsInnerRoute.ChangePIN) } else { @@ -140,14 +142,19 @@ internal class TangemPayDetailsModel @Inject constructor( } override fun onClickFreezeCard() { + analytics.send(TangemPayAnalyticsEvents.FreezeCardClicked()) uiMessageSender.send(TangemPayMessagesFactory.createFreezeCardMessage(onFreezeClicked = ::freezeCard)) + analytics.send(TangemPayAnalyticsEvents.FreezeCardConfirmShown()) } override fun onClickUnfreezeCard() { + analytics.send(TangemPayAnalyticsEvents.UnfreezeCardClicked()) uiMessageSender.send(TangemPayMessagesFactory.createUnfreezeCardMessage(onUnfreezeClicked = ::unfreezeCard)) + analytics.send(TangemPayAnalyticsEvents.UnfreezeCardConfirmShown()) } private fun freezeCard() { + analytics.send(TangemPayAnalyticsEvents.FreezeCardConfirmClicked()) modelScope.launch { val result = try { cardDetailsRepository.freezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId) @@ -186,6 +193,7 @@ internal class TangemPayDetailsModel @Inject constructor( } private fun unfreezeCard() { + analytics.send(TangemPayAnalyticsEvents.UnfreezeCardConfirmClicked()) modelScope.launch { val result = try { cardDetailsRepository.unfreezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId) @@ -243,6 +251,7 @@ internal class TangemPayDetailsModel @Inject constructor( } override fun onClickWithdraw() { + analytics.send(TangemPayAnalyticsEvents.WithdrawClicked()) val currentBalance = balance val depositAddress = currentBalance?.depositAddress if (currentBalance == null || depositAddress == null) { @@ -336,6 +345,7 @@ internal class TangemPayDetailsModel @Inject constructor( } override fun onContactSupportClicked() { + analytics.send(TangemPayAnalyticsEvents.GoToSupportOnBetaBannerClicked()) modelScope.launch { sendFeedbackEmailUseCase.invoke( type = FeedbackEmailType.Visa.FeatureIsBeta( @@ -356,6 +366,7 @@ internal class TangemPayDetailsModel @Inject constructor( } private fun onClickAddToWalletBlock() { + analytics.send(TangemPayAnalyticsEvents.AddToWalletClicked()) router.push(TangemPayDetailsInnerRoute.AddToWallet) } @@ -376,6 +387,10 @@ internal class TangemPayDetailsModel @Inject constructor( }.saveIn(addToWalletBannerJobHolder) } + private fun onOpenMenu() { + analytics.send(TangemPayAnalyticsEvents.CardSettingsClicked()) + } + override fun onClickSwap(data: TangemPayTopUpData) { analytics.send(TangemPayAnalyticsEvents.SwapClicked()) bottomSheetNavigation.dismiss() @@ -414,6 +429,7 @@ internal class TangemPayDetailsModel @Inject constructor( override fun onClickChangePin() { bottomSheetNavigation.dismiss() + analytics.send(TangemPayAnalyticsEvents.ChangePinOnCurrentPinClicked()) router.push(TangemPayDetailsInnerRoute.ChangePIN) } @@ -422,6 +438,13 @@ internal class TangemPayDetailsModel @Inject constructor( } override fun onTransactionClick(item: TangemPayTxHistoryItem) { + val (type, status) = when (item) { + is TangemPayTxHistoryItem.Collateral -> "collateral" to "unknown" + is TangemPayTxHistoryItem.Fee -> "fee" to "unknown" + is TangemPayTxHistoryItem.Payment -> "payment" to "unknown" + is TangemPayTxHistoryItem.Spend -> "spend" to item.status.name.lowercase() + } + analytics.send(TangemPayAnalyticsEvents.TransactionInListClicked(type = type, status = status)) bottomSheetNavigation.activate( configuration = TangemPayDetailsNavigation.TransactionDetails( transaction = item, @@ -431,6 +454,7 @@ internal class TangemPayDetailsModel @Inject constructor( } override fun onClickTermsAndLimits() { + analytics.send(TangemPayAnalyticsEvents.TermsAndLimitsClicked()) urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK) } diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt index 8dae2f4f77..1d6f1f82fa 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt @@ -1,6 +1,7 @@ package com.tangem.features.tangempay.model import androidx.compose.runtime.Stable +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer @@ -9,6 +10,7 @@ import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.feedback.GetWalletMetaInfoUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.models.FeedbackEmailType +import com.tangem.domain.tangempay.TangemPayAnalyticsEvents import com.tangem.features.tangempay.components.txHistory.TangemPayTxHistoryDetailsComponent import com.tangem.features.tangempay.entity.TangemPayTxHistoryDetailsUM import com.tangem.features.tangempay.model.transformers.TangemPayTxHistoryDetailsConverter @@ -17,6 +19,7 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject +@Suppress("LongParameterList") @Stable @ModelScoped internal class TangemPayTxHistoryDetailsModel @Inject constructor( @@ -25,6 +28,7 @@ internal class TangemPayTxHistoryDetailsModel @Inject constructor( private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val urlOpener: UrlOpener, private val balanceHidingSettings: GetBalanceHidingSettingsUseCase, + private val analytics: AnalyticsEventHandler, paramsContainer: ParamsContainer, ) : Model() { @@ -61,6 +65,7 @@ internal class TangemPayTxHistoryDetailsModel @Inject constructor( } private fun dispute() { + analytics.send(TangemPayAnalyticsEvents.SupportOnTransactionPopupClicked()) modelScope.launch { val walletMetaInfo = getWalletMetaInfoUseCase.invoke(params.userWalletId).getOrNull() ?: return@launch diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayViewPinModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayViewPinModel.kt index 14631dc022..a610d66541 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayViewPinModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayViewPinModel.kt @@ -1,10 +1,12 @@ package com.tangem.features.tangempay.model import androidx.compose.runtime.Stable +import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository +import com.tangem.domain.tangempay.TangemPayAnalyticsEvents import com.tangem.features.tangempay.components.TangemPayViewPinComponent import com.tangem.features.tangempay.entity.TangemPayViewPinUM import com.tangem.features.tangempay.model.transformers.TangemPayViewPinErrorStateTransformer @@ -22,6 +24,7 @@ internal class TangemPayViewPinModel @Inject constructor( paramsContainer: ParamsContainer, override val dispatchers: CoroutineDispatcherProvider, private val cardDetailsRepository: TangemPayCardDetailsRepository, + private val analytics: AnalyticsEventHandler, ) : Model() { private val params = paramsContainer.require() @@ -30,6 +33,7 @@ internal class TangemPayViewPinModel @Inject constructor( field = MutableStateFlow(getInitialState()) init { + analytics.send(TangemPayAnalyticsEvents.CurrentPinShown()) getCardPin() } diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayAddToWalletScreen.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayAddToWalletScreen.kt index eb2a5831d4..7fd6c66c61 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayAddToWalletScreen.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayAddToWalletScreen.kt @@ -187,7 +187,7 @@ private fun PreviewTangemPayAddToWalletScreen() { numberShort = "*1245", expiry = "••/••", cvv = "•••", - onCopy = {}, + onCopy = { _, _ -> }, onClick = {}, buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text), cardFrozenState = TangemPayCardFrozenState.Unfrozen, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayCardDetailsBlock.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayCardDetailsBlock.kt index 403e3fe778..33e91f7745 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayCardDetailsBlock.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayCardDetailsBlock.kt @@ -33,6 +33,7 @@ import com.tangem.core.ui.res.TangemThemePreview import com.tangem.domain.visa.model.TangemPayCardFrozenState import com.tangem.features.tangempay.details.impl.R import com.tangem.features.tangempay.entity.TangemPayCardDetailsUM +import com.tangem.features.tangempay.model.CardDataType private val CustomCardBlockColor = Color(0x1F828282) @@ -79,9 +80,9 @@ internal fun TangemPayCard(state: TangemPayCardDetailsUM, modifier: Modifier = M cardNumber = state.number, expiry = state.expiry, cvv = state.cvv, - onCopyCardNumber = { state.onCopy(state.number) }, - onCopyCvv = { state.onCopy(state.cvv) }, - onCopyExpiry = { state.onCopy(state.expiry) }, + onCopyCardNumber = { state.onCopy(state.number, CardDataType.Number) }, + onCopyCvv = { state.onCopy(state.cvv, CardDataType.CVV) }, + onCopyExpiry = { state.onCopy(state.expiry, CardDataType.Expiry) }, onHideDetails = state.onClick, modifier = Modifier.graphicsLayer { rotationY = 180f }, ) @@ -309,7 +310,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide expiry = "", cvv = "", buttonText = resourceReference(R.string.tangempay_card_details_show_details), - onCopy = {}, + onCopy = { _, _ -> }, isHidden = true, cardFrozenState = TangemPayCardFrozenState.Frozen, ), @@ -321,7 +322,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide expiry = "", cvv = "", buttonText = resourceReference(R.string.tangempay_card_details_show_details), - onCopy = {}, + onCopy = { _, _ -> }, isHidden = true, cardFrozenState = TangemPayCardFrozenState.Unfrozen, ), @@ -333,7 +334,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide expiry = "", cvv = "", buttonText = resourceReference(R.string.tangempay_card_details_show_details), - onCopy = {}, + onCopy = { _, _ -> }, isHidden = true, cardFrozenState = TangemPayCardFrozenState.Pending, ), @@ -341,7 +342,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide isLoading = false, onClick = {}, buttonText = resourceReference(R.string.tangempay_card_details_hide_details), - onCopy = {}, + onCopy = { _, _ -> }, isHidden = false, number = "1234 5678 9012 3456", numberShort = "*3456", diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt index 255f5c37a5..8974d6b761 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt @@ -235,7 +235,12 @@ private fun TangemPayDetailsTopAppBar(config: TangemPayDetailsTopBarConfig, modi title = {}, actions = { AnimatedVisibility(visible = config.items != null && config.items.isNotEmpty()) { - IconButton(onClick = { showDropdownMenu = true }) { + IconButton( + onClick = { + config.onOpenMenu() + showDropdownMenu = true + }, + ) { Icon( painter = painterResource(id = R.drawable.ic_more_vertical_24), tint = TangemTheme.colors.icon.primary1, @@ -286,7 +291,7 @@ private fun TangemPayDetailsScreenPreview( numberShort = "*1245", expiry = "••/••", cvv = "•••", - onCopy = {}, + onCopy = { _, _ -> }, onClick = {}, buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text), cardFrozenState = TangemPayCardFrozenState.Unfrozen, @@ -299,7 +304,7 @@ private fun TangemPayDetailsScreenPreview( private class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider( collection = listOf( TangemPayDetailsUM( - topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, items = null), + topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, onOpenMenu = {}, items = null), pullToRefreshConfig = PullToRefreshConfig(isRefreshing = false, onRefresh = {}), balanceBlockState = TangemPayDetailsBalanceBlockState.Content( actionButtons = persistentListOf( @@ -328,7 +333,7 @@ private class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider }, onClick = {}, buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text), cardFrozenState = TangemPayCardFrozenState.Unfrozen, diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt index 83700ab313..9181edcee3 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt @@ -150,6 +150,7 @@ internal class TangemPayOnboardingModel @Inject constructor( if (eligibleWalletsIds.size == 1) { checkCustomerInfo(userWalletId = eligibleWalletsIds[0]) } else { + analytics.send(TangemPayAnalyticsEvents.ChooseWalletPopup()) bottomSheetNavigation.activate(TangemPayOnboardingNavigation.WalletSelector(eligibleWalletsIds)) } }