Updated on 2026-08-14

This commit is contained in:
Tangem 2026-06-18 02:14:21 -07:00
parent e11e2d953d
commit 8db1038e3f
6 changed files with 31 additions and 16 deletions

View file

@ -40,6 +40,7 @@ fun TangemIconButton(
@DrawableRes iconRes: Int,
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
shape: RoundedCornerShape = RoundedCornerShape(24.dp),
background: Color = TangemTheme.colors.button.secondary,
iconTint: Color = TangemTheme.colors.icon.secondary,
@ -52,7 +53,7 @@ fun TangemIconButton(
modifier = modifier
.size(24.dp)
.clip(shape)
.clickable(onClick = onClick)
.clickable(onClick = onClick, enabled = enabled)
.background(background)
.padding(innerPadding),
)

View file

@ -47,6 +47,7 @@ internal class TangemPayDetailsStateFactory(
cardsBlockState = TangemPayDetailsBalanceBlockState.CardsBlockState(
cards = persistentListOf(),
onAddCardClick = intents::onAddCardClick,
isAddCardEnabled = false,
),
),
isBalanceHidden = false,
@ -58,11 +59,6 @@ internal class TangemPayDetailsStateFactory(
fun getLoadedState(status: PaymentAccountStatusValue.Loaded): TangemPayDetailsUM {
val hasUnfrozenCard = status.cards.any { it.frozenState == TangemPayCardFrozenState.Unfrozen }
val errorNotificationConfig = when (status.error) {
null -> null
PaymentAccountStatusValue.Error.NotSynced -> createRenewSessionNotificationConfig()
else -> createAccountUnavailableConfig()
}
return TangemPayDetailsUM(
topBarConfig = TangemPayDetailsTopBarConfig(
onBackClick = onBack,
@ -75,7 +71,7 @@ internal class TangemPayDetailsStateFactory(
onRefresh = intents::onRefreshSwipe,
),
balanceBlockState = TangemPayDetailsBalanceBlockState.Loading(
actionButtons = getActionButtonsConfig(isEnabled = errorNotificationConfig == null && hasUnfrozenCard),
actionButtons = getActionButtonsConfig(isEnabled = status.error == null && hasUnfrozenCard),
cardsBlockState = TangemPayDetailsBalanceBlockState.CardsBlockState(
cards = status.cards
.let { if (isMultipleCardsEnabled) it else it.take(1) }
@ -85,18 +81,23 @@ internal class TangemPayDetailsStateFactory(
onClick = { intents.onCardClick(cardItem.id) },
isReissuingOrClosing = cardItem.state == TangemPayCardState.Reissuing ||
cardItem.state == TangemPayCardState.Closing,
isEnabled = errorNotificationConfig == null,
isEnabled = status.error == null,
isFrozen = cardItem.isFrozen,
isIssuing = cardItem.state == TangemPayCardState.Issuing,
)
}
.toImmutableList(),
onAddCardClick = intents::onAddCardClick,
isAddCardEnabled = status.error == null,
),
),
isBalanceHidden = false,
addToWalletBlockState = null,
errorNotificationConfig = errorNotificationConfig,
errorNotificationConfig = when (status.error) {
null -> null
PaymentAccountStatusValue.Error.NotSynced -> createRenewSessionNotificationConfig()
else -> createAccountUnavailableConfig()
},
accountDeactivatedNotificationConfig = null,
)
}

View file

@ -90,7 +90,12 @@ internal sealed class TangemPayDetailsBalanceBlockState {
override val cardsBlockState: CardsBlockState?,
) : TangemPayDetailsBalanceBlockState()
data class CardsBlockState(val cards: ImmutableList<Card>, val onAddCardClick: () -> Unit)
data class CardsBlockState(
val cards: ImmutableList<Card>,
val onAddCardClick: () -> Unit,
val isAddCardEnabled: Boolean,
)
data class Card(
val lastDigits: String,
val onClick: () -> Unit,

View file

@ -304,10 +304,11 @@ private fun CardsBlockRow(
TangemPayCardItem(modifier = itemsModifier, card = card)
}
TangemIconButton(
modifier = itemsModifier,
modifier = itemsModifier.alpha(if (cardsBlockState.isAddCardEnabled) 1f else DISABLED_ALPHA),
onClick = cardsBlockState.onAddCardClick,
iconRes = R.drawable.ic_plus_24,
shape = RoundedCornerShape(4.dp),
enabled = cardsBlockState.isAddCardEnabled,
)
}
}
@ -500,6 +501,7 @@ internal class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<T
),
),
onAddCardClick = {},
isAddCardEnabled = true,
),
),
isBalanceHidden = false,
@ -532,6 +534,7 @@ internal class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<T
),
),
onAddCardClick = {},
isAddCardEnabled = true,
),
),
isBalanceHidden = false,

View file

@ -360,7 +360,10 @@ private fun CardsBlock(
SpacerW(TangemTheme.dimens2.x2)
}
item {
TangemPayAddCardView(onClick = cardsBlockState.onAddCardClick)
TangemPayAddCardView(
onClick = cardsBlockState.onAddCardClick,
isEnabled = cardsBlockState.isAddCardEnabled,
)
}
}
}

View file

@ -38,6 +38,7 @@ import com.tangem.core.ui.test.TangemPayTestTags
private const val DEFAULT_CARD_BG = 0xFF1C1F29
private const val REISSUING_CARD_BG = 0xFF1E1E1E
private const val DISABLED_ALPHA = 0.5f
@Composable
internal fun TangemPayCardView(
@ -98,16 +99,17 @@ internal fun TangemPayCardView(
}
@Composable
internal fun TangemPayAddCardView(onClick: () -> Unit, modifier: Modifier = Modifier) {
internal fun TangemPayAddCardView(onClick: () -> Unit, isEnabled: Boolean, modifier: Modifier = Modifier) {
Box(
modifier = modifier
.alpha(if (isEnabled) 1f else DISABLED_ALPHA)
.size(
height = TangemTheme.dimens2.x10,
width = TangemTheme.dimens2.x14,
)
.clip(RoundedCornerShape(6.dp))
.background(TangemTheme.colors3.bg.opaque.primary)
.clickableSingle(onClick = onClick),
.clickableSingle(onClick = onClick, enabled = isEnabled),
contentAlignment = Alignment.Center,
) {
Icon(
@ -138,7 +140,7 @@ private fun CardBackground(
Box(
modifier = modifier
.alpha(if (isEnabled) 1f else 0.5f)
.alpha(if (isEnabled) 1f else DISABLED_ALPHA)
.clip(RoundedCornerShape(6.dp))
.drawBehind {
drawRect(bgColor)
@ -216,7 +218,7 @@ private fun CardBackgroundPreview() {
isFrozen = false,
)
SpacerH(TangemTheme.dimens2.x4)
TangemPayAddCardView(onClick = {})
TangemPayAddCardView(onClick = {}, isEnabled = true)
SpacerH(TangemTheme.dimens2.x4)
TangemPayCardView(
isIssueInProgress = false,