Updated on 2026-08-14

This commit is contained in:
Tangem 2026-07-16 20:41:42 +04:00
parent 50332186fa
commit 5f6767abaf
58 changed files with 85 additions and 717 deletions

View file

@ -2,9 +2,7 @@ package com.tangem.features.tangempay
interface TangemPayFeatureToggles {
val isRedesignEnabled: Boolean
val isCloseCardEnabled: Boolean
val isRemoveAccountEnabled: Boolean
val isMultipleCardsEnabled: Boolean
val isTiersPlusPlanEnabled: Boolean
val isCashbackEnabled: Boolean
}

View file

@ -7,18 +7,11 @@ internal class DefaultTangemPayFeatureToggles(
private val featureTogglesManager: FeatureTogglesManager,
) : TangemPayFeatureToggles {
override val isRedesignEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15368_VISA_PAY_REDESIGN) &&
featureTogglesManager.isFeatureEnabled(FeatureToggles.APP_REDESIGN_ENABLED)
override val isCloseCardEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15364_VISA_PAY_CARD_CLOSE)
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.APP_REDESIGN_ENABLED)
override val isRemoveAccountEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15741_VISA_PAY_REMOVE_ACCOUNT)
override val isMultipleCardsEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_15235_VISA_MULTIPLE_CARDS)
override val isTiersPlusPlanEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled(FeatureToggles.AND_16041_VISA_TIERS_PLUS_PLAN)

View file

@ -35,7 +35,6 @@ internal class TangemPayDetailsStateFactory(
private val intents: TangemPayDetailIntents,
private val isRedesignEnabled: Boolean,
private val isRemoveAccountEnabled: Boolean,
private val isMultipleCardsEnabled: Boolean,
private val isTiersPlusPlanEnabled: Boolean,
) {
private val notificationFactory = TangemPayDetailsNotificationFactory(
@ -100,7 +99,6 @@ internal class TangemPayDetailsStateFactory(
),
cardsBlockState = TangemPayDetailsBalanceBlockState.CardsBlockState(
cards = status.cards
.let { if (isMultipleCardsEnabled) it else it.take(1) }
.map { cardItem ->
TangemPayDetailsBalanceBlockState.Card(
lastDigits = cardItem.lastDigits,

View file

@ -110,7 +110,6 @@ internal class TangemPayCardPageModel @Inject constructor(
private val cryptoCurrency
get() = currentStatus.value.cryptoCurrency
private val isMultipleCardsEnabled: Boolean get() = tangemPayFeatureToggles.isMultipleCardsEnabled
val uiState: StateFlow<TangemPayCardPageUM>
field = MutableStateFlow(
@ -185,7 +184,7 @@ internal class TangemPayCardPageModel @Inject constructor(
val status = state.value
if (status !is PaymentAccountStatusValue.Loaded || status.source != StatusSource.ACTUAL) return
val cards = status.cards.let { if (isMultipleCardsEnabled) it else it.take(1) }
val cards = status.cards
val newIds = cards.mapTo(mutableSetOf()) { it.id }
cardControllers.keys.filterNot { it in newIds }.toList().forEach { removedId ->
@ -334,30 +333,28 @@ internal class TangemPayCardPageModel @Inject constructor(
),
),
)
if (tangemPayFeatureToggles.isCloseCardEnabled) {
add(
TangemPayDropDownItemUM(
title = TextReference.Res(R.string.tangem_pay_close_card_popup_primary_button_title),
onClick = ::onClickCloseCard,
icon = TangemIconUM.Icon(
iconRes = CoreUiR.drawable.ic_trash_24,
tintReference = {
if (isLastCard) {
TangemTheme.colors3.icon.tertiary
} else {
TangemTheme.colors3.icon.primary
}
},
),
subtitle = if (isLastCard) {
TextReference.Res(R.string.tangem_pay_close_card_disabled_last_card)
} else {
null
add(
TangemPayDropDownItemUM(
title = TextReference.Res(R.string.tangem_pay_close_card_popup_primary_button_title),
onClick = ::onClickCloseCard,
icon = TangemIconUM.Icon(
iconRes = CoreUiR.drawable.ic_trash_24,
tintReference = {
if (isLastCard) {
TangemTheme.colors3.icon.tertiary
} else {
TangemTheme.colors3.icon.primary
}
},
isEnabled = !isLastCard,
),
)
}
subtitle = if (isLastCard) {
TextReference.Res(R.string.tangem_pay_close_card_disabled_last_card)
} else {
null
},
isEnabled = !isLastCard,
),
)
}.toImmutableList()
}

View file

@ -111,15 +111,12 @@ internal class TangemPayDetailsModel @Inject constructor(
val cryptoCurrency
get() = currentStatus.value.cryptoCurrency
private val isMultipleCardsEnabled: Boolean get() = tangemPayFeatureToggles.isMultipleCardsEnabled
private val stateFactory = TangemPayDetailsStateFactory(
onBack = router::pop,
onOpenMenu = ::onOpenMenu,
intents = this,
isRedesignEnabled = isRedesignEnabled(),
isRemoveAccountEnabled = tangemPayFeatureToggles.isRemoveAccountEnabled,
isMultipleCardsEnabled = isMultipleCardsEnabled,
isTiersPlusPlanEnabled = tangemPayFeatureToggles.isTiersPlusPlanEnabled,
)
@ -476,17 +473,6 @@ internal class TangemPayDetailsModel @Inject constructor(
override fun onAddCardClick() {
analytics.send(TangemPayAnalyticsEvents.AddExtraCardClicked())
if (!isMultipleCardsEnabled) {
analytics.send(TangemPayAnalyticsEvents.FakeDoorPopupDisplayed())
uiMessageSender.send(
TangemPayMessagesFactory.createFutureFeature(
onGotItClick = {
analytics.send(TangemPayAnalyticsEvents.FakeDoorGotitClicked())
},
),
)
return
}
modelScope.launch {
val offer = getCustomerOffers.additionalCardOffer(userWalletId).getOrNull()
if (offer == null) {

View file

@ -31,7 +31,6 @@ internal class TangemPayDetailsStateFactoryTest {
intents = intents,
isRedesignEnabled = true,
isRemoveAccountEnabled = true,
isMultipleCardsEnabled = true,
isTiersPlusPlanEnabled = true,
)