Updated on 2026-08-14

This commit is contained in:
Tangem 2026-06-11 14:56:41 +02:00
parent 646349ff69
commit f467cbacd0
14 changed files with 786 additions and 310 deletions

View file

@ -29,6 +29,7 @@ internal class TangemPayDetailsStateFactory(
isTangemPayDeactivated: Boolean,
cardNumberEnd: String,
isReissuing: Boolean,
isFrozen: Boolean,
): TangemPayDetailsUM {
return TangemPayDetailsUM(
topBarConfig = TangemPayDetailsTopBarConfig(
@ -49,6 +50,7 @@ internal class TangemPayDetailsStateFactory(
lastDigits = cardNumberEnd,
onClick = {},
isReissuing = isReissuing,
isFrozen = isFrozen,
),
),
onAddCardClick = intents::onAddCardClick,

View file

@ -92,6 +92,7 @@ internal sealed class TangemPayDetailsBalanceBlockState {
val lastDigits: String,
val onClick: () -> Unit,
val isReissuing: Boolean,
val isFrozen: Boolean,
)
}

View file

@ -293,9 +293,15 @@ internal class TangemPayCardPageModel @Inject constructor(
if (frozenStateJobHolder.isActive) return
val message = if (isFrozen) {
TangemPayMessagesFactory.createUnfreezeCardMessage(onUnfreezeClicked = ::unfreezeCard)
TangemPayMessagesFactory.createUnfreezeCardMessage(
onUnfreezeClicked = ::unfreezeCard,
isRedesignEnabled = tangemPayFeatureToggles.isRedesignEnabled,
)
} else {
TangemPayMessagesFactory.createFreezeCardMessage(onFreezeClicked = ::freezeCard)
TangemPayMessagesFactory.createFreezeCardMessage(
onFreezeClicked = ::freezeCard,
isRedesignEnabled = tangemPayFeatureToggles.isRedesignEnabled,
)
}
uiMessageSender.send(message)
}

View file

@ -106,6 +106,7 @@ internal class TangemPayDetailsModel @Inject constructor(
isTangemPayDeactivated = isTangemPayDeactivated,
cardNumberEnd = initialCard?.lastDigits.orEmpty(),
isReissuing = initialCard == null || initialCard.state != TangemPayCardState.Active,
isFrozen = initialCard?.frozenState == TangemPayCardFrozenState.Frozen,
),
)

View file

@ -1,6 +1,7 @@
package com.tangem.features.tangempay.model.transformers
import com.tangem.domain.models.pay.TangemPayCard
import com.tangem.domain.models.pay.TangemPayCardFrozenState
import com.tangem.domain.models.pay.TangemPayCardState
import com.tangem.features.tangempay.entity.TangemPayDetailsBalanceBlockState
import com.tangem.features.tangempay.entity.TangemPayDetailsUM
@ -17,6 +18,7 @@ internal class TangemPayCardDataTransformer(
lastDigits = card.lastDigits,
onClick = onCardClick,
isReissuing = card.state != TangemPayCardState.Active,
isFrozen = card.frozenState == TangemPayCardFrozenState.Frozen,
)
val cardsBlockState = prevState.balanceBlockState.cardsBlockState?.copy(
cards = persistentListOf(updatedCard),

View file

@ -460,8 +460,18 @@ internal class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<T
isBalanceFlickering = false,
cardsBlockState = TangemPayDetailsBalanceBlockState.CardsBlockState(
cards = persistentListOf(
TangemPayDetailsBalanceBlockState.Card(lastDigits = "1234", onClick = {}, isReissuing = false),
TangemPayDetailsBalanceBlockState.Card(lastDigits = "3456", onClick = {}, isReissuing = false),
TangemPayDetailsBalanceBlockState.Card(
lastDigits = "1234",
onClick = {},
isReissuing = false,
isFrozen = false,
),
TangemPayDetailsBalanceBlockState.Card(
lastDigits = "3456",
onClick = {},
isReissuing = false,
isFrozen = false,
),
),
onAddCardClick = {},
),
@ -490,6 +500,7 @@ internal class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<T
lastDigits = "1234",
onClick = {},
isReissuing = true,
isFrozen = false,
),
),
onAddCardClick = {},

View file

@ -340,6 +340,7 @@ private fun CardsBlock(
isReissuing = item.isReissuing,
lastDigits = item.lastDigits,
onClick = item.onClick,
isFrozen = item.isFrozen,
)
SpacerW(TangemTheme.dimens2.x2)
}

View file

@ -32,6 +32,7 @@ import com.tangem.core.ui.res.TangemThemePreviewRedesign
import com.tangem.core.ui.res.generated.icons.Icons
import com.tangem.core.ui.res.generated.icons.ic_clock_12
import com.tangem.core.ui.res.generated.icons.ic_cloud_12_filled
import com.tangem.core.ui.res.generated.icons.ic_snowflake_16
import com.tangem.core.ui.test.TangemPayTestTags
private const val DEFAULT_CARD_BG = 0xFF1C1F29
@ -42,6 +43,7 @@ internal fun TangemPayCardView(
isReissuing: Boolean,
lastDigits: String,
onClick: () -> Unit,
isFrozen: Boolean,
modifier: Modifier = Modifier,
) {
CardBackground(
@ -64,10 +66,10 @@ internal fun TangemPayCardView(
) {
Icon(
modifier = Modifier.size(TangemTheme.dimens2.x3),
imageVector = if (isReissuing) {
Icons.ic_clock_12
} else {
Icons.ic_cloud_12_filled
imageVector = when {
isFrozen -> Icons.ic_snowflake_16
isReissuing -> Icons.ic_clock_12
else -> Icons.ic_cloud_12_filled
},
tint = TangemTheme.colors3.icon.staticDark,
contentDescription = null,
@ -191,11 +193,13 @@ private fun CardBackgroundPreview() {
content = {},
)
SpacerH(TangemTheme.dimens2.x4)
TangemPayCardView(isReissuing = false, onClick = {}, lastDigits = "1234")
TangemPayCardView(isReissuing = false, onClick = {}, lastDigits = "1234", isFrozen = false)
SpacerH(TangemTheme.dimens2.x4)
TangemPayCardView(isReissuing = true, onClick = {}, lastDigits = "")
TangemPayCardView(isReissuing = true, onClick = {}, lastDigits = "", isFrozen = false)
SpacerH(TangemTheme.dimens2.x4)
TangemPayAddCardView(onClick = {})
SpacerH(TangemTheme.dimens2.x4)
TangemPayCardView(isReissuing = false, onClick = {}, lastDigits = "1234", isFrozen = true)
}
}
}

View file

@ -6,6 +6,9 @@ import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.BottomSheetMessage
import com.tangem.core.ui.message.bottomSheetMessage
import com.tangem.core.ui.res.generated.icons.Icons
import com.tangem.core.ui.res.generated.icons.ic_snowflake_20
import com.tangem.core.ui.res.generated.icons.ic_sun_20
import com.tangem.features.tangempay.entity.TangemPayDetailsErrorType
internal object TangemPayMessagesFactory {
@ -55,16 +58,31 @@ internal object TangemPayMessagesFactory {
}
}
fun createFreezeCardMessage(onFreezeClicked: () -> Unit): BottomSheetMessage {
fun createFreezeCardMessage(isRedesignEnabled: Boolean, onFreezeClicked: () -> Unit): BottomSheetMessage {
return bottomSheetMessage {
infoBlock {
icon(R.drawable.ic_snow_24) {
type = MessageBottomSheetUM.Icon.Type.Accent
backgroundType = MessageBottomSheetUM.Icon.BackgroundType.Accent
if (isRedesignEnabled) {
vector(Icons.ic_snowflake_20) {
type = MessageBottomSheetUM.Vector.Type.Informative
backgroundType = MessageBottomSheetUM.Vector.BackgroundType.Informative
}
} else {
icon(R.drawable.ic_snow_24) {
type = MessageBottomSheetUM.Icon.Type.Accent
backgroundType = MessageBottomSheetUM.Icon.BackgroundType.Accent
}
}
title = TextReference.Res(R.string.tangem_pay_freeze_card_alert_title)
body = TextReference.Res(R.string.tangem_pay_freeze_card_alert_body)
}
if (isRedesignEnabled) {
secondaryButton {
text = resourceReference(R.string.common_cancel)
onClick {
closeBs()
}
}
}
primaryButton {
text = resourceReference(R.string.tangem_pay_freeze_card_freeze)
onClick {
@ -75,16 +93,31 @@ internal object TangemPayMessagesFactory {
}
}
fun createUnfreezeCardMessage(onUnfreezeClicked: () -> Unit): BottomSheetMessage {
fun createUnfreezeCardMessage(isRedesignEnabled: Boolean, onUnfreezeClicked: () -> Unit): BottomSheetMessage {
return bottomSheetMessage {
infoBlock {
icon(R.drawable.ic_snow_24) {
type = MessageBottomSheetUM.Icon.Type.Accent
backgroundType = MessageBottomSheetUM.Icon.BackgroundType.Accent
if (isRedesignEnabled) {
vector(Icons.ic_sun_20) {
type = MessageBottomSheetUM.Vector.Type.Attention
backgroundType = MessageBottomSheetUM.Vector.BackgroundType.Attention
}
} else {
icon(R.drawable.ic_snow_24) {
type = MessageBottomSheetUM.Icon.Type.Accent
backgroundType = MessageBottomSheetUM.Icon.BackgroundType.Accent
}
}
title = TextReference.Res(R.string.tangem_pay_unfreeze_card_alert_title)
body = TextReference.Res(R.string.tangem_pay_unfreeze_card_alert_body)
}
if (isRedesignEnabled) {
secondaryButton {
text = resourceReference(R.string.common_cancel)
onClick {
closeBs()
}
}
}
primaryButton {
text = resourceReference(R.string.tangempay_card_details_unfreeze_card)
onClick {