Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-18 18:58:54 +04:00
parent 057a972768
commit 58428d773b
14 changed files with 212 additions and 17 deletions

View file

@ -52,4 +52,128 @@ sealed class TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Visa Swap",
)
class ChooseWalletPopup : TangemPayAnalyticsEvents(
categoryName = "Visa Onboarding",
event = "Choose Wallet Popup",
)
class CardSettingsClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Card Settings",
)
class TermsAndLimitsClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Terms And Limits",
)
class FreezeCardClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Freeze Card",
)
class FreezeCardConfirmShown : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Popup - Freeze Confirmation",
)
class FreezeCardConfirmClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Freeze Confirmation On Popup",
)
class UnfreezeCardClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Unfreeze Card",
)
class UnfreezeCardConfirmShown : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Popup - Unfreeze Confirmation",
)
class UnfreezeCardConfirmClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Unfreeze Confirmation On Popup",
)
class PinCodeClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - PIN Code",
)
class ChangePinScreenShown : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Screen - Change PIN",
)
class ChangePinSubmitClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Set PIN On Change PIN Screen",
)
class ChangePinSuccessShown : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Message - PIN Setup Success",
)
class CurrentPinShown : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Popup - Current PIN",
)
class ChangePinOnCurrentPinClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Change PIN On Current PIN",
)
class ViewCardDetailsClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - View Card Details",
)
class CopyCardNumberClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Copy Card Number",
)
class CopyCardExpiryClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Copy Card Expiry",
)
class CopyCardCVVClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Copy CVV",
)
class AddToWalletClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Add Card To Wallet",
)
class WithdrawClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Visa Withdraw",
)
class GoToSupportOnBetaBannerClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Go To Support On Beta Banner",
)
class TransactionInListClicked(type: String, status: String) : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Clicked On Transaction In List",
params = mapOf(
"type" to type,
"status" to status,
),
)
class SupportOnTransactionPopupClicked : TangemPayAnalyticsEvents(
categoryName = "Visa Screen",
event = "Button - Support On Transaction Popup",
)
}

View file

@ -3,12 +3,13 @@ package com.tangem.features.tangempay.entity
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.visa.model.TangemPayCardFrozenState
import com.tangem.features.tangempay.details.impl.R
import com.tangem.features.tangempay.model.CardDataType
import com.tangem.utils.StringsSigns
internal class TangemPayCardDetailsBlockStateFactory(
private val cardNumberEnd: String,
private val onReveal: () -> Unit,
private val onCopy: (String) -> Unit,
private val onCopy: (String, CardDataType) -> Unit,
) {
fun getInitialState() = TangemPayCardDetailsUM(

View file

@ -18,6 +18,7 @@ import kotlinx.collections.immutable.toPersistentList
@Suppress("LongParameterList")
internal class TangemPayDetailsStateFactory(
private val onBack: () -> Unit,
private val onOpenMenu: () -> Unit,
private val intents: TangemPayDetailIntents,
private val cardFrozenState: TangemPayCardFrozenState,
private val converter: TangemPayCardFrozenStateConverter,
@ -47,6 +48,7 @@ internal class TangemPayDetailsStateFactory(
return TangemPayDetailsUM(
topBarConfig = TangemPayDetailsTopBarConfig(
onBackClick = onBack,
onOpenMenu = onOpenMenu,
items = listOfNotNull(
TangemPayDetailsTopBarMenuItem(
type = TangemPayDetailsTopBarMenuItemType.ChangePin,

View file

@ -5,6 +5,7 @@ import kotlinx.collections.immutable.ImmutableList
internal data class TangemPayDetailsTopBarConfig(
val onBackClick: () -> Unit,
val onOpenMenu: () -> Unit,
val items: ImmutableList<TangemPayDetailsTopBarMenuItem>?,
)

View file

@ -5,6 +5,7 @@ import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfi
import com.tangem.core.ui.components.notifications.NotificationConfig
import com.tangem.core.ui.extensions.TextReference
import com.tangem.domain.visa.model.TangemPayCardFrozenState
import com.tangem.features.tangempay.model.CardDataType
import kotlinx.collections.immutable.ImmutableList
internal data class TangemPayDetailsUM(
@ -25,7 +26,7 @@ internal data class TangemPayCardDetailsUM(
val cvv: String,
val buttonText: TextReference = TextReference.EMPTY,
val onClick: () -> Unit = {},
val onCopy: (String) -> Unit = {},
val onCopy: (String, CardDataType) -> Unit,
val isHidden: Boolean = true,
val isLoading: Boolean = false,
val cardFrozenState: TangemPayCardFrozenState,

View file

@ -1,6 +1,7 @@
package com.tangem.features.tangempay.model
import androidx.compose.runtime.Stable
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
@ -9,6 +10,7 @@ import com.tangem.core.ui.clipboard.ClipboardManager
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
import com.tangem.features.tangempay.components.cardDetails.TangemPayCardDetailsBlockComponent
import com.tangem.features.tangempay.details.impl.R
import com.tangem.features.tangempay.entity.TangemPayCardDetailsBlockStateFactory
@ -29,6 +31,7 @@ import com.tangem.utils.transformer.update as transformerUpdate
private const val SHOW_DETAILS_TIME = 30_000L
@Suppress("LongParameterList")
@Stable
@ModelScoped
internal class TangemPayCardDetailsBlockModel @Inject constructor(
@ -38,6 +41,7 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor(
private val clipboardManager: ClipboardManager,
private val uiMessageSender: UiMessageSender,
private val cardDetailsEventListener: CardDetailsEventListener,
private val analytics: AnalyticsEventHandler,
) : Model() {
private val params: TangemPayCardDetailsBlockComponent.Params = paramsContainer.require()
@ -74,6 +78,7 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor(
}
private fun revealCardDetails() {
analytics.send(TangemPayAnalyticsEvents.ViewCardDetailsClicked())
modelScope.launch {
uiState.transformerUpdate(
transformer = DetailsRevealProgressStateTransformer(onClickHide = ::hideCardDetails),
@ -115,7 +120,17 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor(
)
}
private fun copyData(text: String) {
private fun copyData(text: String, type: CardDataType) {
val event = when (type) {
CardDataType.Number -> TangemPayAnalyticsEvents.CopyCardNumberClicked()
CardDataType.Expiry -> TangemPayAnalyticsEvents.CopyCardExpiryClicked()
CardDataType.CVV -> TangemPayAnalyticsEvents.CopyCardCVVClicked()
}
analytics.send(event)
clipboardManager.setText(text = text.filterNot { it.isWhitespace() }, isSensitive = true)
}
}
internal enum class CardDataType {
Number, Expiry, CVV
}

View file

@ -1,6 +1,7 @@
package com.tangem.features.tangempay.model
import androidx.compose.runtime.Stable
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
@ -10,6 +11,7 @@ import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.ToastMessage
import com.tangem.domain.pay.model.SetPinResult
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
import com.tangem.features.tangempay.components.TangemPayDetailsContainerComponent
import com.tangem.features.tangempay.details.impl.R
import com.tangem.features.tangempay.entity.TangemPayChangePinUM
@ -30,17 +32,23 @@ internal class TangemPayChangePinModel @Inject constructor(
private val uiMessageSender: UiMessageSender,
private val router: Router,
private val cardDetailsRepository: TangemPayCardDetailsRepository,
private val analytics: AnalyticsEventHandler,
) : Model() {
private val params: TangemPayDetailsContainerComponent.Params = paramsContainer.require()
val uiState: StateFlow<TangemPayChangePinUM>
field = MutableStateFlow(getInitialState())
init {
analytics.send(TangemPayAnalyticsEvents.ChangePinScreenShown())
}
private fun onPinCodeChange(pin: String) {
uiState.update(transformer = PinCodeChangeTransformer(newPin = pin))
}
private fun onClickSubmit() {
analytics.send(TangemPayAnalyticsEvents.ChangePinSubmitClicked())
modelScope.launch {
uiState.update { it.copy(submitButtonLoading = true) }
val result = try {
@ -59,7 +67,10 @@ internal class TangemPayChangePinModel @Inject constructor(
message = ToastMessage(resourceReference(R.string.tangempay_pin_validation_error_message)),
)
}
SetPinResult.SUCCESS -> router.push(TangemPayDetailsInnerRoute.ChangePINSuccess)
SetPinResult.SUCCESS -> {
analytics.send(TangemPayAnalyticsEvents.ChangePinSuccessShown())
router.push(TangemPayDetailsInnerRoute.ChangePINSuccess)
}
SetPinResult.DECRYPTION_ERROR,
SetPinResult.UNKNOWN_ERROR,
null,

View file

@ -86,6 +86,7 @@ internal class TangemPayDetailsModel @Inject constructor(
private val cardFrozenStateConverter = TangemPayCardFrozenStateConverter(onUnfreezeClick = ::onClickUnfreezeCard)
private val stateFactory = TangemPayDetailsStateFactory(
onBack = router::pop,
onOpenMenu = ::onOpenMenu,
intents = this,
cardFrozenState = params.config.cardFrozenState,
converter = cardFrozenStateConverter,
@ -127,6 +128,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onClickPinCode() {
analytics.send(TangemPayAnalyticsEvents.PinCodeClicked())
if (!params.config.isPinSet) {
router.push(TangemPayDetailsInnerRoute.ChangePIN)
} else {
@ -140,14 +142,19 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onClickFreezeCard() {
analytics.send(TangemPayAnalyticsEvents.FreezeCardClicked())
uiMessageSender.send(TangemPayMessagesFactory.createFreezeCardMessage(onFreezeClicked = ::freezeCard))
analytics.send(TangemPayAnalyticsEvents.FreezeCardConfirmShown())
}
override fun onClickUnfreezeCard() {
analytics.send(TangemPayAnalyticsEvents.UnfreezeCardClicked())
uiMessageSender.send(TangemPayMessagesFactory.createUnfreezeCardMessage(onUnfreezeClicked = ::unfreezeCard))
analytics.send(TangemPayAnalyticsEvents.UnfreezeCardConfirmShown())
}
private fun freezeCard() {
analytics.send(TangemPayAnalyticsEvents.FreezeCardConfirmClicked())
modelScope.launch {
val result = try {
cardDetailsRepository.freezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId)
@ -186,6 +193,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
private fun unfreezeCard() {
analytics.send(TangemPayAnalyticsEvents.UnfreezeCardConfirmClicked())
modelScope.launch {
val result = try {
cardDetailsRepository.unfreezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId)
@ -243,6 +251,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onClickWithdraw() {
analytics.send(TangemPayAnalyticsEvents.WithdrawClicked())
val currentBalance = balance
val depositAddress = currentBalance?.depositAddress
if (currentBalance == null || depositAddress == null) {
@ -336,6 +345,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onContactSupportClicked() {
analytics.send(TangemPayAnalyticsEvents.GoToSupportOnBetaBannerClicked())
modelScope.launch {
sendFeedbackEmailUseCase.invoke(
type = FeedbackEmailType.Visa.FeatureIsBeta(
@ -356,6 +366,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
private fun onClickAddToWalletBlock() {
analytics.send(TangemPayAnalyticsEvents.AddToWalletClicked())
router.push(TangemPayDetailsInnerRoute.AddToWallet)
}
@ -376,6 +387,10 @@ internal class TangemPayDetailsModel @Inject constructor(
}.saveIn(addToWalletBannerJobHolder)
}
private fun onOpenMenu() {
analytics.send(TangemPayAnalyticsEvents.CardSettingsClicked())
}
override fun onClickSwap(data: TangemPayTopUpData) {
analytics.send(TangemPayAnalyticsEvents.SwapClicked())
bottomSheetNavigation.dismiss()
@ -414,6 +429,7 @@ internal class TangemPayDetailsModel @Inject constructor(
override fun onClickChangePin() {
bottomSheetNavigation.dismiss()
analytics.send(TangemPayAnalyticsEvents.ChangePinOnCurrentPinClicked())
router.push(TangemPayDetailsInnerRoute.ChangePIN)
}
@ -422,6 +438,13 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onTransactionClick(item: TangemPayTxHistoryItem) {
val (type, status) = when (item) {
is TangemPayTxHistoryItem.Collateral -> "collateral" to "unknown"
is TangemPayTxHistoryItem.Fee -> "fee" to "unknown"
is TangemPayTxHistoryItem.Payment -> "payment" to "unknown"
is TangemPayTxHistoryItem.Spend -> "spend" to item.status.name.lowercase()
}
analytics.send(TangemPayAnalyticsEvents.TransactionInListClicked(type = type, status = status))
bottomSheetNavigation.activate(
configuration = TangemPayDetailsNavigation.TransactionDetails(
transaction = item,
@ -431,6 +454,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
override fun onClickTermsAndLimits() {
analytics.send(TangemPayAnalyticsEvents.TermsAndLimitsClicked())
urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK)
}

View file

@ -1,6 +1,7 @@
package com.tangem.features.tangempay.model
import androidx.compose.runtime.Stable
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
@ -9,6 +10,7 @@ import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
import com.tangem.domain.feedback.GetWalletMetaInfoUseCase
import com.tangem.domain.feedback.SendFeedbackEmailUseCase
import com.tangem.domain.feedback.models.FeedbackEmailType
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
import com.tangem.features.tangempay.components.txHistory.TangemPayTxHistoryDetailsComponent
import com.tangem.features.tangempay.entity.TangemPayTxHistoryDetailsUM
import com.tangem.features.tangempay.model.transformers.TangemPayTxHistoryDetailsConverter
@ -17,6 +19,7 @@ import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import javax.inject.Inject
@Suppress("LongParameterList")
@Stable
@ModelScoped
internal class TangemPayTxHistoryDetailsModel @Inject constructor(
@ -25,6 +28,7 @@ internal class TangemPayTxHistoryDetailsModel @Inject constructor(
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
private val urlOpener: UrlOpener,
private val balanceHidingSettings: GetBalanceHidingSettingsUseCase,
private val analytics: AnalyticsEventHandler,
paramsContainer: ParamsContainer,
) : Model() {
@ -61,6 +65,7 @@ internal class TangemPayTxHistoryDetailsModel @Inject constructor(
}
private fun dispute() {
analytics.send(TangemPayAnalyticsEvents.SupportOnTransactionPopupClicked())
modelScope.launch {
val walletMetaInfo = getWalletMetaInfoUseCase.invoke(params.userWalletId).getOrNull() ?: return@launch

View file

@ -1,10 +1,12 @@
package com.tangem.features.tangempay.model
import androidx.compose.runtime.Stable
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
import com.tangem.features.tangempay.components.TangemPayViewPinComponent
import com.tangem.features.tangempay.entity.TangemPayViewPinUM
import com.tangem.features.tangempay.model.transformers.TangemPayViewPinErrorStateTransformer
@ -22,6 +24,7 @@ internal class TangemPayViewPinModel @Inject constructor(
paramsContainer: ParamsContainer,
override val dispatchers: CoroutineDispatcherProvider,
private val cardDetailsRepository: TangemPayCardDetailsRepository,
private val analytics: AnalyticsEventHandler,
) : Model() {
private val params = paramsContainer.require<TangemPayViewPinComponent.Params>()
@ -30,6 +33,7 @@ internal class TangemPayViewPinModel @Inject constructor(
field = MutableStateFlow(getInitialState())
init {
analytics.send(TangemPayAnalyticsEvents.CurrentPinShown())
getCardPin()
}

View file

@ -187,7 +187,7 @@ private fun PreviewTangemPayAddToWalletScreen() {
numberShort = "*1245",
expiry = "••/••",
cvv = "•••",
onCopy = {},
onCopy = { _, _ -> },
onClick = {},
buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text),
cardFrozenState = TangemPayCardFrozenState.Unfrozen,

View file

@ -33,6 +33,7 @@ import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.domain.visa.model.TangemPayCardFrozenState
import com.tangem.features.tangempay.details.impl.R
import com.tangem.features.tangempay.entity.TangemPayCardDetailsUM
import com.tangem.features.tangempay.model.CardDataType
private val CustomCardBlockColor = Color(0x1F828282)
@ -79,9 +80,9 @@ internal fun TangemPayCard(state: TangemPayCardDetailsUM, modifier: Modifier = M
cardNumber = state.number,
expiry = state.expiry,
cvv = state.cvv,
onCopyCardNumber = { state.onCopy(state.number) },
onCopyCvv = { state.onCopy(state.cvv) },
onCopyExpiry = { state.onCopy(state.expiry) },
onCopyCardNumber = { state.onCopy(state.number, CardDataType.Number) },
onCopyCvv = { state.onCopy(state.cvv, CardDataType.CVV) },
onCopyExpiry = { state.onCopy(state.expiry, CardDataType.Expiry) },
onHideDetails = state.onClick,
modifier = Modifier.graphicsLayer { rotationY = 180f },
)
@ -309,7 +310,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
expiry = "",
cvv = "",
buttonText = resourceReference(R.string.tangempay_card_details_show_details),
onCopy = {},
onCopy = { _, _ -> },
isHidden = true,
cardFrozenState = TangemPayCardFrozenState.Frozen,
),
@ -321,7 +322,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
expiry = "",
cvv = "",
buttonText = resourceReference(R.string.tangempay_card_details_show_details),
onCopy = {},
onCopy = { _, _ -> },
isHidden = true,
cardFrozenState = TangemPayCardFrozenState.Unfrozen,
),
@ -333,7 +334,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
expiry = "",
cvv = "",
buttonText = resourceReference(R.string.tangempay_card_details_show_details),
onCopy = {},
onCopy = { _, _ -> },
isHidden = true,
cardFrozenState = TangemPayCardFrozenState.Pending,
),
@ -341,7 +342,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
isLoading = false,
onClick = {},
buttonText = resourceReference(R.string.tangempay_card_details_hide_details),
onCopy = {},
onCopy = { _, _ -> },
isHidden = false,
number = "1234 5678 9012 3456",
numberShort = "*3456",

View file

@ -235,7 +235,12 @@ private fun TangemPayDetailsTopAppBar(config: TangemPayDetailsTopBarConfig, modi
title = {},
actions = {
AnimatedVisibility(visible = config.items != null && config.items.isNotEmpty()) {
IconButton(onClick = { showDropdownMenu = true }) {
IconButton(
onClick = {
config.onOpenMenu()
showDropdownMenu = true
},
) {
Icon(
painter = painterResource(id = R.drawable.ic_more_vertical_24),
tint = TangemTheme.colors.icon.primary1,
@ -286,7 +291,7 @@ private fun TangemPayDetailsScreenPreview(
numberShort = "*1245",
expiry = "••/••",
cvv = "•••",
onCopy = {},
onCopy = { _, _ -> },
onClick = {},
buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text),
cardFrozenState = TangemPayCardFrozenState.Unfrozen,
@ -299,7 +304,7 @@ private fun TangemPayDetailsScreenPreview(
private class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<TangemPayDetailsUM>(
collection = listOf(
TangemPayDetailsUM(
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, items = null),
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, onOpenMenu = {}, items = null),
pullToRefreshConfig = PullToRefreshConfig(isRefreshing = false, onRefresh = {}),
balanceBlockState = TangemPayDetailsBalanceBlockState.Content(
actionButtons = persistentListOf(
@ -328,7 +333,7 @@ private class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<Ta
),
),
TangemPayDetailsUM(
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, items = null),
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, onOpenMenu = {}, items = null),
pullToRefreshConfig = PullToRefreshConfig(isRefreshing = false, onRefresh = {}),
balanceBlockState = TangemPayDetailsBalanceBlockState.Loading(actionButtons = persistentListOf()),
addToWalletBlockState = AddToWalletBlockState({}, {}),
@ -364,7 +369,7 @@ private fun TangemPayDetailsTxHistoryScreenPreview(
numberShort = "*1245",
expiry = "••/••",
cvv = "•••",
onCopy = {},
onCopy = { _, _ -> },
onClick = {},
buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text),
cardFrozenState = TangemPayCardFrozenState.Unfrozen,

View file

@ -150,6 +150,7 @@ internal class TangemPayOnboardingModel @Inject constructor(
if (eligibleWalletsIds.size == 1) {
checkCustomerInfo(userWalletId = eligibleWalletsIds[0])
} else {
analytics.send(TangemPayAnalyticsEvents.ChooseWalletPopup())
bottomSheetNavigation.activate(TangemPayOnboardingNavigation.WalletSelector(eligibleWalletsIds))
}
}