From 20402fcbdea44a006dd1d19949baf1a6ca13ea7d Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 26 Apr 2024 15:14:27 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../analytics/SendAnalyticEvents.kt | 15 +++++++++ ...cSender.kt => SendScreenAnalyticSender.kt} | 32 +++++++++++++++++-- .../state/previewdata/SendClickIntentsStub.kt | 2 ++ .../send/impl/presentation/ui/SendScreen.kt | 10 +++--- .../viewmodel/SendClickIntents.kt | 2 ++ .../presentation/viewmodel/SendViewModel.kt | 20 +++++++++--- 6 files changed, 70 insertions(+), 11 deletions(-) rename features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/{SendOnNextScreenAnalyticSender.kt => SendScreenAnalyticSender.kt} (69%) diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt index e99471d8de..feca8a0786 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt @@ -16,6 +16,20 @@ internal sealed class SendAnalyticEvents( params: Map = mapOf(), ) : AnalyticsEvent(category = "Token / Send", event = event, params = params) { + /** Close button clicked */ + data class CloseButtonClicked( + val source: SendScreenSource, + val isFromSummary: Boolean, + val isValid: Boolean, + ) : SendAnalyticEvents( + event = "Button - Close", + params = mapOf( + SOURCE to source.name, + "FromSummary" to if (isFromSummary) "Yes" else "No", + "isValid" to if (isValid) "Yes" else "No", + ), + ) + // region Address /** Recipient address screen opened */ data object AddressScreenOpened : SendAnalyticEvents(event = "Address Screen Opened") @@ -119,6 +133,7 @@ internal enum class SendScreenSource { Address, Amount, Fee, + Confirm, } internal enum class EnterAddressSource { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendOnNextScreenAnalyticSender.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendScreenAnalyticSender.kt similarity index 69% rename from features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendOnNextScreenAnalyticSender.kt rename to features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendScreenAnalyticSender.kt index 6fefbc87b8..27c93b9743 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendOnNextScreenAnalyticSender.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/utils/SendScreenAnalyticSender.kt @@ -5,15 +5,17 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.features.send.impl.presentation.analytics.SelectedCurrencyType import com.tangem.features.send.impl.presentation.analytics.SelectedFeeType import com.tangem.features.send.impl.presentation.analytics.SendAnalyticEvents -import com.tangem.features.send.impl.presentation.state.* +import com.tangem.features.send.impl.presentation.analytics.SendScreenSource import com.tangem.features.send.impl.presentation.state.SendUiState +import com.tangem.features.send.impl.presentation.state.SendUiStateType import com.tangem.features.send.impl.presentation.state.StateRouter import com.tangem.features.send.impl.presentation.state.fee.FeeSelectorState import com.tangem.features.send.impl.presentation.state.fee.FeeType import com.tangem.utils.Provider -internal class SendOnNextScreenAnalyticSender( +internal class SendScreenAnalyticSender( private val stateRouterProvider: Provider, + private val currentStateProvider: Provider, private val analyticsEventHandler: AnalyticsEventHandler, ) { fun send(prevScreen: SendUiStateType, state: SendUiState) { @@ -45,6 +47,32 @@ internal class SendOnNextScreenAnalyticSender( } } + fun sendOnClose() { + val routerState = stateRouterProvider().currentState.value + val state = currentStateProvider() + + val (source, isValid) = when (routerState.type) { + SendUiStateType.Recipient, + SendUiStateType.EditRecipient, + -> SendScreenSource.Address to (state.editRecipientState?.isPrimaryButtonEnabled ?: false) + SendUiStateType.Amount, + SendUiStateType.EditAmount, + -> SendScreenSource.Amount to (state.editAmountState?.isPrimaryButtonEnabled ?: false) + SendUiStateType.Fee, + SendUiStateType.EditFee, + -> SendScreenSource.Fee to (state.editFeeState?.isPrimaryButtonEnabled ?: false) + else -> SendScreenSource.Confirm to true + } + + analyticsEventHandler.send( + SendAnalyticEvents.CloseButtonClicked( + source = source, + isFromSummary = routerState.isFromConfirmation, + isValid = isValid, + ), + ) + } + private fun sendSelectedFeeAnalytics(feeSelectorState: FeeSelectorState.Content) { val type = when (feeSelectorState.fees) { is TransactionFee.Single -> SelectedFeeType.Fixed diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt index 0a113ea474..84a2a7b90d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt @@ -14,6 +14,8 @@ internal object SendClickIntentsStub : SendClickIntents { override fun onBackClick() {} + override fun onCloseClick() {} + override fun onNextClick(isFromEdit: Boolean) {} override fun onPrevClick() {} diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt index b289867885..5c7eba689d 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendScreen.kt @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.withIndex @Composable internal fun SendScreen(uiState: SendUiState, currentState: SendUiCurrentScreen) { val snackbarHostState = remember { SnackbarHostState() } - BackHandler { uiState.clickIntents.onBackClick() } + BackHandler(onBack = uiState.clickIntents::onBackClick) Column( modifier = Modifier .fillMaxSize() @@ -88,17 +88,17 @@ private fun SendAppBar(uiState: SendUiState, currentState: SendUiCurrentScreen) } else { null } - val (backIcon, backClick) = when (currentState.type) { + val backIcon = when (currentState.type) { SendUiStateType.EditAmount, SendUiStateType.EditFee, SendUiStateType.EditRecipient, - -> R.drawable.ic_back_24 to uiState.clickIntents::onBackClick - else -> R.drawable.ic_close_24 to uiState.clickIntents::popBackStack + -> R.drawable.ic_back_24 + else -> R.drawable.ic_close_24 } AppBarWithBackButtonAndIcon( text = titleRes?.resolveReference(), subtitle = subtitleRes, - onBackClick = backClick, + onBackClick = uiState.clickIntents::onCloseClick, onIconClick = uiState.clickIntents::onQrCodeScanClick, backIconRes = backIcon, iconRes = iconRes, diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt index f0715cd50a..76a22a3b24 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt @@ -14,6 +14,8 @@ internal interface SendClickIntents { fun onBackClick() + fun onCloseClick() + fun onNextClick(isFromEdit: Boolean = false) fun onPrevClick() diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index 1d678b777e..3212417a3e 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -47,7 +47,7 @@ import com.tangem.features.send.impl.navigation.InnerSendRouter import com.tangem.features.send.impl.presentation.analytics.EnterAddressSource import com.tangem.features.send.impl.presentation.analytics.SendAnalyticEvents import com.tangem.features.send.impl.presentation.analytics.SendScreenSource -import com.tangem.features.send.impl.presentation.analytics.utils.SendOnNextScreenAnalyticSender +import com.tangem.features.send.impl.presentation.analytics.utils.SendScreenAnalyticSender import com.tangem.features.send.impl.presentation.domain.AvailableWallet import com.tangem.features.send.impl.presentation.state.* import com.tangem.features.send.impl.presentation.state.amount.AmountStateFactory @@ -174,9 +174,10 @@ internal class SendViewModel @Inject constructor( getBalanceNotEnoughForFeeWarningUseCase = getBalanceNotEnoughForFeeWarningUseCase, ) - private val sendOnNextScreenAnalyticSender by lazy(LazyThreadSafetyMode.NONE) { - SendOnNextScreenAnalyticSender( + private val sendScreenAnalyticSender by lazy(LazyThreadSafetyMode.NONE) { + SendScreenAnalyticSender( stateRouterProvider = Provider { stateRouter }, + currentStateProvider = Provider { uiState }, analyticsEventHandler = analyticsEventHandler, ) } @@ -498,10 +499,21 @@ internal class SendViewModel @Inject constructor( stateRouter.onBackClick(isSuccess = uiState.sendState?.isSuccess == true) } + override fun onCloseClick() { + sendScreenAnalyticSender.sendOnClose() + when (stateRouter.currentState.value.type) { + SendUiStateType.EditAmount, + SendUiStateType.EditFee, + SendUiStateType.EditRecipient, + -> onBackClick() + else -> popBackStack() + } + } + override fun onNextClick(isFromEdit: Boolean) { val currentState = stateRouter.currentState.value uiState = stateFactory.syncEditStates(isFromEdit = isFromEdit) - sendOnNextScreenAnalyticSender.send(currentState.type, uiState) + sendScreenAnalyticSender.send(currentState.type, uiState) when (currentState.type) { SendUiStateType.Fee, SendUiStateType.EditFee,