Updated on 2026-08-14
This commit is contained in:
parent
5a8292a92a
commit
58f34c4a2e
6 changed files with 66 additions and 45 deletions
|
|
@ -31,7 +31,6 @@ import com.tangem.operations.issuerAndUserData.ReadIssuerDataCommand
|
|||
import com.tangem.tap.domain.TapSdkError
|
||||
import com.tangem.tap.domain.extensions.getPrimaryCurve
|
||||
import com.tangem.tap.domain.extensions.getSingleWallet
|
||||
import com.tangem.tap.domain.extensions.hasNoWallets
|
||||
import com.tangem.tap.domain.extensions.isMultiwalletAllowed
|
||||
import com.tangem.tap.domain.tokens.UserTokensRepository
|
||||
import com.tangem.tap.domain.tokens.models.BlockchainNetwork
|
||||
|
|
@ -85,7 +84,6 @@ class ScanProductTask(
|
|||
private fun getErrorIfExcludedCard(card: Card): TangemError? {
|
||||
if (card.isExcluded) return TapSdkError.CardForDifferentApp
|
||||
if (card.isNotSupportedInThatRelease) return TapSdkError.CardNotSupportedByRelease
|
||||
if (card.isSaltPay && card.hasNoWallets()) return TapSdkError.ScanPrimaryCard
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ import com.tangem.tap.common.extensions.dispatchDialogShow
|
|||
import com.tangem.tap.common.extensions.dispatchOpenUrl
|
||||
import com.tangem.tap.common.extensions.onCardScanned
|
||||
import com.tangem.tap.common.postUiDelayBg
|
||||
import com.tangem.tap.common.redux.AppDialog
|
||||
import com.tangem.tap.common.redux.AppState
|
||||
import com.tangem.tap.common.redux.global.GlobalAction
|
||||
import com.tangem.tap.common.redux.navigation.AppScreen
|
||||
|
|
@ -35,6 +36,7 @@ import com.tangem.tap.features.send.redux.states.ButtonState
|
|||
import com.tangem.tap.preferencesStorage
|
||||
import com.tangem.tap.scope
|
||||
import com.tangem.tap.store
|
||||
import com.tangem.wallet.R
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import org.rekotlin.Action
|
||||
|
|
@ -107,42 +109,59 @@ private fun onScanSuccess(scanResponse: ScanResponse) {
|
|||
store.dispatch(TwinCardsAction.IfTwinsPrepareState(scanResponse))
|
||||
|
||||
if (scanResponse.isSaltPay()) {
|
||||
scope.launch {
|
||||
val result = OnboardingSaltPayHelper.isOnboardingCase(scanResponse)
|
||||
delay(500)
|
||||
withMainContext {
|
||||
when (result) {
|
||||
is Result.Success -> {
|
||||
val isOnboardingCase = result.data
|
||||
if (isOnboardingCase) {
|
||||
store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false))
|
||||
val (manager, config) = OnboardingSaltPayState.initDependency(scanResponse)
|
||||
store.dispatch(OnboardingSaltPayAction.Init.SetDependencies(manager, config))
|
||||
store.dispatch(OnboardingSaltPayAction.Update)
|
||||
// store.dispatch(OnboardingSaltPayAction.Init.DiscardBackupSteps)
|
||||
navigateTo(AppScreen.OnboardingWallet)
|
||||
} else {
|
||||
navigateTo(AppScreen.Wallet)
|
||||
withIOContext { store.onCardScanned(scanResponse) }
|
||||
}
|
||||
}
|
||||
is Result.Failure -> {
|
||||
changeButtonState(ButtonState.ENABLED)
|
||||
when (val error = result.error) {
|
||||
is SaltPayRegistrationError -> {
|
||||
val dialog = when (error) {
|
||||
is SaltPayRegistrationError.NoGas -> SaltPayDialog.NoFundsForActivation
|
||||
else -> SaltPayDialog.RegistrationError(error)
|
||||
}
|
||||
store.dispatchDialogShow(dialog)
|
||||
if (scanResponse.isSaltPayVisa()) {
|
||||
scope.launch {
|
||||
val result = OnboardingSaltPayHelper.isOnboardingCase(scanResponse)
|
||||
delay(500)
|
||||
withMainContext {
|
||||
when (result) {
|
||||
is Result.Success -> {
|
||||
val isOnboardingCase = result.data
|
||||
if (isOnboardingCase) {
|
||||
store.dispatch(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = false))
|
||||
val (manager, config) = OnboardingSaltPayState.initDependency(scanResponse)
|
||||
store.dispatch(OnboardingSaltPayAction.Init.SetDependencies(manager, config))
|
||||
store.dispatch(OnboardingSaltPayAction.Update)
|
||||
// store.dispatch(OnboardingSaltPayAction.Init.DiscardBackupSteps)
|
||||
navigateTo(AppScreen.OnboardingWallet)
|
||||
} else {
|
||||
navigateTo(AppScreen.Wallet)
|
||||
withIOContext { store.onCardScanned(scanResponse) }
|
||||
}
|
||||
else -> {
|
||||
store.dispatchDebugErrorNotification(error.localizedMessage ?: "SaltPay: Unknown error")
|
||||
}
|
||||
is Result.Failure -> {
|
||||
changeButtonState(ButtonState.ENABLED)
|
||||
when (val error = result.error) {
|
||||
is SaltPayRegistrationError -> {
|
||||
val dialog = when (error) {
|
||||
is SaltPayRegistrationError.NoGas -> SaltPayDialog.NoFundsForActivation
|
||||
else -> SaltPayDialog.RegistrationError(error)
|
||||
}
|
||||
store.dispatchDialogShow(dialog)
|
||||
}
|
||||
else -> {
|
||||
store.dispatchDebugErrorNotification(
|
||||
error.localizedMessage ?: "SaltPay: Unknown error",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (scanResponse.card.backupStatus?.isActive == false) {
|
||||
changeButtonState(ButtonState.ENABLED)
|
||||
store.dispatchDialogShow(
|
||||
AppDialog.SimpleOkDialogRes(
|
||||
headerId = R.string.saltpay_error_empty_backup_title,
|
||||
messageId = R.string.saltpay_error_empty_backup_message,
|
||||
),
|
||||
)
|
||||
} else {
|
||||
navigateTo(AppScreen.Wallet, null)
|
||||
scope.launch { store.onCardScanned(scanResponse) }
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (OnboardingHelper.isOnboardingCase(scanResponse)) {
|
||||
|
|
|
|||
|
|
@ -245,8 +245,8 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction)
|
|||
is BackupAction.AddBackupCard -> {
|
||||
backupService.skipCompatibilityChecks = true
|
||||
tangemSdk.config.filter.cardIdFilter = CardFilter.Companion.CardIdFilter.Allow(
|
||||
items = SaltPayWorkaround.tangemWalletCardIds.toSet(),
|
||||
ranges = SaltPayWorkaround.tangemWalletCardIdRanges,
|
||||
items = SaltPayWorkaround.walletCardIds.toSet(),
|
||||
ranges = SaltPayWorkaround.walletCardIdRanges,
|
||||
)
|
||||
|
||||
backupService.addBackupCard { result ->
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ object SaltPayWorkaround {
|
|||
"AE03",
|
||||
) + attachDebugVisaBatches()
|
||||
|
||||
val tangemWalletCardIds = listOf(
|
||||
val walletCardIds = listOf(
|
||||
"AC01000000033503",
|
||||
"AC01000000033594",
|
||||
"AC01000000033586",
|
||||
|
|
@ -61,16 +61,16 @@ object SaltPayWorkaround {
|
|||
"AC03000000076203",
|
||||
"AC03000000076211",
|
||||
"AC03000000076229",
|
||||
) + attachDebugTangemCardIds()
|
||||
) + attachDebugWalletCardIds()
|
||||
|
||||
val tangemWalletCardIdRanges = listOf(
|
||||
val walletCardIdRanges = listOf(
|
||||
CardIdRange("AC05000000000003", "AC05000000023997")!!,
|
||||
) + attachDebugTangemCardIdRanges()
|
||||
) + attachDebugWalletCardIdRanges()
|
||||
|
||||
fun isVisaBatchId(batchId: String): Boolean = visaBatches.contains(batchId)
|
||||
|
||||
fun isTangemWalletCardId(cardId: String): Boolean {
|
||||
return if (tangemWalletCardIds.contains(cardId)) true else tangemWalletCardIdRanges.contains(cardId)
|
||||
fun isWalletCardId(cardId: String): Boolean {
|
||||
return if (walletCardIds.contains(cardId)) true else walletCardIdRanges.contains(cardId)
|
||||
}
|
||||
|
||||
private fun attachDebugVisaBatches(): List<String> {
|
||||
|
|
@ -79,13 +79,13 @@ object SaltPayWorkaround {
|
|||
) else listOf()
|
||||
}
|
||||
|
||||
private fun attachDebugTangemCardIds(): List<String> {
|
||||
private fun attachDebugWalletCardIds(): List<String> {
|
||||
return if (BuildConfig.DEBUG) listOf(
|
||||
"FF04000000000232",
|
||||
) else listOf()
|
||||
}
|
||||
|
||||
private fun attachDebugTangemCardIdRanges(): List<CardIdRange> {
|
||||
private fun attachDebugWalletCardIdRanges(): List<CardIdRange> {
|
||||
return if (BuildConfig.DEBUG) listOf(
|
||||
CardIdRange("FF04000000000000", "FF04999999999999")!!,
|
||||
) else listOf()
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ import com.tangem.common.extensions.toMapKey
|
|||
import com.tangem.common.hdWallet.DerivationPath
|
||||
import com.tangem.domain.common.TapWorkarounds.getTangemNoteBlockchain
|
||||
import com.tangem.domain.common.TapWorkarounds.isSaltPay
|
||||
import com.tangem.domain.common.TapWorkarounds.isSaltPayVisa
|
||||
import com.tangem.domain.common.TapWorkarounds.isSaltPayWallet
|
||||
import com.tangem.domain.common.TapWorkarounds.isTangemNote
|
||||
import com.tangem.domain.common.TapWorkarounds.isTangemTwins
|
||||
import com.tangem.domain.common.TapWorkarounds.isTestCard
|
||||
|
|
@ -54,6 +56,8 @@ data class ScanResponse(
|
|||
fun isTangemNote(): Boolean = productType == ProductType.Note
|
||||
fun isTangemWallet(): Boolean = productType == ProductType.Wallet
|
||||
fun isSaltPay(): Boolean = productType == ProductType.SaltPay
|
||||
fun isSaltPayVisa(): Boolean = card.isSaltPayVisa
|
||||
fun isSaltPayWallet(): Boolean = card.isSaltPayWallet
|
||||
fun isTangemTwins(): Boolean = productType == ProductType.Twins
|
||||
fun twinsIsTwinned(): Boolean = card.isTangemTwins && walletData != null && secondTwinPublicKey != null
|
||||
fun supportsHdWallet(): Boolean = card.settings.isHDWalletAllowed
|
||||
|
|
|
|||
|
|
@ -65,13 +65,13 @@ object TapWorkarounds {
|
|||
|
||||
|
||||
val Card.isSaltPay: Boolean
|
||||
get() = isSaltPayVisa || isSaltPayTangem
|
||||
get() = isSaltPayVisa || isSaltPayWallet
|
||||
|
||||
val Card.isSaltPayVisa: Boolean
|
||||
get() = SaltPayWorkaround.isVisaBatchId(batchId)
|
||||
|
||||
val Card.isSaltPayTangem: Boolean
|
||||
get() = SaltPayWorkaround.isTangemWalletCardId(cardId)
|
||||
val Card.isSaltPayWallet: Boolean
|
||||
get() = SaltPayWorkaround.isWalletCardId(cardId)
|
||||
|
||||
|
||||
val Card.isExcluded: Boolean
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue