From 69f3fa4c0fb1249f9df5c9ac3a65405b68325e26 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 4 Dec 2025 16:12:40 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/data/DefaultTangemPayStorage.kt | 4 ++-- .../datasource/local/visa/TangemPayStorage.kt | 2 +- .../dropdownmenu/TangemDropdownItem.kt | 21 ++++++++++++++----- .../dropdownmenu/TangemDropdownMenuItem.kt | 1 + .../repository/DefaultOnboardingRepository.kt | 18 +++++++++------- .../entity/TangemPayDetailsStateFactory.kt | 2 ++ ...TangemPayFreezeUnfreezeStateTransformer.kt | 15 ++++++------- 7 files changed, 38 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/data/DefaultTangemPayStorage.kt b/app/src/main/java/com/tangem/tap/data/DefaultTangemPayStorage.kt index 1eab5c0eb6..9ea7cbeb84 100644 --- a/app/src/main/java/com/tangem/tap/data/DefaultTangemPayStorage.kt +++ b/app/src/main/java/com/tangem/tap/data/DefaultTangemPayStorage.kt @@ -100,8 +100,8 @@ internal class DefaultTangemPayStorage @Inject constructor( secureStorage.delete(createOrderIdKey(customerWalletAddress)) } - override suspend fun storeCheckCustomerWalletResult(userWalletId: UserWalletId) { - appPreferencesStore.store(PreferencesKeys.getTangemPayCheckCustomerByWalletId(userWalletId), true) + override suspend fun storeCheckCustomerWalletResult(userWalletId: UserWalletId, isPaeraCustomer: Boolean) { + appPreferencesStore.store(PreferencesKeys.getTangemPayCheckCustomerByWalletId(userWalletId), isPaeraCustomer) } override suspend fun checkCustomerWalletResult(userWalletId: UserWalletId): Boolean? { diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/visa/TangemPayStorage.kt b/core/datasource/src/main/java/com/tangem/datasource/local/visa/TangemPayStorage.kt index f4cb2f2cb9..e32fe05975 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/visa/TangemPayStorage.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/visa/TangemPayStorage.kt @@ -21,7 +21,7 @@ interface TangemPayStorage { suspend fun getAddToWalletDone(customerWalletAddress: String): Boolean suspend fun storeAddToWalletDone(customerWalletAddress: String, isDone: Boolean) - suspend fun storeCheckCustomerWalletResult(userWalletId: UserWalletId) + suspend fun storeCheckCustomerWalletResult(userWalletId: UserWalletId, isPaeraCustomer: Boolean) suspend fun checkCustomerWalletResult(userWalletId: UserWalletId): Boolean? suspend fun storeWithdrawOrder(userWalletId: UserWalletId, orderId: String) diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownItem.kt index 1536d84244..7632104905 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownItem.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownItem.kt @@ -20,16 +20,27 @@ import com.tangem.core.ui.test.PopUpMenuTestTags @Suppress("ComposableEventParameterNaming") @Composable fun TangemDropdownItem(item: TangemDropdownMenuItem, dismissParent: () -> Unit, modifier: Modifier = Modifier) { + val textColor = if (item.isEnabled) { + item.textColor.resolveReference() + } else { + TangemTheme.colors.text.tertiary + } Text( modifier = modifier - .clickable { - dismissParent() - item.onClick() - } + .then( + if (item.isEnabled) { + Modifier.clickable { + dismissParent() + item.onClick() + } + } else { + Modifier + }, + ) .padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing16) .testTag(PopUpMenuTestTags.BUTTON), text = item.title.resolveReference(), - style = TangemTheme.typography.button.copy(color = item.textColor.resolveReference()), + style = TangemTheme.typography.button.copy(color = textColor), ) } diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenuItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenuItem.kt index 189b35eb0e..869fe50634 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenuItem.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenuItem.kt @@ -7,4 +7,5 @@ data class TangemDropdownMenuItem( val title: TextReference, val textColor: ColorReference, val onClick: () -> Unit, + val isEnabled: Boolean = true, ) \ No newline at end of file diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt index 7fa6ae71fa..563b3ee0eb 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt @@ -71,7 +71,7 @@ internal class DefaultOnboardingRepository @Inject constructor( ifRight = { it }, ) // should storeCheckCustomerWalletResult because we already know this - tangemPayStorage.storeCheckCustomerWalletResult(userWalletId) + tangemPayStorage.storeCheckCustomerWalletResult(userWalletId, true) tangemPayStorage.storeCustomerWalletAddress( userWalletId = userWalletId, customerWalletAddress = initialCredentials.customerWalletAddress, @@ -172,8 +172,8 @@ internal class DefaultOnboardingRepository @Inject constructor( override suspend fun checkCustomerWallet(userWalletId: UserWalletId): Either { val hasTangemPay = tangemPayStorage.checkCustomerWalletResult(userWalletId) - if (hasTangemPay == true) { - return Either.Right(true) + if (hasTangemPay != null) { + return Either.Right(hasTangemPay) } return requestHelper.performWithStaticToken { staticToken -> @@ -183,12 +183,14 @@ internal class DefaultOnboardingRepository @Inject constructor( ) }.map { response -> val id = response.id - if (!id.isNullOrEmpty()) { - tangemPayStorage.storeCheckCustomerWalletResult(userWalletId = userWalletId) - true - } else { - false + val isPaeraCustomer = !id.isNullOrEmpty() + tangemPayStorage.storeCheckCustomerWalletResult(userWalletId = userWalletId, isPaeraCustomer) + isPaeraCustomer + }.mapLeft { error -> + if (error is VisaApiError.NotPaeraCustomer) { + tangemPayStorage.storeCheckCustomerWalletResult(userWalletId = userWalletId, false) } + error } } } \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt index d1d7f674aa..44b0b79cb1 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt @@ -75,11 +75,13 @@ internal class TangemPayDetailsStateFactory( text = resourceReference(id = R.string.tangempay_card_details_add_funds), iconResId = R.drawable.ic_plus_24, onClick = intents::onClickAddFunds, + isEnabled = cardFrozenState == TangemPayCardFrozenState.Unfrozen, ), ActionButtonConfig( text = resourceReference(id = R.string.tangempay_card_details_withdraw), iconResId = R.drawable.ic_arrow_up_24, onClick = intents::onClickWithdraw, + isEnabled = cardFrozenState == TangemPayCardFrozenState.Unfrozen, ), ), ), 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 index eb4dc8c81e..c6dc60c3d9 100644 --- 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 @@ -27,13 +27,10 @@ internal class TangemPayFreezeUnfreezeStateTransformer( } override fun transform(prevState: TangemPayDetailsUM): TangemPayDetailsUM { - val dropdownMenuItems = when (cardFrozenState) { - TangemPayCardFrozenState.Frozen, - TangemPayCardFrozenState.Unfrozen, - -> createUpdatedMenuItems(prevState.topBarConfig.items) - TangemPayCardFrozenState.Pending -> prevState.topBarConfig.items + val filteredItems = prevState.topBarConfig.items?.filterNot { + it.type == FreezeCard || it.type == UnfreezeCard } - + val dropdownMenuItems = createUpdatedMenuItems(filteredItems?.toPersistentList()) return prevState.copy( topBarConfig = prevState.topBarConfig.copy(items = dropdownMenuItems), cardFrozenState = converter.convert(cardFrozenState), @@ -44,12 +41,11 @@ internal class TangemPayFreezeUnfreezeStateTransformer( items: ImmutableList?, ): ImmutableList? { return items - ?.filterNot { it.type == UnfreezeCard || it.type == FreezeCard } - ?.plus(createMenuItemToAdd()) + ?.plus(createMenuItemToAdd(cardFrozenState)) ?.toPersistentList() } - private fun createMenuItemToAdd(): TangemPayDetailsTopBarMenuItem { + private fun createMenuItemToAdd(cardFrozenState: TangemPayCardFrozenState): TangemPayDetailsTopBarMenuItem { return TangemPayDetailsTopBarMenuItem( type = if (isCardFrozen) UnfreezeCard else FreezeCard, dropdownItem = TangemDropdownMenuItem( @@ -62,6 +58,7 @@ internal class TangemPayFreezeUnfreezeStateTransformer( ), textColor = themedColor { TangemTheme.colors.text.primary1 }, onClick = if (isCardFrozen) onUnfreezeClick else onFreezeClick, + isEnabled = cardFrozenState != TangemPayCardFrozenState.Pending, ), ) }