Updated on 2026-08-14

This commit is contained in:
Tangem 2026-02-20 16:49:10 +04:00
parent 1ed2999163
commit 6e267fc067
12 changed files with 182 additions and 122 deletions

View file

@ -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<String, String> = 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,
),
)
}

View file

@ -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<Throwable, List<SwapPairLeast>>
@ -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)
}