From 5248c878fc77babdd5c83a3bdcc3850911c11a1d Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 2 Dec 2025 20:34:32 +0700 Subject: [PATCH] Updated on 2026-08-14 --- .../wallet/child/wallet/model/WalletModel.kt | 11 ++++++--- .../common/preview/WalletScreenPreviewData.kt | 1 + .../wallet/state/model/WalletScreenState.kt | 1 - .../wallet/state/model/WalletState.kt | 3 +++ .../TangemPayHiddenStateTransformer.kt | 18 +++++++++++++++ .../TangemPayRefreshNeededStateTransformer.kt | 14 +++++++---- .../TangemPayUnavailableStateTransformer.kt | 23 ++++++++++++------- ...=> TangemPayUpdateInfoStateTransformer.kt} | 16 +++++++++---- .../state/utils/WalletLoadingStateFactory.kt | 2 ++ .../presentation/wallet/ui/WalletScreen.kt | 16 +++++++++---- 10 files changed, 80 insertions(+), 25 deletions(-) create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayHiddenStateTransformer.kt rename features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/{TangemPayInitialStateTransformer.kt => TangemPayUpdateInfoStateTransformer.kt} (88%) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt index 253fe5af7b..8b4044ebd1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt @@ -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, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt index abedb142a7..3050924d0c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt @@ -184,6 +184,7 @@ internal object WalletScreenPreviewData { isFlickering = false, onItemClick = { }, ), + tangemPayState = TangemPayState.Empty, type = WalletState.MultiCurrency.WalletType.Cold, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt index e142c4af9d..df260b5856 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt @@ -14,5 +14,4 @@ internal data class WalletScreenState( val isHidingMode: Boolean, val showMarketsOnboarding: Boolean, val onDismissMarketsOnboarding: () -> Unit, - val tangemPayState: TangemPayState = TangemPayState.Empty, ) \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletState.kt index 86df278ce6..ad59f9801c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletState.kt @@ -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 { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayHiddenStateTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayHiddenStateTransformer.kt new file mode 100644 index 0000000000..171cb8aaed --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayHiddenStateTransformer.kt @@ -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 + } + } +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayRefreshNeededStateTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayRefreshNeededStateTransformer.kt index 5e6a8cbb52..b3f487ec56 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayRefreshNeededStateTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayRefreshNeededStateTransformer.kt @@ -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 + } } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUnavailableStateTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUnavailableStateTransformer.kt index b7fc00db85..5cdc1926c9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUnavailableStateTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUnavailableStateTransformer.kt @@ -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 + } } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayInitialStateTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUpdateInfoStateTransformer.kt similarity index 88% rename from features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayInitialStateTransformer.kt rename to features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUpdateInfoStateTransformer.kt index 9df5ca4796..ebea3f6ca1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayInitialStateTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUpdateInfoStateTransformer.kt @@ -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 { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletLoadingStateFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletLoadingStateFactory.kt index ea2b92e829..6a066cf3d7 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletLoadingStateFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/utils/WalletLoadingStateFactory.kt @@ -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, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt index 012cd5ed10..3a0f5202b9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt @@ -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 ->