Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-02 20:34:32 +07:00
parent c8f66341c1
commit 5248c878fc
10 changed files with 80 additions and 25 deletions

View file

@ -398,18 +398,22 @@ internal class WalletModel @Inject constructor(
TangemPayCustomerInfoError.RefreshNeededError -> {
stateHolder.update(
transformer = TangemPayRefreshNeededStateTransformer(
userWalletId = userWalletId,
onRefreshClick = { clickIntents.onRefreshPayToken(userWalletId) },
),
)
}
TangemPayCustomerInfoError.UnavailableError -> {
stateHolder.update(
transformer = TangemPayUnavailableStateTransformer,
transformer = TangemPayUnavailableStateTransformer(userWalletId),
)
}
else -> {
// do not draw TangemPay block
// hide TangemPay block
Timber.e("Failed when loading main screen TangemPay info: $tangemPayError")
stateHolder.update(
transformer = TangemPayHiddenStateTransformer(userWalletId),
)
}
}
}.onRight { data -> updateTangemPay(data, userWalletId) }
@ -422,7 +426,8 @@ internal class WalletModel @Inject constructor(
data.info.productInstance?.cardId?.let { cardDetailsRepository.cardFrozenStateSync(it) }
?: TangemPayCardFrozenState.Unfrozen
stateHolder.update(
transformer = TangemPayInitialStateTransformer(
transformer = TangemPayUpdateInfoStateTransformer(
userWalletId = userWalletId,
value = data,
cardFrozenState = cardFrozenState,
onClickKyc = innerWalletRouter::openTangemPayOnboarding,

View file

@ -184,6 +184,7 @@ internal object WalletScreenPreviewData {
isFlickering = false,
onItemClick = { },
),
tangemPayState = TangemPayState.Empty,
type = WalletState.MultiCurrency.WalletType.Cold,
)
}

View file

@ -14,5 +14,4 @@ internal data class WalletScreenState(
val isHidingMode: Boolean,
val showMarketsOnboarding: Boolean,
val onDismissMarketsOnboarding: () -> Unit,
val tangemPayState: TangemPayState = TangemPayState.Empty,
)

View file

@ -24,6 +24,7 @@ internal sealed interface WalletState : WalletStateHolder {
abstract val tokensListState: WalletTokensListState
abstract val nftState: WalletNFTItemUM
abstract val type: WalletType
abstract val tangemPayState: TangemPayState
data class Content(
override val pullToRefreshConfig: PullToRefreshConfig,
@ -34,6 +35,7 @@ internal sealed interface WalletState : WalletStateHolder {
override val tokensListState: WalletTokensListState,
override val nftState: WalletNFTItemUM,
override val type: WalletType,
override val tangemPayState: TangemPayState,
) : MultiCurrency()
data class Locked(
@ -52,6 +54,7 @@ internal sealed interface WalletState : WalletStateHolder {
override val tokensListState = WalletTokensListState.ContentState.Locked
override val nftState: WalletNFTItemUM = WalletNFTItemUM.Hidden
override val tangemPayState: TangemPayState = TangemPayState.Empty
}
enum class WalletType {

View file

@ -0,0 +1,18 @@
package com.tangem.feature.wallet.presentation.wallet.state.transformers
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.feature.wallet.presentation.wallet.state.model.TangemPayState
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState
internal class TangemPayHiddenStateTransformer(
userWalletId: UserWalletId,
) : WalletStateTransformer(userWalletId) {
override fun transform(prevState: WalletState): WalletState {
return if (prevState is WalletState.MultiCurrency.Content) {
prevState.copy(tangemPayState = TangemPayState.Empty)
} else {
prevState
}
}
}

View file

@ -1,21 +1,27 @@
package com.tangem.feature.wallet.presentation.wallet.state.transformers
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.feature.wallet.impl.R
import com.tangem.feature.wallet.presentation.wallet.state.model.TangemPayState
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification.Warning.TangemPayRefreshNeeded
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletScreenState
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState
internal class TangemPayRefreshNeededStateTransformer(
userWalletId: UserWalletId,
private val onRefreshClick: () -> Unit,
) : WalletScreenStateTransformer {
) : WalletStateTransformer(userWalletId = userWalletId) {
override fun transform(prevState: WalletScreenState): WalletScreenState {
override fun transform(prevState: WalletState): WalletState {
val tangemPayState = TangemPayState.RefreshNeeded(
notification = TangemPayRefreshNeeded(
tangemIcon = R.drawable.ic_tangem_24,
onRefreshClick = onRefreshClick,
),
)
return prevState.copy(tangemPayState = tangemPayState)
return if (prevState is WalletState.MultiCurrency.Content) {
prevState.copy(tangemPayState = tangemPayState)
} else {
prevState
}
}
}

View file

@ -1,16 +1,23 @@
package com.tangem.feature.wallet.presentation.wallet.state.transformers
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.feature.wallet.presentation.wallet.state.model.TangemPayState
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletScreenState
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState
internal object TangemPayUnavailableStateTransformer : WalletScreenStateTransformer {
internal class TangemPayUnavailableStateTransformer(
userWalletId: UserWalletId,
) : WalletStateTransformer(userWalletId) {
override fun transform(prevState: WalletScreenState): WalletScreenState {
return prevState.copy(
tangemPayState = TangemPayState.TemporaryUnavailable(
notification = WalletNotification.Warning.TangemPayUnreachable,
),
)
override fun transform(prevState: WalletState): WalletState {
return if (prevState is WalletState.MultiCurrency.Content) {
prevState.copy(
tangemPayState = TangemPayState.TemporaryUnavailable(
notification = WalletNotification.Warning.TangemPayUnreachable,
),
)
} else {
prevState
}
}
}

View file

@ -4,6 +4,7 @@ import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.format.bigdecimal.fiat
import com.tangem.core.ui.format.bigdecimal.format
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.pay.TangemPayDetailsConfig
import com.tangem.domain.pay.model.CustomerInfo.CardInfo
import com.tangem.domain.pay.model.CustomerInfo.ProductInstance
@ -11,7 +12,7 @@ import com.tangem.domain.pay.model.MainScreenCustomerInfo
import com.tangem.domain.pay.model.OrderStatus
import com.tangem.domain.visa.model.TangemPayCardFrozenState
import com.tangem.feature.wallet.presentation.wallet.state.model.TangemPayState
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletScreenState
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState
import com.tangem.feature.wallet.presentation.wallet.state.util.TangemPayStateCreator.createCancelledState
import com.tangem.feature.wallet.presentation.wallet.state.util.TangemPayStateCreator.createIssueProgressState
import com.tangem.feature.wallet.presentation.wallet.state.util.TangemPayStateCreator.createKycInProgressState
@ -23,18 +24,23 @@ import java.util.Currency
*/
private const val POLYGON_CHAIN_ID = 137
internal class TangemPayInitialStateTransformer(
internal class TangemPayUpdateInfoStateTransformer(
userWalletId: UserWalletId,
private val value: MainScreenCustomerInfo? = null,
private val cardFrozenState: TangemPayCardFrozenState,
private val onClickKyc: () -> Unit = {},
private val onIssuingCard: () -> Unit = {},
private val onIssuingFailed: () -> Unit = {},
private val openDetails: (config: TangemPayDetailsConfig) -> Unit = {},
) : WalletScreenStateTransformer {
) : WalletStateTransformer(userWalletId = userWalletId) {
override fun transform(prevState: WalletScreenState): WalletScreenState {
override fun transform(prevState: WalletState): WalletState {
val tangemPayState = createInitialState()
return prevState.copy(tangemPayState = tangemPayState)
return if (prevState is WalletState.MultiCurrency.Content) {
prevState.copy(tangemPayState = tangemPayState)
} else {
prevState
}
}
private fun createInitialState(): TangemPayState {

View file

@ -55,6 +55,7 @@ internal class WalletLoadingStateFactory(
tokensListState = WalletTokensListState.ContentState.Loading,
nftState = WalletNFTItemUM.Hidden,
type = WalletState.MultiCurrency.WalletType.Hot,
tangemPayState = TangemPayState.Empty,
)
}
@ -68,6 +69,7 @@ internal class WalletLoadingStateFactory(
tokensListState = WalletTokensListState.ContentState.Loading,
nftState = WalletNFTItemUM.Hidden,
type = WalletState.MultiCurrency.WalletType.Cold,
tangemPayState = TangemPayState.Empty,
)
}

View file

@ -218,10 +218,18 @@ private fun WalletContent(
notifications(configs = selectedWallet.warnings, modifier = itemModifier)
item(
key = "TangemPayMainScreenBlock",
contentType = state.tangemPayState::class.java,
) { TangemPayMainScreenBlock(state.tangemPayState, isBalanceHidden = state.isHidingMode, itemModifier) }
if (selectedWallet is WalletState.MultiCurrency) {
item(
key = "TangemPayMainScreenBlock",
contentType = selectedWallet.tangemPayState::class.java,
) {
TangemPayMainScreenBlock(
selectedWallet.tangemPayState,
isBalanceHidden = state.isHidingMode,
itemModifier,
)
}
}
(selectedWallet as? WalletState.SingleCurrency)?.let { walletState ->
walletState.marketPriceBlockState?.let { marketPriceBlockState ->