From 2071dd9e2d34d149c060fd9c336deb17cd63a634 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 27 May 2026 23:29:32 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../feature/swap/analytics/SwapEvents.kt | 48 ++++++++++++++++++- .../tangem/feature/swap/model/SwapModel.kt | 26 +++++++++- .../feature/swap/models/SwapStateHolder.kt | 1 + .../tangem/feature/swap/models/UiActions.kt | 1 + .../tangem/feature/swap/ui/StateBuilder.kt | 1 + .../com/tangem/feature/swap/ui/SwapScreen.kt | 5 +- 6 files changed, 77 insertions(+), 5 deletions(-) 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 9a5ad696ea..c17789bc7a 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 @@ -8,12 +8,15 @@ import com.tangem.core.analytics.models.AnalyticsParam.Key.ERROR_MESSAGE import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.analytics.models.AnalyticsParam.Key.FEE_TOKEN import com.tangem.core.analytics.models.AnalyticsParam.Key.PROVIDER +import com.tangem.core.analytics.models.AnalyticsParam.Key.RECEIVE_BLOCKCHAIN import com.tangem.core.analytics.models.AnalyticsParam.Key.RECEIVE_TOKEN +import com.tangem.core.analytics.models.AnalyticsParam.Key.SEND_BLOCKCHAIN import com.tangem.core.analytics.models.AnalyticsParam.Key.SEND_TOKEN import com.tangem.core.analytics.models.AppsFlyerIncludedEvent import com.tangem.core.analytics.models.getReferralParams import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.feature.swap.domain.models.domain.SwapProvider +import com.tangem.feature.swap.domain.models.domain.SwapUIMode import com.tangem.feature.swap.domain.models.ui.FeeBucket private const val SWAP_CATEGORY = "Swap" @@ -37,6 +40,39 @@ sealed class SwapEvents( ), ), AppsFlyerIncludedEvent + class SwapType(val mode: SwapUIMode) : SwapEvents( + event = "Swap type simple/detailed", + params = mapOf("Swap type" to mode.key), + ) + + class SwapTypeSelect( + val provider: SwapProvider?, + val sendToken: String, + val sendBlockchain: String, + val receiveToken: String?, + val receiveBlockchain: String?, + ) : SwapEvents( + event = "Button - Swap type menu", + params = buildMap { + provider?.let { put(PROVIDER, it.name) } + put(SEND_TOKEN, sendToken) + put(SEND_BLOCKCHAIN, sendBlockchain) + receiveToken?.let { put(RECEIVE_TOKEN, it) } + receiveBlockchain?.let { put(RECEIVE_BLOCKCHAIN, it) } + }, + ) + + class SwapTypeReSelection( + val typeFrom: SwapUIMode, + val typeTo: SwapUIMode, + ) : SwapEvents( + event = "Swap type re-selection", + params = mapOf( + "Type from" to typeFrom.key, + "Type to" to typeTo.key, + ), + ) + class SendTokenBalanceClicked : SwapEvents(event = "Send Token Balance Clicked") class ChooseTokenScreenResult( @@ -75,9 +111,17 @@ sealed class SwapEvents( ), ) - class ButtonSwapClicked(val sendToken: String, val receiveToken: String) : SwapEvents( + class ButtonSwapClicked( + val sendToken: String, + val receiveToken: String, + val swapUIMode: SwapUIMode, + ) : SwapEvents( event = "Button - Swap", - params = mapOf("Send Token" to sendToken, "Receive Token" to receiveToken), + params = mapOf( + "Send Token" to sendToken, + "Receive Token" to receiveToken, + "Swap type" to swapUIMode.key, + ), ) class ButtonGivePermissionClicked( 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 cd731174ee..e5cf890a31 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 @@ -302,7 +302,9 @@ internal class SwapModel @Inject constructor( }.launchIn(modelScope) modelScope.launch { - uiState = uiState.copy(swapUIMode = getSwapUiModeUseCase()) + val swapUIMode = getSwapUiModeUseCase() + uiState = uiState.copy(swapUIMode = swapUIMode) + analyticsEventHandler.send(SwapEvents.SwapType(swapUIMode)) } } @@ -1662,6 +1664,7 @@ internal class SwapModel @Inject constructor( SwapEvents.ButtonSwapClicked( sendToken = sendTokenSymbol, receiveToken = receiveTokenSymbol, + swapUIMode = uiState.swapUIMode, ), ) } @@ -1765,15 +1768,34 @@ internal class SwapModel @Inject constructor( router.replaceAll(SwapRoute.Success) }, onSwapUIModeChange = ::onSwapUIModeChange, + onSwapTypeMenuOpened = ::onSwapTypeMenuOpened, ) } private fun onSwapUIModeChange(mode: SwapUIMode) { - if (uiState.swapUIMode == mode) return + val currentMode = uiState.swapUIMode + if (currentMode == mode) return + analyticsEventHandler.send( + SwapEvents.SwapTypeReSelection(typeFrom = currentMode, typeTo = mode), + ) uiState = uiState.copy(swapUIMode = mode) modelScope.launch { setSwapUiModeUseCase(mode) } } + private fun onSwapTypeMenuOpened() { + val fromCurrency = dataState.fromSwapCurrencyStatus?.currency + val toCurrency = dataState.toSwapCurrencyStatus?.currency + analyticsEventHandler.send( + SwapEvents.SwapTypeSelect( + provider = dataState.selectedProvider, + sendToken = fromCurrency?.symbol.orEmpty(), + sendBlockchain = fromCurrency?.network?.name.orEmpty(), + receiveToken = toCurrency?.symbol, + receiveBlockchain = toCurrency?.network?.name, + ), + ) + } + private fun selectWalletInSelector( fromSwapCurrencyStatus: SwapCurrencyStatus?, toSwapCurrencyStatus: SwapCurrencyStatus?, diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt index 330e5f5188..ff8dfd3624 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt @@ -46,6 +46,7 @@ internal data class SwapStateHolder( val onPredefinedPercentSelected: ((PredefinedPercentAmount) -> Unit)? = null, val onShowPermissionBottomSheet: () -> Unit = {}, val onSwapUIModeChange: (SwapUIMode) -> Unit = {}, + val onSwapTypeMenuOpened: () -> Unit = {}, ) @Immutable diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/UiActions.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/UiActions.kt index cc76ec32dd..f9714cdded 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/models/UiActions.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/models/UiActions.kt @@ -30,4 +30,5 @@ internal data class UiActions( val onLinkClick: (String) -> Unit, val onReceiveCardWarningClick: () -> Unit, val onSwapUIModeChange: (SwapUIMode) -> Unit, + val onSwapTypeMenuOpened: () -> Unit, ) \ No newline at end of file diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index 7380667baa..7236b2fa02 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -108,6 +108,7 @@ internal class StateBuilder( isInsufficientFunds = false, swapUIMode = swapUIMode, onSwapUIModeChange = actions.onSwapUIModeChange, + onSwapTypeMenuOpened = actions.onSwapTypeMenuOpened, shouldShowAbMenu = swapFeatureToggles.isSwapAbEnabled, isPredefinedButtonsEnabled = swapFeatureToggles.isSwapPredefinedButtonsEnabled, ) diff --git a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt index 337dbe062d..0327594f81 100644 --- a/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt +++ b/features/swap/impl/src/main/java/com/tangem/feature/swap/ui/SwapScreen.kt @@ -87,7 +87,10 @@ private fun SwapTopBar(stateHolder: SwapStateHolder) { backIconRes = R.drawable.ic_close_24, iconRes = if (stateHolder.shouldShowAbMenu) R.drawable.ic_more_vertical_24 else null, onIconClick = if (stateHolder.shouldShowAbMenu) { - { shouldShowModeMenu = true } + { + stateHolder.onSwapTypeMenuOpened() + shouldShowModeMenu = true + } } else { null },