From 60911ceb8ca8c9c2b0fd980b59b2e3c4b706167c Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 10 Jul 2026 13:11:37 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tangempay/model/TangemPayDetailsModel.kt | 20 ---- ...TangemPayFreezeUnfreezeStateTransformer.kt | 26 ----- .../utils/PaymentAccountStatusExt.kt | 4 +- .../TangemPayDetailsStateFactoryTest.kt | 17 +++ ...emPayFreezeUnfreezeStateTransformerTest.kt | 108 ------------------ 5 files changed, 18 insertions(+), 157 deletions(-) delete mode 100644 features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformer.kt delete mode 100644 features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformerTest.kt diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt index 0b89ff84dd..0ad2010e54 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt @@ -120,7 +120,6 @@ internal class TangemPayDetailsModel @Inject constructor( private val refreshStateJobHolder = JobHolder() private val addToWalletBannerJobHolder = JobHolder() - private val frozenStateJobHolder = JobHolder() val bottomSheetNavigation: SlotNavigation = SlotNavigation() @@ -141,9 +140,6 @@ internal class TangemPayDetailsModel @Inject constructor( fetchAddToWalletBanner() uiState.update { stateFactory.getLoadedState(state) } uiState.update(DetailsBalanceTransformer(state.balance.fiatBalance)) - state.cards.firstOrNull()?.let { card -> - subscribeToCardFrozenState(card.id) - } } else -> uiState.update { stateFactory.getLoadingState() } } @@ -165,22 +161,6 @@ internal class TangemPayDetailsModel @Inject constructor( fun isRedesignEnabled(): Boolean = tangemPayFeatureToggles.isRedesignEnabled - private fun subscribeToCardFrozenState(cardId: String) { - frozenStateJobHolder.cancel() - cardDetailsRepository - .cardFrozenState(cardId) - .onEach { frozenState -> - uiState.update( - TangemPayFreezeUnfreezeStateTransformer( - cardFrozenState = frozenState, - isDataFresh = currentStatus.value.ifLoadedOrNull { it.isFresh } == true, - ), - ) - } - .launchIn(modelScope) - .saveIn(frozenStateJobHolder) - } - override fun onClickAddFunds() { analytics.send(TangemPayAnalyticsEvents.AddFundsClicked()) val balance = currentStatus.value.balanceOrNull() diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformer.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformer.kt deleted file mode 100644 index 2644465ec6..0000000000 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformer.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.tangem.features.tangempay.model.transformers - -import com.tangem.domain.models.pay.TangemPayCardFrozenState -import com.tangem.features.tangempay.entity.TangemPayDetailsBalanceBlockState -import com.tangem.features.tangempay.entity.TangemPayDetailsUM -import com.tangem.utils.transformer.Transformer -import kotlinx.collections.immutable.toPersistentList - -internal class TangemPayFreezeUnfreezeStateTransformer( - private val cardFrozenState: TangemPayCardFrozenState, - private val isDataFresh: Boolean, -) : Transformer { - - override fun transform(prevState: TangemPayDetailsUM): TangemPayDetailsUM { - val balanceBlockState = if (prevState.balanceBlockState is TangemPayDetailsBalanceBlockState.Content) { - val isEnabled = isDataFresh && cardFrozenState == TangemPayCardFrozenState.Unfrozen - val actionButtons = prevState.balanceBlockState.actionButtons.map { - it.copy(isEnabled = isEnabled) - } - prevState.balanceBlockState.copy(actionButtons = actionButtons.toPersistentList()) - } else { - prevState.balanceBlockState - } - return prevState.copy(balanceBlockState = balanceBlockState) - } -} \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/PaymentAccountStatusExt.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/PaymentAccountStatusExt.kt index 0398035dfc..afd9d0f07a 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/PaymentAccountStatusExt.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/PaymentAccountStatusExt.kt @@ -22,14 +22,12 @@ internal val AccountStatus.Payment.isDeactivated: Boolean get() = value is PaymentAccountStatusValue.Deactivated internal val PaymentAccountStatusValue.Loaded.isFresh: Boolean - get() = source == StatusSource.ACTUAL && error == null + get() = source.isActual() && error == null internal fun AccountStatus.Payment.requireLoaded(): PaymentAccountStatusValue.Loaded = value as? PaymentAccountStatusValue.Loaded ?: error("Card-detail subflow requires Loaded status, got ${value::class.simpleName}") -internal fun AccountStatus.Payment.firstCard(): TangemPayCard = requireLoaded().cards.first() - internal inline fun AccountStatus.Payment.ifLoadedOrNull(call: (PaymentAccountStatusValue.Loaded) -> T): T? { val value = value return if (value is PaymentAccountStatusValue.Loaded) { diff --git a/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactoryTest.kt b/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactoryTest.kt index c13bd904e7..e180072110 100644 --- a/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactoryTest.kt +++ b/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactoryTest.kt @@ -96,6 +96,23 @@ internal class TangemPayDetailsStateFactoryTest { assertThat(state.balanceBlockState.cardsBlockState?.isAddCardEnabled).isTrue() } + @Test + fun `GIVEN actual status with frozen first card but unfrozen second card WHEN getLoadedState THEN action buttons enabled`() { + val factory = createFactory() + val frozenFirstCard = activeUnfrozenCard.copy(id = "card_frozen", frozenState = TangemPayCardFrozenState.Frozen) + val status = loadedStatus( + statusSource = StatusSource.ACTUAL, + statusError = null, + statusCards = listOf(frozenFirstCard, activeUnfrozenCard), + ) + + // Act + val state = factory.getLoadedState(status) + + // Assert + assertThat(state.balanceBlockState.actionButtons.map { it.isEnabled }).containsExactly(true, true) + } + @Test fun `GIVEN actual status with issuing card WHEN getLoadedState THEN add card disabled`() { // Arrange diff --git a/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformerTest.kt b/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformerTest.kt deleted file mode 100644 index 44e221858c..0000000000 --- a/features/tangempay/details/impl/src/test/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayFreezeUnfreezeStateTransformerTest.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.tangem.features.tangempay.model.transformers - -import com.google.common.truth.Truth.assertThat -import com.tangem.core.ui.components.buttons.actions.ActionButtonConfig -import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig -import com.tangem.core.ui.extensions.TextReference -import com.tangem.domain.models.pay.TangemPayCardFrozenState -import com.tangem.features.tangempay.entity.TangemPayDetailsBalanceBlockState -import com.tangem.features.tangempay.entity.TangemPayDetailsTopBarConfig -import com.tangem.features.tangempay.entity.TangemPayDetailsUM -import kotlinx.collections.immutable.persistentListOf -import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource - -internal class TangemPayFreezeUnfreezeStateTransformerTest { - - @ParameterizedTest - @MethodSource("provideCases") - fun `GIVEN content state WHEN transform THEN buttons enabled only when fresh and unfrozen`(case: Case) { - // Arrange - val state = contentState(actionButtonsEnabled = true) - - // Act - val result = TangemPayFreezeUnfreezeStateTransformer( - cardFrozenState = case.frozenState, - isDataFresh = case.isDataFresh, - ).transform(state) - - // Assert - val enabled = result.balanceBlockState.actionButtons.map { it.isEnabled } - assertThat(enabled).containsExactly(case.expectedEnabled, case.expectedEnabled) - } - - @Test - fun `GIVEN non-content state WHEN transform THEN state is unchanged`() { - // Arrange - val state = loadingState() - - // Act - val result = TangemPayFreezeUnfreezeStateTransformer( - cardFrozenState = TangemPayCardFrozenState.Unfrozen, - isDataFresh = true, - ).transform(state) - - // Assert - assertThat(result).isEqualTo(state) - } - - private fun contentState(actionButtonsEnabled: Boolean): TangemPayDetailsUM = baseState( - balanceBlockState = TangemPayDetailsBalanceBlockState.Content( - actionButtons = persistentListOf( - actionButton(isEnabled = actionButtonsEnabled), - actionButton(isEnabled = actionButtonsEnabled), - ), - cardsBlockState = null, - fiatBalance = TextReference.EMPTY, - isBalanceFlickering = false, - ), - ) - - private fun loadingState(): TangemPayDetailsUM = baseState( - balanceBlockState = TangemPayDetailsBalanceBlockState.Loading( - actionButtons = persistentListOf(actionButton(isEnabled = true)), - cardsBlockState = null, - ), - ) - - private fun baseState(balanceBlockState: TangemPayDetailsBalanceBlockState) = TangemPayDetailsUM( - topBarConfig = TangemPayDetailsTopBarConfig( - onBackClick = {}, - onOpenMenu = {}, - items = persistentListOf(), - itemsV2 = persistentListOf(), - ), - pullToRefreshConfig = PullToRefreshConfig(isRefreshing = false, onRefresh = {}), - balanceBlockState = balanceBlockState, - addToWalletBlockState = null, - isBalanceHidden = false, - errorNotificationConfig = null, - accountDeactivatedNotificationConfig = null, - ) - - private fun actionButton(isEnabled: Boolean) = ActionButtonConfig( - text = TextReference.EMPTY, - iconResId = 0, - onClick = {}, - isEnabled = isEnabled, - ) - - internal data class Case( - val frozenState: TangemPayCardFrozenState, - val isDataFresh: Boolean, - val expectedEnabled: Boolean, - ) - - private companion object { - @JvmStatic - fun provideCases() = listOf( - Case(frozenState = TangemPayCardFrozenState.Unfrozen, isDataFresh = true, expectedEnabled = true), - Case(frozenState = TangemPayCardFrozenState.Unfrozen, isDataFresh = false, expectedEnabled = false), - Case(frozenState = TangemPayCardFrozenState.Frozen, isDataFresh = true, expectedEnabled = false), - Case(frozenState = TangemPayCardFrozenState.Pending, isDataFresh = true, expectedEnabled = false), - Case(frozenState = TangemPayCardFrozenState.Frozen, isDataFresh = false, expectedEnabled = false), - Case(frozenState = TangemPayCardFrozenState.Pending, isDataFresh = false, expectedEnabled = false), - ) - } -} \ No newline at end of file