From 6e267fc0674cbf69370434fa191074ee804fe41b Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 20 Feb 2026 16:49:10 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../core/analytics/models/AnalyticsParam.kt | 2 + .../models/event/SwapAnalyticsEvent.kt | 29 +++++++++ .../add/impl/model/AddToPortfolioModel.kt | 2 + .../portfolio/add/impl/model/AddTokenModel.kt | 6 ++ .../impl/analytics/PortfolioAnalyticsEvent.kt | 62 ++++++++++++++++--- .../add/impl/model/AddToPortfolioModel.kt | 2 + .../portfolio/add/impl/model/AddTokenModel.kt | 6 ++ .../impl/analytics/PortfolioAnalyticsEvent.kt | 60 +++++++++++++++--- .../model/AvailableSwapPairsAnalyticsEvent.kt | 44 ------------- .../model/AvailableSwapPairsModel.kt | 38 +++++------- .../feature/swap/analytics/SwapEvents.kt | 19 ------ .../tangem/feature/swap/model/SwapModel.kt | 34 +++++----- 12 files changed, 182 insertions(+), 122 deletions(-) create mode 100644 core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/SwapAnalyticsEvent.kt delete mode 100644 features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsAnalyticsEvent.kt diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt index 083fa85275..ae0d6a4253 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt @@ -97,6 +97,7 @@ sealed class AnalyticsParam { data object NewsList : ScreensSources("News List") data object NewsLink : ScreensSources("News Link") data object NewsPage : ScreensSources("News Page") + data object Portfolio : ScreensSources("Portfolio") } sealed class TxSentFrom(val value: String) { @@ -292,6 +293,7 @@ sealed class AnalyticsParam { const val ACCOUNT_DERIVATION = "Account Derivation" const val REFERRAL = "Referral" const val REFERRAL_ID = "Referral_ID" + const val SEARCHED = "Searched" } } diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/SwapAnalyticsEvent.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/SwapAnalyticsEvent.kt new file mode 100644 index 0000000000..e6e5864f91 --- /dev/null +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/event/SwapAnalyticsEvent.kt @@ -0,0 +1,29 @@ +package com.tangem.core.analytics.models.event + +import com.tangem.core.analytics.models.AnalyticsEvent +import com.tangem.core.analytics.models.AnalyticsParam.Key.SEARCHED +import com.tangem.core.analytics.models.AnalyticsParam.Key.SOURCE +import com.tangem.core.analytics.models.AnalyticsParam.Key.TOKEN_PARAM +import com.tangem.core.analytics.models.AnalyticsParam.ScreensSources + +/** +[REDACTED_AUTHOR] + */ +sealed class SwapAnalyticsEvent( + event: String, + params: Map = emptyMap(), +) : AnalyticsEvent("Swap", event, params) { + + data class TokenSelected( + val token: String, + val source: ScreensSources, + val isSearched: Boolean, + ) : SwapAnalyticsEvent( + event = "Token Selected", + params = mapOf( + TOKEN_PARAM to token, + SOURCE to source.value, + SEARCHED to if (isSearched) "True" else "False", + ), + ) +} \ No newline at end of file diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt index e234d1d2f6..0d733ab09f 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddToPortfolioModel.kt @@ -157,6 +157,8 @@ internal class AddToPortfolioModel @Inject constructor( allRequireForAdd.first() // line of navigation to AddToken screen is finished; cancel the job, select a new root screen firstPartOfNavigation.cancel() + + analyticsEventHandler.send(event = eventBuilder.popupToConfirm()) navigation.replaceAll(AddToPortfolioRoutes.AddToken) var middleNavigationJob: Job? = null diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddTokenModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddTokenModel.kt index cd16df3f04..17d27f1aad 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddTokenModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/add/impl/model/AddTokenModel.kt @@ -88,6 +88,7 @@ internal class AddTokenModel @Inject constructor( val blockchainNames = listOf(selectedNetwork.selectedNetwork) .mapNotNull { BlockchainUtils.getNetworkInfo(it.networkId)?.name } analyticsEventHandler.send(analyticsEventBuilder.addToPortfolioContinue(blockchainNames)) + analyticsEventHandler.send(analyticsEventBuilder.addButtonClick()) manageCryptoCurrenciesUseCase(accountId = accountId, add = cryptoCurrency) .onLeft { throwable -> @@ -110,6 +111,11 @@ internal class AddTokenModel @Inject constructor( } is Account.Payment -> TODO("[REDACTED_JIRA]") } + + analyticsEventHandler.send( + event = analyticsEventBuilder.tokenAdded(status.status.currency.network.name), + ) + params.callbacks.onTokenAdded(status.status) } uiState.value = um.toggleProgress(false) diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt index b75d67abf4..87ed9607b7 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt @@ -15,28 +15,64 @@ internal class PortfolioAnalyticsEvent( fun addToPortfolioClicked() = PortfolioAnalyticsEvent( event = "Button - Add To Portfolio", - params = mapOf( - "Token" to tokenSymbol, - ), + params = buildMap { + put("Token", tokenSymbol) + if (source != null) put("Source", source) + }, ) fun popupToChooseAccount() = PortfolioAnalyticsEvent( event = "Choose Account Opened", + params = buildMap { + if (source != null) put("Source", source) + }, + ) + + fun popupToConfirm() = PortfolioAnalyticsEvent( + event = "Add Token Screen Opened", + params = buildMap { + if (source != null) put("Source", source) + }, ) fun addToNotMainAccount() = PortfolioAnalyticsEvent( event = "Button - Add To Account", + params = buildMap { + if (source != null) put("Source", source) + }, ) - fun addToPortfolioWalletChanged() = PortfolioAnalyticsEvent(event = "Wallet Selected") + fun addButtonClick() = PortfolioAnalyticsEvent( + event = "Button - Add Token", + params = buildMap { + if (source != null) put("Source", source) + }, + ) + + fun addToPortfolioWalletChanged() = PortfolioAnalyticsEvent( + event = "Wallet Selected", + params = buildMap { + if (source != null) put("Source", source) + }, + ) fun addToPortfolioContinue(blockchainNames: List) = PortfolioAnalyticsEvent( event = "Token Network Selected", - params = mapOf( - "Count" to blockchainNames.size.toString(), - "Token" to tokenSymbol, - "blockchain" to blockchainNames.joinToString(separator = ", "), - ), + params = buildMap { + put("Count", blockchainNames.size.toString()) + put("Token", tokenSymbol) + put("blockchain", blockchainNames.joinToString(separator = ", ")) + if (source != null) put("Source", source) + }, + ) + + fun tokenAdded(blockchainName: String) = PortfolioAnalyticsEvent( + event = "Token Added", + params = buildMap { + put("Token", tokenSymbol) + put("Blockchain", blockchainName) + if (source != null) put("Source", source) + }, ) fun quickActionClick(actionUM: TokenActionsBSContentUM.Action, blockchainName: String) = @@ -51,7 +87,7 @@ internal class PortfolioAnalyticsEvent( }, params = buildMap { put("Token", tokenSymbol) - source?.let { put("Source", it) } + if (source != null) put("Source", source) put("blockchain", blockchainName) }, ) @@ -64,10 +100,16 @@ internal class PortfolioAnalyticsEvent( TokenActionsBSContentUM.Action.Stake -> "Popup Get token - Button Stake" else -> "error" }, + params = buildMap { + if (source != null) put("Source", source) + }, ) fun getTokenLater() = PortfolioAnalyticsEvent( event = "Popup Get token - Button Later", + params = buildMap { + if (source != null) put("Source", source) + }, ) } } \ No newline at end of file diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddToPortfolioModel.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddToPortfolioModel.kt index 142c66cf7a..71b3634b3d 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddToPortfolioModel.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddToPortfolioModel.kt @@ -151,6 +151,8 @@ internal class AddToPortfolioModel @Inject constructor( allRequireForAdd.first() // line of navigation to AddToken screen is finished; cancel the job, select a new root screen firstPartOfNavigation.cancel() + + analyticsEventHandler.send(event = eventBuilder.popupToConfirm()) navigation.replaceAll(AddToPortfolioRoutes.AddToken) var middleNavigationJob: Job? = null diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddTokenModel.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddTokenModel.kt index edc27eb65f..be45fedb3a 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddTokenModel.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/model/AddTokenModel.kt @@ -88,6 +88,7 @@ internal class AddTokenModel @Inject constructor( val blockchainNames = listOf(selectedNetwork.selectedNetwork) .mapNotNull { BlockchainUtils.getNetworkInfo(it.networkId)?.name } analyticsEventHandler.send(analyticsEventBuilder.addToPortfolioContinue(blockchainNames)) + analyticsEventHandler.send(analyticsEventBuilder.addButtonClick()) manageCryptoCurrenciesUseCase(accountId = accountId, add = cryptoCurrency) .onLeft { error -> @@ -110,6 +111,11 @@ internal class AddTokenModel @Inject constructor( } is Account.Payment -> TODO("[REDACTED_JIRA]") } + + analyticsEventHandler.send( + event = analyticsEventBuilder.tokenAdded(status.status.currency.network.name), + ) + params.callbacks.onTokenAdded(status.status) } uiState.value = um.toggleProgress(false) diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt index ac6125d3c0..2658bb0659 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/analytics/PortfolioAnalyticsEvent.kt @@ -16,28 +16,64 @@ internal class PortfolioAnalyticsEvent( fun addToPortfolioClicked() = PortfolioAnalyticsEvent( event = "Button - Add To Portfolio", - params = mapOf( - "Token" to token.symbol, - ), + params = buildMap { + put("Token", token.symbol) + if (source != null) put("Source", source) + }, ) fun popupToChooseAccount() = PortfolioAnalyticsEvent( event = "Choose Account Opened", + params = buildMap { + if (source != null) put("Source", source) + }, + ) + + fun popupToConfirm() = PortfolioAnalyticsEvent( + event = "Add Token Screen Opened", + params = buildMap { + if (source != null) put("Source", source) + }, ) fun addToNotMainAccount() = PortfolioAnalyticsEvent( event = "Button - Add To Account", + params = buildMap { + if (source != null) put("Source", source) + }, ) - fun addToPortfolioWalletChanged() = PortfolioAnalyticsEvent(event = "Wallet Selected") + fun addButtonClick() = PortfolioAnalyticsEvent( + event = "Button - Add Token", + params = buildMap { + if (source != null) put("Source", source) + }, + ) + + fun addToPortfolioWalletChanged() = PortfolioAnalyticsEvent( + event = "Wallet Selected", + params = buildMap { + if (source != null) put("Source", source) + }, + ) fun addToPortfolioContinue(blockchainNames: List) = PortfolioAnalyticsEvent( event = "Token Network Selected", - params = mapOf( - "Count" to blockchainNames.size.toString(), - "Token" to token.symbol, - "blockchain" to blockchainNames.joinToString(separator = ", "), - ), + params = buildMap { + put("Count", blockchainNames.size.toString()) + put("Token", token.symbol) + put("blockchain", blockchainNames.joinToString(separator = ", ")) + if (source != null) put("Source", source) + }, + ) + + fun tokenAdded(blockchainName: String) = PortfolioAnalyticsEvent( + event = "Token Added", + params = buildMap { + put("Token", token.symbol) + put("Blockchain", blockchainName) + if (source != null) put("Source", source) + }, ) fun quickActionClick(actionUM: TokenActionsBSContentUM.Action, blockchainName: String) = @@ -65,10 +101,16 @@ internal class PortfolioAnalyticsEvent( TokenActionsBSContentUM.Action.Stake -> "Popup Get token - Button Stake" else -> "error" }, + params = buildMap { + if (source != null) put("Source", source) + }, ) fun getTokenLater() = PortfolioAnalyticsEvent( event = "Popup Get token - Button Later", + params = buildMap { + if (source != null) put("Source", source) + }, ) } } \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsAnalyticsEvent.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsAnalyticsEvent.kt deleted file mode 100644 index f5a57df2b5..0000000000 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsAnalyticsEvent.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.tangem.features.onramp.swap.availablepairs.model - -import com.tangem.core.analytics.models.AnalyticsEvent -import com.tangem.core.analytics.models.AnalyticsParam.Key.BLOCKCHAIN -import com.tangem.core.analytics.models.AnalyticsParam.Key.TOKEN_PARAM - -private const val SWAP_CATEGORY = "Swap" - -internal sealed class AvailableSwapPairsAnalyticsEvent( - event: String, - params: Map = emptyMap(), -) : AnalyticsEvent(SWAP_CATEGORY, event, params) { - - class TokenSelected( - val token: String, - val source: String, - val isSearched: Boolean, - ) : AvailableSwapPairsAnalyticsEvent( - event = "Token Selected", - params = mapOf( - TOKEN_PARAM to token, - SOURCE to source, - SEARCHED to if (isSearched) "True" else "False", - ), - ) { - companion object { - const val SOURCE = "Source" - const val SEARCHED = "Searched" - const val SOURCE_PORTFOLIO = "Portfolio" - const val SOURCE_MARKETS = "Markets" - } - } - - class TokenAdded( - val token: String, - val blockchain: String, - ) : AvailableSwapPairsAnalyticsEvent( - event = "Token Added", - params = mapOf( - TOKEN_PARAM to token, - BLOCKCHAIN to blockchain, - ), - ) -} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsModel.kt index 62822d4108..363f0712d5 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/swap/availablepairs/model/AvailableSwapPairsModel.kt @@ -1,11 +1,17 @@ package com.tangem.features.onramp.swap.availablepairs.model +import com.arkivanov.decompose.router.slot.SlotNavigation +import com.arkivanov.decompose.router.slot.activate +import com.arkivanov.decompose.router.slot.dismiss +import com.tangem.blockchainsdk.utils.ExcludedBlockchains +import com.tangem.common.ui.markets.models.MarketsListItemUM import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.analytics.models.AnalyticsParam.ScreensSources +import com.tangem.core.analytics.models.event.SwapAnalyticsEvent import com.tangem.core.decompose.model.Model -import com.tangem.core.ui.components.token.state.TokenItemState import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.ui.components.fields.InputManager -import com.tangem.core.ui.R as CoreUiR +import com.tangem.core.ui.components.token.state.TokenItemState import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.capitalize import com.tangem.core.ui.extensions.resourceReference @@ -43,9 +49,7 @@ import com.tangem.feature.swap.domain.models.domain.SwapPairLeast import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager import com.tangem.features.onramp.impl.R -import com.tangem.features.onramp.tokenlist.entity.utils.OnrampTokenItemStateConverterFactory import com.tangem.features.onramp.swap.availablepairs.AvailableSwapPairsComponent -import com.tangem.features.swap.SwapFeatureToggles import com.tangem.features.onramp.swap.availablepairs.entity.transformers.SetErrorWarningTransformer import com.tangem.features.onramp.swap.availablepairs.entity.transformers.SetLoadingTokenItemsTransformer import com.tangem.features.onramp.swap.availablepairs.entity.transformers.SetNoAvailablePairsTransformer @@ -58,24 +62,22 @@ import com.tangem.features.onramp.tokenlist.entity.TokenListUM import com.tangem.features.onramp.tokenlist.entity.TokenListUMController import com.tangem.features.onramp.tokenlist.entity.TokenListUMTransformer import com.tangem.features.onramp.tokenlist.entity.transformer.* +import com.tangem.features.onramp.tokenlist.entity.utils.OnrampTokenItemStateConverterFactory import com.tangem.features.onramp.utils.UpdateSearchBarActiveStateTransformer import com.tangem.features.onramp.utils.UpdateSearchBarCallbacksTransformer import com.tangem.features.onramp.utils.UpdateSearchQueryTransformer -import com.tangem.blockchainsdk.utils.ExcludedBlockchains -import com.tangem.common.ui.markets.models.MarketsListItemUM +import com.tangem.features.swap.SwapFeatureToggles import com.tangem.lib.crypto.BlockchainUtils -import com.arkivanov.decompose.router.slot.SlotNavigation -import com.arkivanov.decompose.router.slot.activate -import com.arkivanov.decompose.router.slot.dismiss import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.JobHolder import com.tangem.utils.coroutines.runSuspendCatching -import kotlinx.coroutines.ExperimentalCoroutinesApi import com.tangem.utils.coroutines.saveIn +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject +import com.tangem.core.ui.R as CoreUiR private typealias AvailablePairsState = Lce> @@ -567,9 +569,9 @@ internal class AvailableSwapPairsModel @Inject constructor( private fun onPortfolioTokenClick(tokenItem: TokenItemState, status: CryptoCurrencyStatus) { analyticsEventHandler.send( - AvailableSwapPairsAnalyticsEvent.TokenSelected( + SwapAnalyticsEvent.TokenSelected( token = status.currency.symbol, - source = AvailableSwapPairsAnalyticsEvent.TokenSelected.SOURCE_PORTFOLIO, + source = ScreensSources.Portfolio, isSearched = state.value.searchBarUM.query.isNotEmpty(), ), ) @@ -686,15 +688,9 @@ internal class AvailableSwapPairsModel @Inject constructor( modelScope.launch { bottomSheetNavigation.dismiss() analyticsEventHandler.send( - AvailableSwapPairsAnalyticsEvent.TokenAdded( + SwapAnalyticsEvent.TokenSelected( token = addedToken.symbol, - blockchain = addedToken.network.name, - ), - ) - analyticsEventHandler.send( - AvailableSwapPairsAnalyticsEvent.TokenSelected( - token = addedToken.symbol, - source = AvailableSwapPairsAnalyticsEvent.TokenSelected.SOURCE_MARKETS, + source = ScreensSources.Markets, isSearched = state.value.searchBarUM.query.isNotEmpty(), ), ) @@ -746,7 +742,7 @@ internal class AvailableSwapPairsModel @Inject constructor( .create( scope = modelScope, token = param, - analyticsParams = null, + analyticsParams = AddToPortfolioManager.AnalyticsParams(source = ScreensSources.Swap.value), ).apply { setTokenNetworks(networks) } diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt index cd44e2f95c..89a8266fd1 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/analytics/SwapEvents.kt @@ -46,31 +46,12 @@ sealed class SwapEvents( class ChooseTokenScreenResult( val isTokenChosen: Boolean, val token: String? = null, - val source: String? = null, - val isSearched: Boolean? = null, ) : SwapEvents( event = "Choose Token Screen Result", params = buildMap { put("Token Chosen", if (isTokenChosen) "Yes" else "No") token?.let { put("Token", it) } - source?.let { put(TOKEN_SELECTED_SOURCE, it) } - isSearched?.let { put(SEARCHED, if (it) "True" else "False") } }, - ) { - companion object { - const val TOKEN_SELECTED_SOURCE = "Token Selected Source" - const val SEARCHED = "Searched" - const val SOURCE_PORTFOLIO = "Portfolio" - const val SOURCE_MARKETS = "Markets" - } - } - - class TokenAdded(val token: String, val blockchain: String) : SwapEvents( - event = "Token Added", - params = mapOf( - TOKEN_PARAM to token, - BLOCKCHAIN to blockchain, - ), ) class ButtonSwapClicked(val sendToken: String, val receiveToken: String) : SwapEvents( diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt index fb4e74e1ff..0f0e4c1d4c 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/model/SwapModel.kt @@ -4,7 +4,6 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue - import arrow.core.Either import arrow.core.getOrElse import com.arkivanov.decompose.router.slot.SlotNavigation @@ -19,12 +18,15 @@ import com.tangem.common.ui.markets.models.MarketsListItemUM import com.tangem.core.analytics.api.AnalyticsErrorHandler import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam +import com.tangem.core.analytics.models.AnalyticsParam.ScreensSources import com.tangem.core.analytics.models.Basic +import com.tangem.core.analytics.models.event.SwapAnalyticsEvent import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.ui.HoldToConfirmButtonFeatureToggles +import com.tangem.core.ui.R import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.utils.InputNumberFormatter @@ -90,7 +92,6 @@ import com.tangem.feature.swap.models.UiActions import com.tangem.feature.swap.models.market.SwapMarketsListBatchFlowManager import com.tangem.feature.swap.models.market.state.SwapMarketState import com.tangem.feature.swap.models.states.SwapNotificationUM -import com.tangem.core.ui.R import com.tangem.feature.swap.router.SwapNavScreen import com.tangem.feature.swap.router.SwapRouter import com.tangem.feature.swap.ui.StateBuilder @@ -107,12 +108,8 @@ import com.tangem.utils.Provider import com.tangem.utils.TangemBlogUrlBuilder.RESOURCE_TO_LEARN_ABOUT_APPROVING_IN_SWAP import com.tangem.utils.coroutines.* import com.tangem.utils.isNullOrZero -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.NonCancellable -import kotlinx.coroutines.delay +import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import timber.log.Timber import java.math.BigDecimal import java.math.RoundingMode @@ -300,17 +297,13 @@ internal class SwapModel @Inject constructor( modelScope.launch { bottomSheetNavigation.dismiss() analyticsEventHandler.send( - SwapEvents.ChooseTokenScreenResult( - isTokenChosen = true, - token = addedToken.symbol, - source = SwapEvents.ChooseTokenScreenResult.SOURCE_MARKETS, - isSearched = searchQueryState.value.isNotEmpty(), - ), + SwapEvents.ChooseTokenScreenResult(isTokenChosen = true, token = addedToken.symbol), ) analyticsEventHandler.send( - SwapEvents.TokenAdded( + SwapAnalyticsEvent.TokenSelected( token = addedToken.symbol, - blockchain = addedToken.network.name, + source = ScreensSources.Markets, + isSearched = searchQueryState.value.isNotEmpty(), ), ) searchQueryState.value = "" @@ -1339,10 +1332,13 @@ internal class SwapModel @Inject constructor( foundToken?.currency?.symbol?.let { symbol -> analyticsEventHandler.send( - SwapEvents.ChooseTokenScreenResult( - isTokenChosen = true, + SwapEvents.ChooseTokenScreenResult(isTokenChosen = true, token = symbol), + ) + + analyticsEventHandler.send( + SwapAnalyticsEvent.TokenSelected( token = symbol, - source = SwapEvents.ChooseTokenScreenResult.SOURCE_PORTFOLIO, + source = ScreensSources.Portfolio, isSearched = searchQueryState.value.isNotEmpty(), ), ) @@ -2241,7 +2237,7 @@ internal class SwapModel @Inject constructor( .create( scope = modelScope, token = param, - analyticsParams = null, + analyticsParams = AddToPortfolioManager.AnalyticsParams(source = ScreensSources.Swap.value), ).apply { setTokenNetworks(networks) }