Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-10 14:17:15 +05:00
parent 8632680f20
commit e024d739b7
87 changed files with 386 additions and 374 deletions

View file

@ -93,7 +93,7 @@ internal class HomeModel @Inject constructor(
val uiState = _uiState.asStateFlow()
init {
analyticsEventHandler.send(IntroductionProcess.ScreenOpened)
analyticsEventHandler.send(IntroductionProcess.ScreenOpened())
observeUserCountryChanges()
when (params.launchMode) {
@ -127,20 +127,20 @@ internal class HomeModel @Inject constructor(
}
private fun onScanClick() {
analyticsEventHandler.send(IntroductionProcess.ButtonScanCardLegacy)
analyticsEventHandler.send(IntroductionProcess.ButtonScanCardLegacy())
scanCard()
}
private fun onShopClick() {
analyticsEventHandler.send(IntroductionProcess.ButtonBuyCards)
analyticsEventHandler.send(Shop.ScreenOpened)
analyticsEventHandler.send(IntroductionProcess.ButtonBuyCards())
analyticsEventHandler.send(Shop.ScreenOpened())
modelScope.launch {
generateBuyTangemCardLinkUseCase.invoke().let { urlOpener.openUrl(it) }
}
}
private fun onSearchTokensClick() {
analyticsEventHandler.send(IntroductionProcess.ButtonTokensList)
analyticsEventHandler.send(IntroductionProcess.ButtonTokensList())
router.push(AppRoute.ManageTokens(Source.STORIES))
}

View file

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

View file

@ -49,7 +49,7 @@ internal sealed class ManageTokensAnalyticEvent(
AnalyticsParam.Key.SOURCE to source.analyticsName,
),
)
data object ButtonLater : ManageTokensAnalyticEvent(
class ButtonLater : ManageTokensAnalyticEvent(
event = "Button - Later",
params = mapOf(AnalyticsParam.SOURCE to ManageTokensSource.ONBOARDING.analyticsName),
)

View file

@ -287,7 +287,7 @@ internal class OnboardingManageTokensModel @Inject constructor(
}
},
) {
analyticsEventHandler.send(ManageTokensAnalyticEvent.ButtonLater)
analyticsEventHandler.send(ManageTokensAnalyticEvent.ButtonLater())
useCasesFacade.saveManagedTokensUseCase(
currenciesToAdd = manageTokensListManager.currenciesToAdd.value,

View file

@ -9,7 +9,7 @@ internal sealed class MarketsListAnalyticsEvent(
params: Map<String, String> = mapOf(),
) : AnalyticsEvent(category = "Markets", event = event, params = params) {
data object BottomSheetOpened : MarketsListAnalyticsEvent(event = "Markets Screen Opened")
class BottomSheetOpened : MarketsListAnalyticsEvent(event = "Markets Screen Opened")
data class SortBy(
val sortByTypeUM: SortByTypeUM,
@ -33,11 +33,11 @@ internal sealed class MarketsListAnalyticsEvent(
),
)
data object StakingPromoShown : MarketsListAnalyticsEvent(event = "Notice - Staking Promo")
class StakingPromoShown : MarketsListAnalyticsEvent(event = "Notice - Staking Promo")
data object StakingPromoClosed : MarketsListAnalyticsEvent(event = "Staking Promo Closed")
class StakingPromoClosed : MarketsListAnalyticsEvent(event = "Staking Promo Closed")
data object StakingMoreInfoClicked : MarketsListAnalyticsEvent(event = "Staking More Info")
class StakingMoreInfoClicked : MarketsListAnalyticsEvent(event = "Staking More Info")
data class TokenSearched(val tokenFound: Boolean) : MarketsListAnalyticsEvent(
event = "Token Searched",
@ -46,5 +46,5 @@ internal sealed class MarketsListAnalyticsEvent(
),
)
data object ShowTokens : MarketsListAnalyticsEvent(event = "Button - Show Tokens")
class ShowTokens : MarketsListAnalyticsEvent(event = "Button - Show Tokens")
}

View file

@ -69,9 +69,9 @@ internal class MarketsListModel @Inject constructor(
visibleItemsChanged = { visibleItemIds.value = it },
onRetryButtonClicked = { activeListManager.reload() },
onTokenClick = { onTokenUIClicked(it) },
onStakingNotificationClick = { analyticsEventHandler.send(MarketsListAnalyticsEvent.StakingMoreInfoClicked) },
onStakingNotificationClick = { analyticsEventHandler.send(MarketsListAnalyticsEvent.StakingMoreInfoClicked()) },
onStakingNotificationCloseClick = { onStakingNotificationCloseClick() },
onShowTokensUnder100kClicked = { analyticsEventHandler.send(MarketsListAnalyticsEvent.ShowTokens) },
onShowTokensUnder100kClicked = { analyticsEventHandler.send(MarketsListAnalyticsEvent.ShowTokens()) },
)
private val mainMarketsListManager = MarketsListBatchFlowManager(
@ -150,7 +150,7 @@ internal class MarketsListModel @Inject constructor(
if (marketsListUMStateManager.state.value.stakingNotificationMaxApy == null &&
stakingNotificationMaxApy != null
) {
analyticsEventHandler.send(MarketsListAnalyticsEvent.StakingPromoShown)
analyticsEventHandler.send(MarketsListAnalyticsEvent.StakingPromoShown())
}
marketsListUMStateManager.onUiItemsChanged(
@ -267,9 +267,9 @@ internal class MarketsListModel @Inject constructor(
}
private fun initAnalytics() {
containerBottomSheetState.onEach {
if (it == BottomSheetState.EXPANDED) {
analyticsEventHandler.send(MarketsListAnalyticsEvent.BottomSheetOpened)
containerBottomSheetState.onEach { bottomSheetState ->
if (bottomSheetState == BottomSheetState.EXPANDED) {
analyticsEventHandler.send(MarketsListAnalyticsEvent.BottomSheetOpened())
}
}.launchIn(modelScope)
@ -303,7 +303,7 @@ internal class MarketsListModel @Inject constructor(
}
private fun onStakingNotificationCloseClick() {
analyticsEventHandler.send(MarketsListAnalyticsEvent.StakingPromoClosed)
analyticsEventHandler.send(MarketsListAnalyticsEvent.StakingPromoClosed())
modelScope.launch {
promoRepository.setMarketsStakingNotificationHideClicked()
}

View file

@ -69,7 +69,7 @@ internal class NFTDetailsModel @Inject constructor(
onBackClick = { params.onBackClick() },
onReadMoreClick = ::onReadMoreClick,
onSeeAllTraitsClick = {
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonSeeAll)
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonSeeAll())
params.onAllTraitsClick()
},
onExploreClick = ::onExploreClick,
@ -161,7 +161,7 @@ internal class NFTDetailsModel @Inject constructor(
}
private fun onInfoBlockClick(title: TextReference, text: TextReference) {
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonReadMore)
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonReadMore())
bottomSheetNavigation.activate(
NFTDetailsBottomSheetConfig.Info(
title = title,
@ -171,7 +171,7 @@ internal class NFTDetailsModel @Inject constructor(
}
private fun onReadMoreClick() {
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonReadMore)
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonReadMore())
when (val topInfo = _state.value.nftAsset.topInfo) {
is NFTAssetUM.TopInfo.Empty -> Unit
is NFTAssetUM.TopInfo.Content -> {
@ -186,7 +186,7 @@ internal class NFTDetailsModel @Inject constructor(
}
private fun onExploreClick() {
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonExplore)
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonExplore())
modelScope.launch {
val url = getNFTExploreUrlUseCase.invoke(
network = params.nftAsset.network,
@ -199,7 +199,7 @@ internal class NFTDetailsModel @Inject constructor(
}
private fun onSendClick() {
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonSend)
analyticsEventHandler.send(NFTAnalyticsEvent.Details.ButtonSend())
router.push(
AppRoute.NFTSend(
userWalletId = params.userWalletId,

View file

@ -89,7 +89,7 @@ internal class NFTReceiveModel @Inject constructor(
val state: StateFlow<NFTReceiveUM> get() = _state
init {
analyticsEventHandler.send(NFTAnalyticsEvent.Receive.ScreenOpened)
analyticsEventHandler.send(NFTAnalyticsEvent.Receive.ScreenOpened())
subscribeToNFTAvailableNetworks()
loadPortfolioName()
}

View file

@ -2,7 +2,6 @@ package com.tangem.features.onboarding.v2.common.analytics
import com.tangem.core.analytics.models.AnalyticsEvent
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.domain.models.currency.CryptoCurrency
sealed class OnboardingEvent(
category: String,
@ -10,16 +9,16 @@ sealed class OnboardingEvent(
params: Map<String, String> = mapOf(),
) : AnalyticsEvent(category, event, params) {
data object Started : OnboardingEvent("Onboarding", "Onboarding Started")
data object Finished : OnboardingEvent("Onboarding", "Onboarding Finished")
class Started : OnboardingEvent("Onboarding", "Onboarding Started")
class Finished : OnboardingEvent("Onboarding", "Onboarding Finished")
sealed class CreateWallet(
event: String,
params: Map<String, String> = mapOf(),
) : OnboardingEvent("Onboarding / Create Wallet", event, params) {
data object ScreenOpened : CreateWallet("Create Wallet Screen Opened")
data object ButtonCreateWallet : CreateWallet("Button - Create Wallet")
class ScreenOpened : CreateWallet("Create Wallet Screen Opened")
class ButtonCreateWallet : CreateWallet("Button - Create Wallet")
class WalletCreatedSuccessfully(
creationType: WalletCreationType = WalletCreationType.PrivateKey,
seedPhraseLength: Int? = null,
@ -40,54 +39,39 @@ sealed class OnboardingEvent(
}
}
sealed class Topup(
event: String,
params: Map<String, String> = mapOf(),
) : OnboardingEvent("Onboarding / Top Up", event, params) {
object ScreenOpened : Topup("Activation Screen Opened")
object ButtonShowWalletAddress : Topup("Button - Show the Wallet Address")
class ButtonBuyCrypto(currency: CryptoCurrency) : Topup(
event = "Button - Buy Crypto",
params = mapOf(AnalyticsParam.CURRENCY to currency.symbol),
)
}
sealed class Backup(
event: String,
params: Map<String, String> = mapOf(),
) : OnboardingEvent("Onboarding / Backup", event, params) {
data object ScreenOpened : Backup("Backup Screen Opened")
data object Started : Backup("Backup Started")
data object Skipped : Backup("Backup Skipped")
data object SettingAccessCodeStarted : Backup("Setting Access Code Started")
data object AccessCodeEntered : Backup("Access Code Entered")
data object AccessCodeReEntered : Backup("Access Code Re-entered")
class ScreenOpened : Backup("Backup Screen Opened")
class Started : Backup("Backup Started")
class Skipped : Backup("Backup Skipped")
class SettingAccessCodeStarted : Backup("Setting Access Code Started")
class AccessCodeEntered : Backup("Access Code Entered")
class AccessCodeReEntered : Backup("Access Code Re-entered")
class Finished(cardsCount: Int) : Backup(
event = "Backup Finished",
params = mapOf("Cards count" to "$cardsCount"),
)
data object ResetCancelEvent : Backup(
class ResetCancelEvent : Backup(
event = "Reset Card Notification",
params = mapOf("Option" to "Cancel"),
)
data object ResetPerformEvent : Backup(
class ResetPerformEvent : Backup(
event = "Reset Card Notification",
params = mapOf("Option" to "Reset"),
)
data object ResumeInterruptedBackup : Backup(
class ResumeInterruptedBackup : Backup(
event = "Notice - Backup Canceled",
params = mapOf("Action" to "Resume"),
)
data object CancelInterruptedBackup : Backup(
class CancelInterruptedBackup : Backup(
event = "Notice - Backup Canceled",
params = mapOf("Action" to "Cancel"),
)
@ -98,9 +82,9 @@ sealed class OnboardingEvent(
params: Map<String, String> = mapOf(),
) : OnboardingEvent("Onboarding / Twins", event, params) {
data object ScreenOpened : Twins("Twinning Screen Opened")
data object SetupStarted : Twins("Twin Setup Started")
data object SetupFinished : Twins("Twin Setup Finished")
class ScreenOpened : Twins("Twinning Screen Opened")
class SetupStarted : Twins("Twin Setup Started")
class SetupFinished : Twins("Twin Setup Finished")
}
data class OfflineAttestationFailed(

View file

@ -157,14 +157,14 @@ internal class OnboardingEntryModel @Inject constructor(
modelScope.launch {
if (tangemSdkManager.checkCanUseBiometry() && settingsRepository.shouldShowAskBiometry()) {
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.BiometricScreenOpened)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.BiometricScreenOpened())
}
stackNavigation.replaceAll(
OnboardingRoute.AskBiometry(modelCallbacks = AskBiometryModelCallbacks(doneMode)),
)
} else {
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened())
}
stackNavigation.replaceAll(
OnboardingRoute.Done(
@ -182,7 +182,7 @@ internal class OnboardingEntryModel @Inject constructor(
override fun onAllowed() {
analyticsEventHandler.send(OnboardingEntryEvent.Biometric(OnboardingEntryEvent.Biometric.State.On))
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened())
}
stackNavigation.replaceAll(
OnboardingRoute.Done(
@ -195,7 +195,7 @@ internal class OnboardingEntryModel @Inject constructor(
override fun onDenied() {
analyticsEventHandler.send(OnboardingEntryEvent.Biometric(OnboardingEntryEvent.Biometric.State.Off))
doIfVisa {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.SuccessScreenOpened())
}
stackNavigation.replaceAll(
OnboardingRoute.Done(

View file

@ -209,7 +209,7 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
}
Done -> {
// final step - navigate to parent
analyticsHandler.send(OnboardingEvent.Finished)
analyticsHandler.send(OnboardingEvent.Finished())
val userWallet = childParams.multiWalletState.value.resultUserWallet ?: return
params.onDone(userWallet)
}

View file

@ -37,7 +37,7 @@ internal class MultiWalletAccessCodeModel @Inject constructor(
val onDismiss = MutableSharedFlow<Unit>()
init {
analyticsHandler.send(OnboardingEvent.Backup.SettingAccessCodeStarted)
analyticsHandler.send(OnboardingEvent.Backup.SettingAccessCodeStarted())
params.multiWalletState.update {
it.copy(accessCode = null)
@ -112,7 +112,7 @@ internal class MultiWalletAccessCodeModel @Inject constructor(
}
}
analyticsHandler.send(OnboardingEvent.Backup.AccessCodeEntered)
analyticsHandler.send(OnboardingEvent.Backup.AccessCodeEntered())
}
MultiWalletAccessCodeUM.Step.ConfirmAccessCode -> {
if (checkAccessCode()) {
@ -125,7 +125,7 @@ internal class MultiWalletAccessCodeModel @Inject constructor(
modelScope.launch { onDismiss.emit(Unit) }
}
analyticsHandler.send(OnboardingEvent.Backup.AccessCodeReEntered)
analyticsHandler.send(OnboardingEvent.Backup.AccessCodeReEntered())
}
}
}

View file

@ -80,10 +80,10 @@ class MultiWalletBackupModel @Inject constructor(
init {
// for wallet 1 this event is sent in Wallet1ChooseOptionModel
if (scanResponse.productType == ProductType.Wallet2 || scanResponse.productType == ProductType.Ring) {
analyticsEventHandler.send(OnboardingEvent.Backup.ScreenOpened)
analyticsEventHandler.send(OnboardingEvent.Backup.ScreenOpened())
}
analyticsEventHandler.send(OnboardingEvent.Backup.Started)
analyticsEventHandler.send(OnboardingEvent.Backup.Started())
// Clear any saved backup before starting the backup process
// also clears the primary card if it was set
@ -226,7 +226,7 @@ class MultiWalletBackupModel @Inject constructor(
_uiState.update { it.copy(dialog = null) }
},
onDismissClick = {
analyticsEventHandler.send(OnboardingEvent.Backup.ResetCancelEvent)
analyticsEventHandler.send(OnboardingEvent.Backup.ResetCancelEvent())
},
),
)
@ -270,7 +270,7 @@ class MultiWalletBackupModel @Inject constructor(
}
private fun resetBackupCard(cardId: String) {
analyticsEventHandler.send(OnboardingEvent.Backup.ResetPerformEvent)
analyticsEventHandler.send(OnboardingEvent.Backup.ResetPerformEvent())
modelScope.launch {
tangemSdkManager.resetToFactorySettings(

View file

@ -35,7 +35,7 @@ internal class Wallet1ChooseOptionModel @Inject constructor(
val returnToParentFlow = MutableSharedFlow<Unit>()
init {
analyticsHandler.send(OnboardingEvent.Backup.ScreenOpened)
analyticsHandler.send(OnboardingEvent.Backup.ScreenOpened())
}
val canSkipBackup = params.multiWalletState.value.currentScanResponse.card.canSkipBackup
@ -44,7 +44,7 @@ internal class Wallet1ChooseOptionModel @Inject constructor(
if (skipClicked) return
skipClicked = true
analyticsHandler.send(OnboardingEvent.Backup.Skipped)
analyticsHandler.send(OnboardingEvent.Backup.Skipped())
modelScope.launch {
val scanResponse = params.multiWalletState.value.currentScanResponse

View file

@ -63,7 +63,7 @@ internal class MultiWalletCreateWalletModel @Inject constructor(
resourceReference(R.string.onboarding_create_wallet_body)
},
onCreateWalletClick = {
analyticsHandler.send(OnboardingEvent.CreateWallet.ButtonCreateWallet)
analyticsHandler.send(OnboardingEvent.CreateWallet.ButtonCreateWallet())
createWallet(false)
},
showOtherOptionsButton = params.parentParams.withSeedPhraseFlow,
@ -80,7 +80,7 @@ internal class MultiWalletCreateWalletModel @Inject constructor(
val onDone = MutableSharedFlow<Step>()
init {
analyticsHandler.send(OnboardingEvent.CreateWallet.ScreenOpened)
analyticsHandler.send(OnboardingEvent.CreateWallet.ScreenOpened())
}
private fun createWallet(shouldReset: Boolean) {

View file

@ -58,7 +58,7 @@ internal class OnboardingMultiWalletModel @Inject constructor(
val uiState = _uiState.asStateFlow()
init {
analyticsHandler.send(OnboardingEvent.Started)
analyticsHandler.send(OnboardingEvent.Started())
initScreenTitle()
loadCardArtwork()
subscribeToBackups()

View file

@ -41,11 +41,11 @@ internal class OnboardingNoteCreateWalletModel @Inject constructor(
)
init {
Analytics.send(OnboardingEvent.CreateWallet.ScreenOpened)
Analytics.send(OnboardingEvent.CreateWallet.ScreenOpened())
modelScope.launch {
val scanResponse = params.childParams.commonState.value.scanResponse ?: return@launch
if (!cardRepository.isActivationStarted(scanResponse.card.cardId)) {
Analytics.send(OnboardingEvent.Started)
Analytics.send(OnboardingEvent.Started())
}
}
observeArtwork()

View file

@ -103,7 +103,7 @@ internal class OnboardingTwinModel @Inject constructor(
init {
when (_uiState.value) {
is OnboardingTwinUM.Welcome -> {
analyticsEventHandler.send(OnboardingEvent.Twins.ScreenOpened)
analyticsEventHandler.send(OnboardingEvent.Twins.ScreenOpened())
modelScope.launch {
saveTwinsOnboardingShownUseCase()
}
@ -272,7 +272,7 @@ internal class OnboardingTwinModel @Inject constructor(
}
private fun scanComplete(scanResponse: ScanResponse) {
analyticsEventHandler.send(OnboardingEvent.Twins.SetupFinished)
analyticsEventHandler.send(OnboardingEvent.Twins.SetupFinished())
when (params.mode) {
Mode.WelcomeOnly -> saveWalletAndDone()

View file

@ -71,7 +71,7 @@ internal class OnboardingVisaAccessCodeModel @Inject constructor(
val onDone = MutableSharedFlow<ActivationReadyEvent>()
init {
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.SettingAccessCodeStarted)
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.SettingAccessCodeStarted())
}
fun onBack() {
@ -115,14 +115,14 @@ internal class OnboardingVisaAccessCodeModel @Inject constructor(
private fun onContinue() {
when (uiState.value.step) {
OnboardingVisaAccessCodeUM.Step.Enter -> {
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.AccessCodeEntered)
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.AccessCodeEntered())
if (checkAccessCodeMinChars().not()) return
_uiState.update { it.copy(step = OnboardingVisaAccessCodeUM.Step.ReEnter) }
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.AccessCodeReenterScreen)
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.AccessCodeReenterScreen())
}
OnboardingVisaAccessCodeUM.Step.ReEnter -> {
if (checkAccessCodesMatch().not()) return
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.OnboardingVisa)
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.OnboardingVisa())
startActivationProcess(accessCode = uiState.value.accessCodeFirst.text)
}
}

View file

@ -55,7 +55,7 @@ internal class OnboardingVisaApproveModel @Inject constructor(
val onDone = MutableSharedFlow<Unit>()
init {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.WalletPrepare)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.WalletPrepare())
}
private fun getInitialState(): OnboardingVisaApproveUM {
@ -67,7 +67,7 @@ internal class OnboardingVisaApproveModel @Inject constructor(
private fun onApproveClick() {
loading(true)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ButtonApprove)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ButtonApprove())
modelScope.launch {
val dataToSign =

View file

@ -61,7 +61,7 @@ internal class OnboardingVisaInProgressModel @Inject constructor(
val onDone = MutableSharedFlow<Params.DoneEvent>()
init {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ActivationInProgressScreen)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ActivationInProgressScreen())
runShortPolling()
}

View file

@ -52,7 +52,7 @@ internal class OnboardingVisaOtherWalletModel @Inject constructor(
val onDone = MutableSharedFlow<VisaActivationOrderInfo>()
init {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.GoToWebsiteOpened)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.GoToWebsiteOpened())
modelScope.launch {
while (true) {
visaActivationRepository.getActivationRemoteState()
@ -81,12 +81,12 @@ internal class OnboardingVisaOtherWalletModel @Inject constructor(
}
private fun onShareClicked() {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ButtonShareLink)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ButtonShareLink())
shareManager.shareText("https://tangem.com/") // TODO
}
private fun onOpenInBrowserClicked() {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ButtonBrowser)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ButtonBrowser())
urlOpener.openUrl("https://tangem.com/") // TODO
}
}

View file

@ -47,7 +47,7 @@ internal class OnboardingVisaPinCodeModel @Inject constructor(
val onDone = MutableSharedFlow<Unit>()
init {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.PinCodeScreenOpened)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.PinCodeScreenOpened())
}
private fun getInitialState(): OnboardingVisaPinCodeUM {
@ -67,12 +67,12 @@ internal class OnboardingVisaPinCodeModel @Inject constructor(
if (PinCodeValidation.validateAllDigits(pin)) {
val isError = PinCodeValidation.validateLength(pin) && PinCodeValidation.validate(pin).not()
_uiState.update {
it.copy(
_uiState.update { currentState ->
currentState.copy(
pinCode = pin,
submitButtonEnabled = PinCodeValidation.validate(pin),
error = if (isError) {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ErrorPinValidation)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.ErrorPinValidation())
resourceReference(R.string.visa_onboarding_pin_validation_error_message)
} else {
null
@ -83,7 +83,7 @@ internal class OnboardingVisaPinCodeModel @Inject constructor(
}
private fun onSubmitClick() {
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.PinEntered)
analyticsEventHandler.send(OnboardingVisaAnalyticsEvent.PinEntered())
val pinCode = _uiState.value.pinCode
if (PinCodeValidation.validate(pinCode).not()) return

View file

@ -50,7 +50,7 @@ internal class OnboardingVisaWelcomeModel @Inject constructor(
val onDone = MutableSharedFlow<DoneEvent>()
init {
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.ActivationScreenOpened)
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.ActivationScreenOpened())
}
private fun getInitialState(): OnboardingVisaWelcomeUM {
@ -65,7 +65,7 @@ internal class OnboardingVisaWelcomeModel @Inject constructor(
}
private fun onContinueClick() {
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.ButtonActivate)
analyticsEventsHandler.send(OnboardingVisaAnalyticsEvent.ButtonActivate())
if (params !is Config.WelcomeBack) {
modelScope.launch { onDone.emit(DoneEvent.WelcomeDone) }
return

View file

@ -7,27 +7,27 @@ internal sealed class OnboardingVisaAnalyticsEvent(
params: Map<String, String> = mapOf(),
) : AnalyticsEvent("Onboarding / Visa", event, params) {
data object ActivationScreenOpened : OnboardingVisaAnalyticsEvent(
class ActivationScreenOpened : OnboardingVisaAnalyticsEvent(
event = "Activation Screen Opened",
)
data object ButtonActivate : OnboardingVisaAnalyticsEvent(
class ButtonActivate : OnboardingVisaAnalyticsEvent(
event = "Button - Activate",
)
data object SettingAccessCodeStarted : OnboardingVisaAnalyticsEvent(
class SettingAccessCodeStarted : OnboardingVisaAnalyticsEvent(
event = "Setting Access Code Started",
)
data object AccessCodeEntered : OnboardingVisaAnalyticsEvent(
class AccessCodeEntered : OnboardingVisaAnalyticsEvent(
event = "Access Code Entered",
)
data object AccessCodeReenterScreen : OnboardingVisaAnalyticsEvent(
class AccessCodeReenterScreen : OnboardingVisaAnalyticsEvent(
event = "Access Code Re-enter Screen",
)
data object OnboardingVisa : OnboardingVisaAnalyticsEvent(
class OnboardingVisa : OnboardingVisaAnalyticsEvent(
event = "Onboarding / Visa",
)
@ -38,48 +38,48 @@ internal sealed class OnboardingVisaAnalyticsEvent(
params = mapOf("Type" to type),
)
data object WalletPrepare : OnboardingVisaAnalyticsEvent(
class WalletPrepare : OnboardingVisaAnalyticsEvent(
event = "Wallet Prepare",
)
data object ButtonApprove : OnboardingVisaAnalyticsEvent(
class ButtonApprove : OnboardingVisaAnalyticsEvent(
event = "Button - Approve",
)
data object GoToWebsiteOpened : OnboardingVisaAnalyticsEvent(
class GoToWebsiteOpened : OnboardingVisaAnalyticsEvent(
event = "Go To Website Opened",
)
data object ButtonBrowser : OnboardingVisaAnalyticsEvent(
class ButtonBrowser : OnboardingVisaAnalyticsEvent(
event = "Button - Browser",
)
data object ButtonShareLink : OnboardingVisaAnalyticsEvent(
class ButtonShareLink : OnboardingVisaAnalyticsEvent(
event = "Button - Share Link",
)
data object ActivationInProgressScreen : OnboardingVisaAnalyticsEvent(
class ActivationInProgressScreen : OnboardingVisaAnalyticsEvent(
event = "Activation In Progress Screen",
)
data object PinCodeScreenOpened : OnboardingVisaAnalyticsEvent(
class PinCodeScreenOpened : OnboardingVisaAnalyticsEvent(
event = "PIN Code Screen Opened",
)
data object PinEntered : OnboardingVisaAnalyticsEvent(
class PinEntered : OnboardingVisaAnalyticsEvent(
event = "PIN Entered",
params = mapOf("Type" to "Visa"),
)
data object BiometricScreenOpened : OnboardingVisaAnalyticsEvent(
class BiometricScreenOpened : OnboardingVisaAnalyticsEvent(
event = "Biometric Screen Opened",
)
data object SuccessScreenOpened : OnboardingVisaAnalyticsEvent(
class SuccessScreenOpened : OnboardingVisaAnalyticsEvent(
event = "Success Screen Opened",
)
data object ErrorPinValidation : OnboardingVisaAnalyticsEvent(
class ErrorPinValidation : OnboardingVisaAnalyticsEvent(
event = "Error - Pin Validation",
)
}

View file

@ -86,7 +86,7 @@ internal class AllOffersStateFactory(
fun getPaymentsState(): AllOffersStateUM {
return when (val currentState = currentStateProvider.invoke()) {
is AllOffersStateUM.Content -> {
analyticsEventHandler.send(OnrampAnalyticsEvent.PaymentMethodsScreenOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.PaymentMethodsScreenOpened())
currentState.copy(currentMethod = null)
}
AllOffersStateUM.Loading,

View file

@ -48,8 +48,8 @@ internal class AllOffersModel @Inject constructor(
init {
subscribeOnAllOffers()
analyticsEventHandler.send(OnrampAnalyticsEvent.PaymentMethodsScreenOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.AllOffersClicked)
analyticsEventHandler.send(OnrampAnalyticsEvent.PaymentMethodsScreenOpened())
analyticsEventHandler.send(OnrampAnalyticsEvent.AllOffersClicked())
}
fun dismiss() {

View file

@ -69,7 +69,7 @@ internal class ConfirmResidencyModel @Inject constructor(
} else {
ConfirmResidencyUM.ActionButtonConfig(
onClick = {
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp)
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp())
router.pop()
},
text = resourceReference(R.string.common_close),
@ -77,7 +77,7 @@ internal class ConfirmResidencyModel @Inject constructor(
}
private fun onChangeClick() {
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceChange)
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceChange())
bottomSheetNavigation.activate(ConfirmResidencyBottomSheetConfig.SelectCountry(params.onDismiss))
}
}

View file

@ -240,11 +240,11 @@ internal class OnrampAmountStateFactory(
val errorTextRes = when (error) {
is OnrampError.AmountError.TooBigError -> {
analyticsEventHandler.send(OnrampAnalyticsEvent.MaxAmountError)
analyticsEventHandler.send(OnrampAnalyticsEvent.MaxAmountError())
R.string.onramp_max_amount_restriction
}
is OnrampError.AmountError.TooSmallError -> {
analyticsEventHandler.send(OnrampAnalyticsEvent.MinAmountError)
analyticsEventHandler.send(OnrampAnalyticsEvent.MinAmountError())
R.string.onramp_min_amount_restriction
}
}

View file

@ -288,7 +288,7 @@ internal class OnrampMainComponentModel @Inject constructor(
}
override fun openCurrenciesList() {
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectCurrencyScreenOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectCurrencyScreenOpened())
bottomSheetNavigation.activate(OnrampMainBottomSheetConfig.CurrenciesList)
}
@ -333,7 +333,7 @@ internal class OnrampMainComponentModel @Inject constructor(
}
private fun onCloseClick() {
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp)
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp())
router.pop()
}

View file

@ -112,11 +112,11 @@ internal class OnrampV2AmountStateFactory(
val errorTextRes = when (error) {
is OnrampError.AmountError.TooBigError -> {
analyticsEventHandler.send(OnrampAnalyticsEvent.MaxAmountError)
analyticsEventHandler.send(OnrampAnalyticsEvent.MaxAmountError())
R.string.onramp_max_amount_restriction
}
is OnrampError.AmountError.TooSmallError -> {
analyticsEventHandler.send(OnrampAnalyticsEvent.MinAmountError)
analyticsEventHandler.send(OnrampAnalyticsEvent.MinAmountError())
R.string.onramp_min_amount_restriction
}
}

View file

@ -124,7 +124,7 @@ internal class OnrampV2MainComponentModel @Inject constructor(
}
override fun openCurrenciesList() {
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectCurrencyScreenOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectCurrencyScreenOpened())
bottomSheetNavigation.activate(OnrampV2MainBottomSheetConfig.CurrenciesList)
}
@ -225,7 +225,7 @@ internal class OnrampV2MainComponentModel @Inject constructor(
}
private fun onCloseClick() {
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp)
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp())
router.pop()
}

View file

@ -66,7 +66,7 @@ internal class SelectProviderModel @Inject constructor(
userCountry = getUserCountryUseCase.invokeSync().getOrNull()
?: UserCountry.Other(Locale.getDefault().country)
analyticsEventHandler.send(OnrampAnalyticsEvent.ProvidersScreenOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.ProvidersScreenOpened())
getPaymentMethods()
getProviders(params.selectedPaymentMethod)
}
@ -140,7 +140,7 @@ internal class SelectProviderModel @Inject constructor(
}
private fun openPaymentMethods() {
analyticsEventHandler.send(OnrampAnalyticsEvent.PaymentMethodsScreenOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.PaymentMethodsScreenOpened())
bottomSheetNavigation.activate(
ProviderListBottomSheetConfig.PaymentMethods(
selectedMethodId = state.value.selectedPaymentMethod.paymentMethod.id,

View file

@ -60,7 +60,7 @@ internal class OnrampSelectCountryModel @Inject constructor(
val state: StateFlow<CountryListUM> get() = controller.state
init {
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectResidenceOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectResidenceOpened())
updateCountriesList()
modelScope.launch { subscribeOnUpdateState() }
}

View file

@ -60,8 +60,8 @@ internal class OnrampOperationModel @Inject constructor(
init {
analyticsEventHandler.send(
event = when (params) {
is Params.Buy -> MainScreenAnalyticsEvent.BuyScreenOpened
is Params.Sell -> MainScreenAnalyticsEvent.SellScreenOpened
is Params.Buy -> MainScreenAnalyticsEvent.BuyScreenOpened()
is Params.Sell -> MainScreenAnalyticsEvent.SellScreenOpened()
},
)
}

View file

@ -37,7 +37,7 @@ internal class OnrampSettingsModel @Inject constructor(
val bottomSheetNavigation: SlotNavigation<OnrampSettingsConfig> = SlotNavigation()
init {
analyticsEventHandler.send(OnrampAnalyticsEvent.SettingsOpened)
analyticsEventHandler.send(OnrampAnalyticsEvent.SettingsOpened())
subscribeOnUpdateState()
}

View file

@ -74,7 +74,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
}
override fun goToProviderClick(providerLink: String) {
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider)
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider())
urlOpener.openUrl(providerLink)
}

View file

@ -50,7 +50,7 @@ internal class DefaultSwapSelectTokensComponent @AssistedInject constructor(
)
init {
analyticsEventHandler.send(event = MainScreenAnalyticsEvent.SwapScreenOpened)
analyticsEventHandler.send(event = MainScreenAnalyticsEvent.SwapScreenOpened())
}
@Composable

View file

@ -4,12 +4,12 @@ import com.tangem.core.analytics.models.AnalyticsEvent
sealed class ReferralEvents(event: String) : AnalyticsEvent(REFERRAL_PROGRAM_CATEGORY, event) {
data object ReferralScreenOpened : ReferralEvents(event = "Referral Screen Opened")
data object ClickParticipate : ReferralEvents(event = "Button - Participate")
data object ClickCopy : ReferralEvents(event = "Button - Copy")
data object ClickShare : ReferralEvents(event = "Button - Share")
data object ClickTaC : ReferralEvents(event = "Link - TaC")
data object ParticipateSuccessful : ReferralEvents(event = "Participate Successful")
class ReferralScreenOpened : ReferralEvents(event = "Referral Screen Opened")
class ClickParticipate : ReferralEvents(event = "Button - Participate")
class ClickCopy : ReferralEvents(event = "Button - Copy")
class ClickShare : ReferralEvents(event = "Button - Share")
class ClickTaC : ReferralEvents(event = "Link - TaC")
class ParticipateSuccessful : ReferralEvents(event = "Participate Successful")
}
private const val REFERRAL_PROGRAM_CATEGORY = "Referral Program"

View file

@ -90,7 +90,7 @@ internal class ReferralModel @Inject constructor(
}
init {
analyticsEventHandler.send(ReferralEvents.ReferralScreenOpened)
analyticsEventHandler.send(ReferralEvents.ReferralScreenOpened())
if (accountsFeatureToggles.isFeatureEnabled) {
combine(
flow = referralData.filterNotNull().onEach(::selectAccount),
@ -178,7 +178,7 @@ internal class ReferralModel @Inject constructor(
if (userWallet is UserWallet.Cold && isDemoCardUseCase(cardId = userWallet.cardId)) {
showErrorSnackbar(DemoModeException())
} else {
analyticsEventHandler.send(ReferralEvents.ClickParticipate)
analyticsEventHandler.send(ReferralEvents.ClickParticipate())
val lastInfoState = uiState.referralInfoState
uiState = uiState.copy(referralInfoState = ReferralInfoState.Loading)
modelScope.launch {
@ -187,9 +187,9 @@ internal class ReferralModel @Inject constructor(
false -> PortfolioId(params.userWalletId)
}
runCatching { referralInteractor.startReferral(portfolioId) }
.onSuccess {
analyticsEventHandler.send(ReferralEvents.ParticipateSuccessful)
referralData.value = it
.onSuccess { referral ->
analyticsEventHandler.send(ReferralEvents.ParticipateSuccessful())
referralData.value = referral
}
.onFailure { throwable ->
if (throwable is ReferralError.UserCancelledException) {
@ -213,17 +213,17 @@ internal class ReferralModel @Inject constructor(
}
private fun onAgreementClicked() {
analyticsEventHandler.send(ReferralEvents.ClickTaC)
analyticsEventHandler.send(ReferralEvents.ClickTaC())
lastReferralData?.tosLink?.let(urlOpener::openUrl)
}
private fun onCopyClicked() {
analyticsEventHandler.send(ReferralEvents.ClickCopy)
analyticsEventHandler.send(ReferralEvents.ClickCopy())
}
private fun onShareClicked(text: String) {
analyticsEventHandler.send(ReferralEvents.ClickShare)
analyticsEventHandler.send(ReferralEvents.ClickShare())
shareManager.shareText(text = text)
}

View file

@ -466,7 +466,7 @@ internal class StakingModel @Inject constructor(
}
override fun onInitialInfoBannerClick() {
analyticsEventHandler.send(StakingAnalyticsEvent.WhatIsStaking)
analyticsEventHandler.send(StakingAnalyticsEvent.WhatIsStaking())
innerRouter.openUrl(WHAT_IS_STAKING_ARTICLE_URL)
}
@ -512,7 +512,7 @@ internal class StakingModel @Inject constructor(
}
override fun onMaxValueClick() {
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonMax)
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonMax())
stateController.update(
AmountMaxValueStateTransformer(
cryptoCurrencyStatus = cryptoCurrencyStatus,
@ -554,7 +554,7 @@ internal class StakingModel @Inject constructor(
}
override fun openRewardsValidators() {
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonRewards)
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonRewards())
val rewardsValidators =
stateController.value.rewardsValidatorsState as? StakingStates.RewardsValidatorsState.Data
@ -878,7 +878,7 @@ internal class StakingModel @Inject constructor(
}
override fun onExploreClick() {
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonExplore)
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonExplore())
val confirmationDataState = uiState.value.confirmationState as? StakingStates.ConfirmationState.Data
val transactionDoneState = confirmationDataState?.transactionDoneState as? TransactionDoneState.Content
val txUrl = transactionDoneState?.txUrl
@ -892,7 +892,7 @@ internal class StakingModel @Inject constructor(
val transactionDoneState = confirmationDataState?.transactionDoneState as? TransactionDoneState.Content
val txUrl = transactionDoneState?.txUrl
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonShare)
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonShare())
if (txUrl != null) {
vibratorHapticManager.performOneTime(TangemHapticEffect.OneTime.Click)
shareManager.shareText(txUrl)

View file

@ -81,12 +81,12 @@ internal class StakingStateRouter(
}
fun showRewardsValidators() {
analyticsEventsHandler.send(StakingAnalyticsEvent.RewardScreenOpened)
analyticsEventsHandler.send(StakingAnalyticsEvent.RewardScreenOpened())
stateController.update { it.copy(currentStep = StakingStep.RewardsValidators) }
}
private fun showAmount() {
analyticsEventsHandler.send(StakingAnalyticsEvent.AmountScreenOpened)
analyticsEventsHandler.send(StakingAnalyticsEvent.AmountScreenOpened())
stateController.update { it.copy(currentStep = StakingStep.Amount) }
}

View file

@ -23,7 +23,7 @@ sealed class SwapEvents(
params = mapOf("Token" to token),
)
data object SendTokenBalanceClicked : SwapEvents(event = "Send Token Balance Clicked")
class SendTokenBalanceClicked : SwapEvents(event = "Send Token Balance Clicked")
data class ChooseTokenScreenOpened(val availableTokens: Boolean) : SwapEvents(
event = "Choose Token Screen Opened",
@ -43,7 +43,7 @@ sealed class SwapEvents(
params = mapOf("Send Token" to sendToken, "Receive Token" to receiveToken),
)
data object ButtonGivePermissionClicked : SwapEvents(event = "Button - Give permission")
class ButtonGivePermissionClicked : SwapEvents(event = "Button - Give permission")
data class ButtonPermissionApproveClicked(
val sendToken: String,
@ -58,9 +58,9 @@ sealed class SwapEvents(
),
)
data object ButtonPermissionCancelClicked : SwapEvents(event = "Button - Permission Cancel")
class ButtonPermissionCancelClicked : SwapEvents(event = "Button - Permission Cancel")
data object ButtonSwipeClicked : SwapEvents(event = "Button - Swipe")
class ButtonSwipeClicked : SwapEvents(event = "Button - Swipe")
data class SwapInProgressScreen(
val provider: SwapProvider,
@ -81,7 +81,7 @@ sealed class SwapEvents(
),
)
data object ProviderClicked : SwapEvents("Provider Clicked")
class ProviderClicked : SwapEvents("Provider Clicked")
data class ProviderChosen(val provider: SwapProvider) : SwapEvents(
event = "Provider Chosen",
@ -98,7 +98,7 @@ sealed class SwapEvents(
params = mapOf("Token" to token),
)
data object NoticeNoAvailableTokensToSwap : SwapEvents("Notice - No Available Tokens To Swap")
class NoticeNoAvailableTokensToSwap : SwapEvents("Notice - No Available Tokens To Swap")
data class NoticeNotEnoughFee(val token: String, val blockchain: String) : SwapEvents(
event = "Notice - Not Enough Fee",

View file

@ -375,7 +375,7 @@ internal class SwapModel @Inject constructor(
) {
// exceptional case
if (selectedCurrency == null) {
analyticsEventHandler.send(SwapEvents.NoticeNoAvailableTokensToSwap)
analyticsEventHandler.send(SwapEvents.NoticeNoAvailableTokensToSwap())
uiState = stateBuilder.createNoAvailableTokensToSwapState(
uiStateHolder = uiState,
fromToken = initialFromStatus,
@ -1271,7 +1271,7 @@ internal class SwapModel @Inject constructor(
private fun onAmountSelected(selected: Boolean) {
if (selected) {
analyticsEventHandler.send(SwapEvents.SendTokenBalanceClicked)
analyticsEventHandler.send(SwapEvents.SendTokenBalanceClicked())
}
}
@ -1312,7 +1312,7 @@ internal class SwapModel @Inject constructor(
},
onChangeCardsClicked = {
onChangeCardsClicked()
analyticsEventHandler.send(SwapEvents.ButtonSwipeClicked)
analyticsEventHandler.send(SwapEvents.ButtonSwipeClicked())
},
onBackClicked = {
val bottomSheet = uiState.bottomSheetConfig
@ -1331,10 +1331,10 @@ internal class SwapModel @Inject constructor(
onReduceByAmount = ::onReduceAmountClicked,
openPermissionBottomSheet = {
singleTaskScheduler.cancelTask()
analyticsEventHandler.send(SwapEvents.ButtonGivePermissionClicked)
analyticsEventHandler.send(SwapEvents.ButtonGivePermissionClicked())
uiState = stateBuilder.showPermissionBottomSheet(uiState) {
startLoadingQuotesFromLastState(isSilent = true)
analyticsEventHandler.send(SwapEvents.ButtonPermissionCancelClicked)
analyticsEventHandler.send(SwapEvents.ButtonPermissionCancelClicked())
uiState = stateBuilder.dismissBottomSheet(uiState)
}
},
@ -1362,7 +1362,7 @@ internal class SwapModel @Inject constructor(
}
},
onProviderClick = { providerId ->
analyticsEventHandler.send(SwapEvents.ProviderClicked)
analyticsEventHandler.send(SwapEvents.ProviderClicked())
val states = dataState.lastLoadedSwapStates.getLastLoadedSuccessStates()
val pricesLowerBest = getPricesLowerBest(providerId, states)
uiState = stateBuilder.showSelectProviderBottomSheet(

View file

@ -337,7 +337,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onClickSwap(data: TangemPayTopUpData) {
analytics.send(TangemPayAnalyticsEvents.SwapClicked)
analytics.send(TangemPayAnalyticsEvents.SwapClicked())
bottomSheetNavigation.dismiss()
router.push(
AppRoute.Swap(
@ -356,7 +356,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onClickReceive(data: TangemPayTopUpData) {
analytics.send(TangemPayAnalyticsEvents.ReceiveFundsClicked)
analytics.send(TangemPayAnalyticsEvents.ReceiveFundsClicked())
bottomSheetNavigation.dismiss()
val config = TokenReceiveConfig(
shouldShowWarning = false,

View file

@ -50,7 +50,7 @@ internal class TangemPayOnboardingModel @Inject constructor(
field = MutableStateFlow(getInitialState())
init {
analytics.send(TangemPayAnalyticsEvents.ActivationScreenOpened)
analytics.send(TangemPayAnalyticsEvents.ActivationScreenOpened())
modelScope.launch {
when (params) {
is TangemPayOnboardingComponent.Params.ContinueOnboarding -> {
@ -118,13 +118,13 @@ internal class TangemPayOnboardingModel @Inject constructor(
}
private fun onTermsClick() {
analytics.send(TangemPayAnalyticsEvents.ViewTermsClicked)
analytics.send(TangemPayAnalyticsEvents.ViewTermsClicked())
urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK)
}
@Suppress("NullableToStringCall")
private fun onGetCardClick() {
analytics.send(TangemPayAnalyticsEvents.GetCardClicked)
analytics.send(TangemPayAnalyticsEvents.GetCardClicked())
uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = true))
modelScope.launch {
// TODO implement selector

View file

@ -878,7 +878,7 @@ internal class TokenDetailsModel @Inject constructor(
PromoAnalyticsEvent.PromotionBannerClicked(
source = AnalyticsParam.ScreensSources.Token,
program = PromoAnalyticsEvent.Program.Empty, // Use it on new promo action
action = PromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Closed,
action = PromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Closed(),
),
)
}
@ -891,7 +891,7 @@ internal class TokenDetailsModel @Inject constructor(
PromoAnalyticsEvent.PromotionBannerClicked(
source = AnalyticsParam.ScreensSources.Token,
program = PromoAnalyticsEvent.Program.Empty, // Use it on new promo action
action = PromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Clicked,
action = PromoAnalyticsEvent.PromotionBannerClicked.BannerAction.Clicked(),
),
)
}

View file

@ -83,9 +83,9 @@ internal class TokenDetailsOnrampTransactionStateConverter(
fallbackResId = R.drawable.ic_currency_24,
),
iconState = getIconState(value.status),
onGoToProviderClick = {
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider)
clickIntents.onGoToProviderClick(it)
onGoToProviderClick = { url ->
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider())
clickIntents.onGoToProviderClick(url)
},
onClick = { clickIntents.onExpressTransactionClick(value.txId) },
onDisposeExpressStatus = clickIntents::onConfirmDisposeExpressStatus,
@ -117,7 +117,7 @@ internal class TokenDetailsOnrampTransactionStateConverter(
private fun onProviderClick(externalTxUrl: String?) = if (externalTxUrl != null) {
{
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider)
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider())
clickIntents.onGoToProviderClick(externalTxUrl)
}
} else {
@ -269,7 +269,7 @@ internal class TokenDetailsOnrampTransactionStateConverter(
icon = R.drawable.ic_arrow_top_right_24,
text = resourceReference(R.string.common_go_to_provider),
onClick = {
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider)
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider())
clickIntents.onGoToProviderClick(externalTxUrl)
},
)

View file

@ -220,7 +220,7 @@ internal class WalletSettingsModel @Inject constructor(
},
onReferralClick = { onReferralClick(userWallet) },
onManageTokensClick = {
analyticsEventHandler.send(Settings.ButtonManageTokens)
analyticsEventHandler.send(Settings.ButtonManageTokens())
router.push(
AppRoute.ManageTokens(
source = Source.SETTINGS,

View file

@ -95,7 +95,7 @@ internal class OrganizeTokensModel @Inject constructor(
val onBack = MutableSharedFlow<Unit>()
init {
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ScreenOpened)
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ScreenOpened())
getBalanceHidingSettingsUseCase()
.onEach {
@ -117,7 +117,7 @@ internal class OrganizeTokensModel @Inject constructor(
val list = cachedAccountStatusList ?: return
if (list.sortType == TokensSortType.BALANCE) return
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ByBalance)
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ByBalance())
modelScope.launch {
toggleTokenListSortingUseCaseV2(list).fold(
@ -132,7 +132,7 @@ internal class OrganizeTokensModel @Inject constructor(
val list = cachedTokenList ?: return
if (list.sortedBy == TokensSortType.BALANCE) return
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ByBalance)
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ByBalance())
modelScope.launch {
toggleTokenListSortingUseCase(list).fold(
@ -150,7 +150,7 @@ internal class OrganizeTokensModel @Inject constructor(
if (accountsFeatureToggles.isFeatureEnabled) {
val list = cachedAccountStatusList ?: return
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.Group)
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.Group())
modelScope.launch {
toggleTokenListGroupingUseCaseV2(list).fold(
@ -164,7 +164,7 @@ internal class OrganizeTokensModel @Inject constructor(
} else {
val list = cachedTokenList ?: return
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.Group)
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.Group())
modelScope.launch {
toggleTokenListGroupingUseCase(list).fold(
@ -228,7 +228,7 @@ internal class OrganizeTokensModel @Inject constructor(
}
override fun onCancelClick() {
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.Cancel)
analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.Cancel())
modelScope.launch { onBack.emit(Unit) }
}

View file

@ -118,7 +118,7 @@ internal class WalletModel @Inject constructor(
init {
if (!hotWalletFeatureToggles.isHotWalletEnabled) {
analyticsEventsHandler.send(WalletScreenAnalyticsEvent.MainScreen.ScreenOpenedLegacy)
analyticsEventsHandler.send(WalletScreenAnalyticsEvent.MainScreen.ScreenOpenedLegacy())
}
suggestToOpenMarkets()

View file

@ -51,7 +51,7 @@ internal class VisaWalletIntentsImplementor @Inject constructor(
}
override fun onBalancesAndLimitsClick() {
analyticsEventHandler.send(MainScreenAnalyticsEvent.LimitsClicked)
analyticsEventHandler.send(MainScreenAnalyticsEvent.LimitsClicked())
modelScope.launch(dispatchers.main) {
val userWalletId = stateController.getSelectedWalletId()
val balancesAndLimits = getVisaCurrencyUseCase(userWalletId)
@ -92,7 +92,7 @@ internal class VisaWalletIntentsImplementor @Inject constructor(
}
override fun onExploreClick(exploreUrl: String) {
analyticsEventHandler.send(MainScreenAnalyticsEvent.ButtonExplore)
analyticsEventHandler.send(MainScreenAnalyticsEvent.ButtonExplore())
router.openUrl(exploreUrl)
}

View file

@ -54,7 +54,7 @@ internal class WalletCardClickIntentsImplementor @Inject constructor(
) : BaseWalletClickIntents(), WalletCardClickIntents {
override fun onRenameBeforeConfirmationClick(userWalletId: UserWalletId) {
analyticsEventHandler.send(MainScreen.EditWalletTapped)
analyticsEventHandler.send(MainScreen.EditWalletTapped())
router.dialogNavigation.activate(
configuration = WalletDialogConfig.RenameWallet(
@ -65,7 +65,7 @@ internal class WalletCardClickIntentsImplementor @Inject constructor(
}
override fun onDeleteBeforeConfirmationClick(userWalletId: UserWalletId) {
analyticsEventHandler.send(MainScreen.DeleteWalletTapped)
analyticsEventHandler.send(MainScreen.DeleteWalletTapped())
walletEventSender.send(
event = WalletEvent.ShowAlert(

View file

@ -141,7 +141,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
) : BaseWalletClickIntents(), WalletWarningsClickIntents {
override fun onAddBackupCardClick() {
analyticsEventHandler.send(MainScreen.NoticeBackupYourWalletTapped)
analyticsEventHandler.send(MainScreen.NoticeBackupYourWalletTapped())
prepareAndStartOnboardingProcess()
}
@ -169,7 +169,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
override fun onGenerateMissedAddressesClick(missedAddressCurrencies: List<CryptoCurrency>) {
analyticsEventHandler.send(Basic.CardWasScanned(AnalyticsParam.ScreensSources.Main))
analyticsEventHandler.send(MainScreen.NoticeScanYourCardTapped)
analyticsEventHandler.send(MainScreen.NoticeScanYourCardTapped())
modelScope.launch {
val userWallet = getSelectedUserWallet() ?: return@launch
@ -187,7 +187,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
}
override fun onOpenUnlockWalletsBottomSheetClick() {
analyticsEventHandler.send(MainScreen.WalletUnlockTapped)
analyticsEventHandler.send(MainScreen.WalletUnlockTapped())
if (hotWalletFeatureToggles.isHotWalletEnabled) {
modelScope.launch {
@ -218,7 +218,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
@Deprecated("Will be removed with hot wallet release")
override fun onUnlockWalletClick() {
analyticsEventHandler.send(MainScreen.UnlockAllWithBiometrics)
analyticsEventHandler.send(MainScreen.UnlockAllWithBiometrics())
modelScope.launch(dispatchers.main) {
unlockWalletsUseCase(type = UnlockType.ALL_WITHOUT_SELECT)
@ -246,7 +246,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
@Deprecated("Will be removed with hot wallet release")
override fun onScanToUnlockWalletClick() {
analyticsEventHandler.send(MainScreen.UnlockWithCardScan)
analyticsEventHandler.send(MainScreen.UnlockWithCardScan())
openScanCardDialog()
}
@ -304,17 +304,17 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
override fun onClosePromoClick(promoId: PromoId) {
analyticsEventHandler.send(
when (promoId) {
PromoId.Referral -> MainScreen.ReferralPromoButtonDismiss
PromoId.Referral -> MainScreen.ReferralPromoButtonDismiss()
PromoId.Sepa -> PromotionBannerClicked(
source = AnalyticsParam.ScreensSources.Main,
program = Program.Sepa,
action = PromotionBannerClicked.BannerAction.Closed,
action = PromotionBannerClicked.BannerAction.Closed(),
)
PromoId.VisaPresale -> PromoAnalyticsEvent.VisaWaitlistPromoDismiss
PromoId.VisaPresale -> PromoAnalyticsEvent.VisaWaitlistPromoDismiss()
PromoId.BlackFriday -> PromotionBannerClicked(
source = AnalyticsParam.ScreensSources.Main,
program = Program.BlackFriday,
action = PromotionBannerClicked.BannerAction.Closed,
action = PromotionBannerClicked.BannerAction.Closed(),
)
},
@ -328,7 +328,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
val userWallet = getSelectedUserWallet() ?: return
when (promoId) {
PromoId.Referral -> {
analyticsEventHandler.send(MainScreen.ReferralPromoButtonParticipate)
analyticsEventHandler.send(MainScreen.ReferralPromoButtonParticipate())
appRouter.push(ReferralProgram(userWalletId = userWallet.walletId))
}
PromoId.Sepa -> {
@ -336,7 +336,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
PromotionBannerClicked(
source = AnalyticsParam.ScreensSources.Main,
program = Program.Sepa,
action = PromotionBannerClicked.BannerAction.Clicked,
action = PromotionBannerClicked.BannerAction.Clicked(),
),
)
cryptoCurrency ?: return
@ -350,7 +350,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
)
}
PromoId.VisaPresale -> {
analyticsEventHandler.send(PromoAnalyticsEvent.VisaWaitlistPromoJoin)
analyticsEventHandler.send(PromoAnalyticsEvent.VisaWaitlistPromoJoin())
urlOpener.openUrl(VISA_PROMO_LINK)
}
PromoId.BlackFriday -> {
@ -358,7 +358,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
PromotionBannerClicked(
source = AnalyticsParam.ScreensSources.Main,
program = Program.BlackFriday,
action = PromotionBannerClicked.BannerAction.Clicked,
action = PromotionBannerClicked.BannerAction.Clicked(),
),
)
urlOpener.openUrl(BLACK_FRIDAY_PROMO_LINK)
@ -376,7 +376,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
}
override fun onNoteMigrationButtonClick(url: String) {
analyticsEventHandler.send(MainScreen.NotePromoButton)
analyticsEventHandler.send(MainScreen.NotePromoButton())
modelScope.launch(dispatchers.main) {
router.openUrl(url)
}
@ -385,7 +385,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
override fun onSeedPhraseNotificationConfirm() {
val userWallet = getSelectedUserWallet() ?: return
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonYes)
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonYes())
walletEventSender.send(
event = WalletEvent.ShowAlert(
@ -408,7 +408,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
override fun onSeedPhraseNotificationDecline() {
val userWallet = getSelectedUserWallet() ?: return
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonNo)
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonNo())
walletEventSender.send(
event = WalletEvent.ShowAlert(
@ -427,7 +427,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
override fun onSeedPhraseSecondNotificationAccept() {
val userWallet = getSelectedUserWallet() ?: return
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonUsed)
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonUsed())
walletEventSender.send(
event = WalletEvent.ShowAlert(
@ -450,7 +450,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
override fun onSeedPhraseSecondNotificationReject() {
val userWallet = getSelectedUserWallet() ?: return
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonDeclined)
analyticsEventHandler.send(MainScreen.NoticeSeedPhraseSupportButtonDeclined())
modelScope.launch {
seedPhraseNotificationUseCase.rejectSecond(userWalletId = userWallet.walletId)
@ -458,13 +458,13 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
}
override fun onFinishWalletActivationClick(isBackupExists: Boolean) {
analyticsEventHandler.send(MainScreen.ButtonFinalizeActivation)
analyticsEventHandler.send(MainScreen.ButtonFinalizeActivation())
val userWalletId = stateHolder.getSelectedWalletId()
appRouter.push(WalletActivation(userWalletId, isBackupExists))
}
override fun onAllowPermissions() {
analyticsEventHandler.send(WalletScreenAnalyticsEvent.PushBannerPromo.ButtonAllowPush)
analyticsEventHandler.send(WalletScreenAnalyticsEvent.PushBannerPromo.ButtonAllowPush())
walletEventSender.send(
event = WalletEvent.RequestPushPermissions(
onAllow = {
@ -490,7 +490,7 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
override fun onDenyPermissions() {
modelScope.launch {
analyticsEventHandler.send(WalletScreenAnalyticsEvent.PushBannerPromo.ButtonLaterPush)
analyticsEventHandler.send(WalletScreenAnalyticsEvent.PushBannerPromo.ButtonLaterPush())
updateSubscribeOnPushPermissions(false)
}
}

View file

@ -49,7 +49,7 @@ internal class DefaultPromoDeeplinkHandler @AssistedInject constructor(
) : PromoDeeplinkHandler {
init {
analyticsEventsHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart)
analyticsEventsHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart())
val promoCode = queryParams[PROMO_CODE_KEY].orEmpty()
if (promoCode.isEmpty()) {
showAlert(InvalidPromoCode)

View file

@ -8,7 +8,7 @@ sealed class PromoActivationAnalytics(
params: Map<String, String> = mapOf(),
) : AnalyticsEvent(category = "Promotion", event = event, params = params) {
data object PromoDeepLinkActivationStart : PromoActivationAnalytics(
class PromoDeepLinkActivationStart : PromoActivationAnalytics(
event = "Bitcoin Promo Deep Link Activation",
params = emptyMap(),
)

View file

@ -8,11 +8,11 @@ sealed class PortfolioOrganizeTokensAnalyticsEvent(
params: Map<String, String> = mapOf(),
) : AnalyticsEvent("Portfolio / Organize Tokens", event, params) {
object ScreenOpened : PortfolioOrganizeTokensAnalyticsEvent("Organize Tokens Screen Opened")
class ScreenOpened : PortfolioOrganizeTokensAnalyticsEvent("Organize Tokens Screen Opened")
object ByBalance : PortfolioOrganizeTokensAnalyticsEvent("Button - By Balance")
class ByBalance : PortfolioOrganizeTokensAnalyticsEvent("Button - By Balance")
object Group : PortfolioOrganizeTokensAnalyticsEvent("Button - Group")
class Group : PortfolioOrganizeTokensAnalyticsEvent("Button - Group")
class Apply(
grouping: AnalyticsParam.OnOffState,
@ -25,5 +25,5 @@ sealed class PortfolioOrganizeTokensAnalyticsEvent(
),
)
object Cancel : PortfolioOrganizeTokensAnalyticsEvent("Button - Cancel")
class Cancel : PortfolioOrganizeTokensAnalyticsEvent("Button - Cancel")
}

View file

@ -51,7 +51,7 @@ sealed class WalletScreenAnalyticsEvent {
params: Map<String, String> = mapOf(),
) : AnalyticsEvent(category = "Main Screen", event = event, params = params) {
data object ScreenOpenedLegacy : MainScreen(
class ScreenOpenedLegacy : MainScreen(
event = "Screen opened",
)
@ -72,7 +72,7 @@ sealed class WalletScreenAnalyticsEvent {
}
}
data object ButtonFinalizeActivation : MainScreen(
class ButtonFinalizeActivation : MainScreen(
event = "Button - Finalize Activation",
)
@ -93,9 +93,9 @@ sealed class WalletScreenAnalyticsEvent {
params = mapOf("Result" to result.value),
)
data object NoticeBackupYourWalletTapped : MainScreen(event = "Notice - Backup Your Wallet Tapped")
data object NoticeScanYourCardTapped : MainScreen(event = "Notice - Scan Your Card Tapped")
data object WalletUnlockTapped : MainScreen(event = "Notice - Wallet Unlock Tapped")
class NoticeBackupYourWalletTapped : MainScreen(event = "Notice - Backup Your Wallet Tapped")
class NoticeScanYourCardTapped : MainScreen(event = "Notice - Scan Your Card Tapped")
class WalletUnlockTapped : MainScreen(event = "Notice - Wallet Unlock Tapped")
class NetworksUnreachable(
tokens: List<String>,
@ -104,54 +104,54 @@ sealed class WalletScreenAnalyticsEvent {
params = mapOf("Tokens" to tokens.joinToString()),
)
data object MissingAddresses : MainScreen(event = "Notice - Missing Addresses")
class MissingAddresses : MainScreen(event = "Notice - Missing Addresses")
data object CardSignedTransactions : MainScreen(event = "Notice - Card Signed Transactions")
class CardSignedTransactions : MainScreen(event = "Notice - Card Signed Transactions")
data object HowDoYouLikeTangem : MainScreen(event = "Notice - How Do You Like Tangem")
class HowDoYouLikeTangem : MainScreen(event = "Notice - How Do You Like Tangem")
data object ProductSampleCard : MainScreen(event = "Notice - Product Sample Card")
class ProductSampleCard : MainScreen(event = "Notice - Product Sample Card")
data object TestnetCard : MainScreen(event = "Notice - Testnet Card")
class TestnetCard : MainScreen(event = "Notice - Testnet Card")
data object DemoCard : MainScreen(event = "Notice - Demo Card")
class DemoCard : MainScreen(event = "Notice - Demo Card")
data object DevelopmentCard : MainScreen(event = "Notice - Development Card")
class DevelopmentCard : MainScreen(event = "Notice - Development Card")
data object WalletUnlock : MainScreen(event = "Notice - Wallet Unlock")
class WalletUnlock : MainScreen(event = "Notice - Wallet Unlock")
data object BackupYourWallet : MainScreen(event = "Notice - Backup Your Wallet")
class BackupYourWallet : MainScreen(event = "Notice - Backup Your Wallet")
data object BackupError : MainScreen(event = "Notice - Backup Error")
class BackupError : MainScreen(event = "Notice - Backup Error")
data object NotePromo : MainScreen(event = "Notice - Note Promo")
class NotePromo : MainScreen(event = "Notice - Note Promo")
data object NotePromoButton : MainScreen(event = "Note Promo Button")
class NotePromoButton : MainScreen(event = "Note Promo Button")
data object UnlockAllWithBiometrics : MainScreen(event = "Button - Unlock All With Biometrics")
class UnlockAllWithBiometrics : MainScreen(event = "Button - Unlock All With Biometrics")
data object UnlockWithCardScan : MainScreen(event = "Button - Unlock With Card Scan")
class UnlockWithCardScan : MainScreen(event = "Button - Unlock With Card Scan")
data object EditWalletTapped : MainScreen(event = "Button - Edit Wallet Tapped")
class EditWalletTapped : MainScreen(event = "Button - Edit Wallet Tapped")
data object DeleteWalletTapped : MainScreen(event = "Button - Delete Wallet Tapped")
class DeleteWalletTapped : MainScreen(event = "Button - Delete Wallet Tapped")
data object NoticeSeedPhraseSupport : MainScreen(event = "Notice - Seed Phrase Support")
class NoticeSeedPhraseSupport : MainScreen(event = "Notice - Seed Phrase Support")
data object NoticeSeedPhraseSupportSecond : MainScreen(event = "Notice - Seed Phrase Support2")
class NoticeSeedPhraseSupportSecond : MainScreen(event = "Notice - Seed Phrase Support2")
data object NoticeSeedPhraseSupportButtonNo : MainScreen(event = "Button - Support No")
class NoticeSeedPhraseSupportButtonNo : MainScreen(event = "Button - Support No")
data object NoticeSeedPhraseSupportButtonYes : MainScreen(event = "Button - Support Yes")
class NoticeSeedPhraseSupportButtonYes : MainScreen(event = "Button - Support Yes")
data object NoticeSeedPhraseSupportButtonUsed : MainScreen(event = "Button - Support Used")
class NoticeSeedPhraseSupportButtonUsed : MainScreen(event = "Button - Support Used")
data object NoticeSeedPhraseSupportButtonDeclined : MainScreen(event = "Button - Support Declined")
class NoticeSeedPhraseSupportButtonDeclined : MainScreen(event = "Button - Support Declined")
// region Referral Promo
data object ReferralPromo : MainScreen(event = "Referral Banner")
data object ReferralPromoButtonParticipate : MainScreen(event = "Button - Referral Participate")
data object ReferralPromoButtonDismiss : MainScreen(event = "Button - Referral Dismiss")
class ReferralPromo : MainScreen(event = "Referral Banner")
class ReferralPromoButtonParticipate : MainScreen(event = "Button - Referral Participate")
class ReferralPromoButtonDismiss : MainScreen(event = "Button - Referral Dismiss")
//endregion
}
@ -160,8 +160,8 @@ sealed class WalletScreenAnalyticsEvent {
params: Map<String, String> = mapOf(),
) : AnalyticsEvent(category = "Promo", event = event, params = params) {
data object PushBanner : PushBannerPromo(event = "Push Banner")
data object ButtonAllowPush : PushBannerPromo(event = "Button - Allow Push")
data object ButtonLaterPush : PushBannerPromo(event = "Button - Later Push")
class PushBanner : PushBannerPromo(event = "Push Banner")
class ButtonAllowPush : PushBannerPromo(event = "Button - Allow Push")
class ButtonLaterPush : PushBannerPromo(event = "Button - Later Push")
}
}

View file

@ -28,7 +28,7 @@ internal class SelectedWalletAnalyticsSender @Inject constructor(
* that cannot be processed in [WalletWarningsAnalyticsSender].
* */
private fun getEvent(userWallet: UserWallet): AnalyticsEvent? = when {
userWallet.isLocked -> WalletScreenAnalyticsEvent.MainScreen.WalletUnlock
userWallet.isLocked -> WalletScreenAnalyticsEvent.MainScreen.WalletUnlock()
else -> WalletScreenAnalyticsEvent.MainScreen.WalletSelected(userWallet.isImported())
}

View file

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

View file

@ -39,16 +39,16 @@ internal class WalletWarningsAnalyticsSender @Inject constructor(
@Suppress("CyclomaticComplexMethod")
private fun getEvent(warning: WalletNotification): AnalyticsEvent? {
return when (warning) {
is WalletNotification.Critical.DevCard -> MainScreen.DevelopmentCard
is WalletNotification.Critical.FailedCardValidation -> MainScreen.ProductSampleCard
is WalletNotification.Warning.MissingBackup -> MainScreen.BackupYourWallet
is WalletNotification.Warning.NumberOfSignedHashesIncorrect -> MainScreen.CardSignedTransactions
is WalletNotification.Warning.TestNetCard -> MainScreen.TestnetCard
is WalletNotification.Informational.DemoCard -> MainScreen.DemoCard
is WalletNotification.Informational.MissingAddresses -> MainScreen.MissingAddresses
is WalletNotification.RateApp -> MainScreen.HowDoYouLikeTangem
is WalletNotification.Critical.BackupError -> MainScreen.BackupError
is WalletNotification.NoteMigration -> MainScreen.NotePromo
is WalletNotification.Critical.DevCard -> MainScreen.DevelopmentCard()
is WalletNotification.Critical.FailedCardValidation -> MainScreen.ProductSampleCard()
is WalletNotification.Warning.MissingBackup -> MainScreen.BackupYourWallet()
is WalletNotification.Warning.NumberOfSignedHashesIncorrect -> MainScreen.CardSignedTransactions()
is WalletNotification.Warning.TestNetCard -> MainScreen.TestnetCard()
is WalletNotification.Informational.DemoCard -> MainScreen.DemoCard()
is WalletNotification.Informational.MissingAddresses -> MainScreen.MissingAddresses()
is WalletNotification.RateApp -> MainScreen.HowDoYouLikeTangem()
is WalletNotification.Critical.BackupError -> MainScreen.BackupError()
is WalletNotification.NoteMigration -> MainScreen.NotePromo()
is WalletNotification.SwapPromo -> NoticePromotionBanner(
source = AnalyticsParam.ScreensSources.Main,
program = Program.Empty, // Use it on new promo action
@ -61,8 +61,8 @@ internal class WalletWarningsAnalyticsSender @Inject constructor(
source = AnalyticsParam.ScreensSources.Main,
program = Program.BlackFriday,
)
is WalletNotification.ReferralPromo -> MainScreen.ReferralPromo
is WalletNotification.VisaPresalePromo -> VisaWaitlistPromo
is WalletNotification.ReferralPromo -> MainScreen.ReferralPromo()
is WalletNotification.VisaPresalePromo -> VisaWaitlistPromo()
is WalletNotification.UnlockWallets -> null // See [SelectedWalletAnalyticsSender]
is WalletNotification.Informational.NoAccount,
is WalletNotification.Warning.LowSignatures,
@ -80,9 +80,9 @@ internal class WalletWarningsAnalyticsSender @Inject constructor(
}
MainScreen.NoticeFinishActivation(activationState)
}
is WalletNotification.Critical.SeedPhraseNotification -> MainScreen.NoticeSeedPhraseSupport
is WalletNotification.Critical.SeedPhraseSecondNotification -> MainScreen.NoticeSeedPhraseSupportSecond
is WalletNotification.PushNotifications -> WalletScreenAnalyticsEvent.PushBannerPromo.PushBanner
is WalletNotification.Critical.SeedPhraseNotification -> MainScreen.NoticeSeedPhraseSupport()
is WalletNotification.Critical.SeedPhraseSecondNotification -> MainScreen.NoticeSeedPhraseSupportSecond()
is WalletNotification.PushNotifications -> WalletScreenAnalyticsEvent.PushBannerPromo.PushBanner()
is WalletNotification.Warning.TangemPayRefreshNeeded -> null
WalletNotification.Warning.TangemPayUnreachable -> null
}

View file

@ -154,7 +154,7 @@ internal class SetVisaInfoTransformer(
clickIntents.onReceiveClick(
userWalletId = userWalletId,
cryptoCurrencyStatus = cryptoCurrencyStatus,
event = MainScreenAnalyticsEvent.ButtonReceive,
event = MainScreenAnalyticsEvent.ButtonReceive(),
)
},
onLongClick = {

View file

@ -44,12 +44,12 @@ internal class BalancesAndLimitsBottomSheetConverter(
}
private fun balanceInfoOnClick() {
analyticsEventHandler.send(MainScreenAnalyticsEvent.NoticeBalancesInfo)
analyticsEventHandler.send(MainScreenAnalyticsEvent.NoticeBalancesInfo())
eventSender.send(WalletEvent.ShowAlert(WalletAlertState.VisaBalancesInfo))
}
private fun limitInfoOnClick(totalLimit: String, otherLimit: String) {
analyticsEventHandler.send(MainScreenAnalyticsEvent.NoticeLimitsInfo)
analyticsEventHandler.send(MainScreenAnalyticsEvent.NoticeLimitsInfo())
eventSender.send(WalletEvent.ShowAlert(WalletAlertState.VisaLimitsInfo(totalLimit, otherLimit)))
}
}

View file

@ -82,9 +82,9 @@ internal class SingleWalletOnrampTransactionConverter(
fallbackResId = R.drawable.ic_currency_24,
),
iconState = getIconState(value.status),
onGoToProviderClick = {
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider)
clickIntents.onGoToProviderClick(it)
onGoToProviderClick = { url ->
analyticsEventHandler.send(TokenOnrampAnalyticsEvent.GoToProvider())
clickIntents.onGoToProviderClick(url)
},
onDisposeExpressStatus = clickIntents::onConfirmDisposeExpressStatus,
onClick = {

View file

@ -115,7 +115,9 @@ class DefaultPromoDeeplinkHandlerTest {
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success_title))
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success))
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.Activated),
@ -143,7 +145,9 @@ class DefaultPromoDeeplinkHandlerTest {
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_invalid_code_title))
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_invalid_code))
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.InvalidPromoCode),
@ -172,7 +176,9 @@ class DefaultPromoDeeplinkHandlerTest {
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_error_title))
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_error))
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.Failed),
@ -209,7 +215,9 @@ class DefaultPromoDeeplinkHandlerTest {
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_no_address_title))
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_no_address))
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.NoBitcoinAddress),
@ -248,7 +256,9 @@ class DefaultPromoDeeplinkHandlerTest {
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success_title))
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_activation_success))
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.Activated),
@ -264,7 +274,9 @@ class DefaultPromoDeeplinkHandlerTest {
expectedMessage = resourceReference(R.string.bitcoin_promo_invalid_code),
)
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.InvalidPromoCode),
@ -280,7 +292,9 @@ class DefaultPromoDeeplinkHandlerTest {
expectedMessage = resourceReference(R.string.bitcoin_promo_activation_error),
)
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.Failed),
@ -296,7 +310,9 @@ class DefaultPromoDeeplinkHandlerTest {
expectedMessage = resourceReference(R.string.bitcoin_promo_no_address),
)
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.NoBitcoinAddress),
@ -312,7 +328,9 @@ class DefaultPromoDeeplinkHandlerTest {
expectedMessage = resourceReference(R.string.bitcoin_promo_already_activated),
)
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.PromoCodeAlreadyUsed),
@ -425,7 +443,9 @@ class DefaultPromoDeeplinkHandlerTest {
Truth.assertThat(sent.title).isEqualTo(resourceReference(R.string.bitcoin_promo_no_address_title))
Truth.assertThat(sent.message).isEqualTo(resourceReference(R.string.bitcoin_promo_no_address))
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.NoBitcoinAddress),
@ -539,7 +559,9 @@ class DefaultPromoDeeplinkHandlerTest {
coVerify(exactly = 1) { activateBitcoinPromocodeUseCase.invoke("bc1qcard", promoCode) }
coVerify(exactly = 0) { activateBitcoinPromocodeUseCase.invoke("bc1qcustom", promoCode) }
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.Activated),
@ -594,7 +616,9 @@ class DefaultPromoDeeplinkHandlerTest {
coVerify(exactly = 0) { activateBitcoinPromocodeUseCase.invoke(any(), any()) }
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.NoBitcoinAddress),
@ -649,7 +673,9 @@ class DefaultPromoDeeplinkHandlerTest {
coVerify(exactly = 0) { activateBitcoinPromocodeUseCase.invoke(any(), any()) }
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.NoBitcoinAddress),
@ -700,7 +726,9 @@ class DefaultPromoDeeplinkHandlerTest {
coVerify(exactly = 0) { activateBitcoinPromocodeUseCase.invoke(any(), any()) }
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.NoBitcoinAddress),
@ -751,7 +779,9 @@ class DefaultPromoDeeplinkHandlerTest {
coVerify(exactly = 0) { activateBitcoinPromocodeUseCase.invoke(any(), any()) }
verify(exactly = 1) { analyticsEventHandler.send(PromoActivationAnalytics.PromoDeepLinkActivationStart) }
verify(
exactly = 1,
) { analyticsEventHandler.send(ofType<PromoActivationAnalytics.PromoDeepLinkActivationStart>()) }
verify(exactly = 1) {
analyticsEventHandler.send(
PromoActivationAnalytics.PromoActivation(PromoCodeActivationResult.NoBitcoinAddress),

View file

@ -68,7 +68,7 @@ internal class WcConnectionsModel @Inject constructor(
val bottomSheetNavigation: SlotNavigation<WcConnectionsBottomSheetConfig> = SlotNavigation()
init {
analytics.send(WcAnalyticEvents.ScreenOpened)
analytics.send(WcAnalyticEvents.ScreenOpened())
listenQrUpdates()
if (accountsFeatureToggles.isFeatureEnabled) {
listenWcSessions()

View file

@ -189,7 +189,7 @@ sealed class YieldSupplyAnalytics(
),
)
data object ApyChartViewed : YieldSupplyAnalytics(
class ApyChartViewed : YieldSupplyAnalytics(
event = "APY Chart",
)

View file

@ -60,7 +60,7 @@ internal class YieldSupplyPromoModel @Inject constructor(
}
override fun onApyInfoClick() {
analytics.send(YieldSupplyAnalytics.ApyChartViewed)
analytics.send(YieldSupplyAnalytics.ApyChartViewed())
bottomSheetNavigation.activate(YieldSupplyPromoConfig.Apy)
}