Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-04 16:12:40 +03:00
parent e5d93deb3b
commit 69f3fa4c0f
7 changed files with 38 additions and 25 deletions

View file

@ -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? {

View file

@ -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)

View file

@ -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),
)
}

View file

@ -7,4 +7,5 @@ data class TangemDropdownMenuItem(
val title: TextReference,
val textColor: ColorReference,
val onClick: () -> Unit,
val isEnabled: Boolean = true,
)

View file

@ -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<VisaApiError, Boolean> {
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
}
}
}

View file

@ -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,
),
),
),

View file

@ -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<TangemPayDetailsTopBarMenuItem>?,
): ImmutableList<TangemPayDetailsTopBarMenuItem>? {
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,
),
)
}