Updated on 2026-08-14

This commit is contained in:
Tangem 2026-03-20 15:27:00 +03:00
parent 2a1369fce6
commit 5a99de87fb
29 changed files with 194 additions and 47 deletions

View file

@ -3,6 +3,8 @@ package com.tangem.features.send.v2.networkselection.model
import androidx.compose.runtime.Stable
import com.tangem.common.getTotalCryptoAmount
import com.tangem.common.getTotalFiatAmount
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.features.send.v2.send.analytics.SendAnalyticEvents
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
@ -44,6 +46,7 @@ import javax.inject.Inject
internal class NetworkSelectionModel @Inject constructor(
paramsContainer: ParamsContainer,
override val dispatchers: CoroutineDispatcherProvider,
private val analyticsEventHandler: AnalyticsEventHandler,
private val multiAccountStatusListSupplier: MultiAccountStatusListSupplier,
private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase,
private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
@ -51,6 +54,10 @@ internal class NetworkSelectionModel @Inject constructor(
private val params: NetworkSelectionComponent.Params = paramsContainer.require()
init {
analyticsEventHandler.send(SendAnalyticEvents.ChooseTokenScreenOpened())
}
private val searchQuery = MutableStateFlow("")
private val expandedWallets = MutableStateFlow(
params.walletGroups.firstOrNull()
@ -227,7 +234,15 @@ internal class NetworkSelectionModel @Inject constructor(
text = cryptoAmount.format { crypto(currency) },
isFlickering = isFlickering,
),
onItemClick = { params.onTokenSelected(context.userWalletId, currency) },
onItemClick = {
analyticsEventHandler.send(
SendAnalyticEvents.TokenSelected(
token = currency.symbol,
blockchain = currency.network.name,
),
)
params.onTokenSelected(context.userWalletId, currency)
},
onItemLongClick = null,
)
}

View file

@ -105,6 +105,7 @@ internal class DefaultSendComponent @AssistedInject constructor(
sendToken = fromCurrency.symbol,
fromDerivationIndex = fromDerivationIndex,
toDerivationIndex = null,
type = model.consumeEntryType(),
),
)
if (model.currentRoute.value.isEditMode) {
@ -116,6 +117,7 @@ internal class DefaultSendComponent @AssistedInject constructor(
CommonSendAnalyticEvents.AmountScreenOpened(
categoryName = model.analyticCategoryName,
source = model.analyticsSendSource,
type = model.consumeEntryType(),
),
)
activeComponent.updateState(model.uiState.value.amountUM)

View file

@ -50,6 +50,21 @@ internal sealed class SendAnalyticEvents(
},
), AppsFlyerIncludedEvent
class ChooseTokenScreenOpened : SendAnalyticEvents(
event = "Choose Token Screen Opened",
)
class TokenSelected(
val token: String,
val blockchain: String,
) : SendAnalyticEvents(
event = "Token Selected",
params = mapOf(
TOKEN_PARAM to token,
BLOCKCHAIN to blockchain,
),
)
data class ConvertTokenButtonClicked(
val token: String,
val blockchain: String,

View file

@ -105,6 +105,8 @@ internal class SendModel @Inject constructor(
private val params: SendComponent.Params = paramsContainer.require()
private val cryptoCurrency = params.currency
private var isEntryTypeConsumed = false
val analyticCategoryName = CommonSendAnalyticEvents.SEND_CATEGORY
val analyticsSendSource = CommonSendAnalyticEvents.CommonSendSource.Send
@ -264,6 +266,15 @@ internal class SendModel @Inject constructor(
showAlertError()
}
fun consumeEntryType(): CommonSendAnalyticEvents.SendEntryType {
if (isEntryTypeConsumed) return CommonSendAnalyticEvents.SendEntryType.Manual
isEntryTypeConsumed = true
return when (params.entryType) {
SendComponent.EntryType.QR -> CommonSendAnalyticEvents.SendEntryType.QR
SendComponent.EntryType.Manual -> CommonSendAnalyticEvents.SendEntryType.Manual
}
}
private suspend fun prepareTransferTransaction(): Either<Throwable, TransactionData> {
val predefinedValues = predefinedValues
val cryptoCurrencyStatus = cryptoCurrencyStatusFlow.value