Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-03 18:00:38 +08:00
parent b538cc76e1
commit dbb8ab5d50
11 changed files with 133 additions and 53 deletions

View file

@ -3,14 +3,14 @@ package com.tangem.tap.domain.card
import arrow.core.Either
import arrow.core.raise.either
import arrow.core.right
import com.tangem.common.CompletionResult
import com.tangem.common.UserCodeType
import com.tangem.common.*
import com.tangem.common.core.TangemError
import com.tangem.common.core.TangemSdkError
import com.tangem.common.core.UserCodeRequestPolicy
import com.tangem.common.doOnResult
import com.tangem.domain.card.ResetCardUseCase
import com.tangem.domain.card.models.ResetCardError
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.tap.domain.sdk.TangemSdkManager
internal class DefaultResetCardUseCase(
@ -18,25 +18,37 @@ internal class DefaultResetCardUseCase(
) : ResetCardUseCase {
override suspend fun invoke(card: CardDTO): Either<ResetCardError, Unit> = either {
enterRequiredAccessCode(card) {
tangemSdkManager.resetToFactorySettings(
cardId = card.cardId,
allowsRequestAccessCodeFromRepository = true,
)
.doOnSuccess { Unit.right() }
.doOnFailure { raise(it.mapToDomainError()) }
}
}
override suspend fun invoke(
cardNumber: Int,
card: CardDTO,
userWalletId: UserWalletId,
): Either<ResetCardError, Unit> = either {
enterRequiredAccessCode(card) {
tangemSdkManager.resetBackupCard(cardNumber, userWalletId)
.doOnSuccess { Unit.right() }
.doOnFailure { raise(it.mapToDomainError()) }
}
}
private suspend fun enterRequiredAccessCode(
card: CardDTO,
task: suspend TangemSdkManager.() -> CompletionResult<*>,
) {
val policyBeforeReset = tangemSdkManager.userCodeRequestPolicy
requestMandatoryAccessCodeEntry(card)
val result = tangemSdkManager.resetToFactorySettings(
cardId = card.cardId,
allowsRequestAccessCodeFromRepository = true,
)
tangemSdkManager.task()
.doOnResult { tangemSdkManager.setUserCodeRequestPolicy(policyBeforeReset) }
when (result) {
is CompletionResult.Success -> Unit.right()
is CompletionResult.Failure -> {
if (result.error is TangemSdkError.UserCancelled) {
raise(ResetCardError.UserCanceled)
} else {
raise(ResetCardError.AnotherSdkError)
}
}
}
}
private fun requestMandatoryAccessCodeEntry(card: CardDTO) {
@ -52,4 +64,8 @@ internal class DefaultResetCardUseCase(
tangemSdkManager.setUserCodeRequestPolicy(policy = UserCodeRequestPolicy.Always(type))
}
}
private fun TangemError.mapToDomainError(): ResetCardError {
return if (this is TangemSdkError.UserCancelled) ResetCardError.UserCanceled else ResetCardError.AnotherSdkError
}
}

View file

@ -68,7 +68,7 @@ interface TangemSdkManager {
allowsRequestAccessCodeFromRepository: Boolean,
): CompletionResult<CardDTO>
suspend fun resetBackupCard(userWalletId: UserWalletId): CompletionResult<Unit>
suspend fun resetBackupCard(cardNumber: Int, userWalletId: UserWalletId): CompletionResult<Unit>
suspend fun saveAccessCode(accessCode: String, cardsIds: Set<String>): CompletionResult<Unit>

View file

@ -170,10 +170,15 @@ class DefaultTangemSdkManager(
.map { CardDTO(it) }
}
override suspend fun resetBackupCard(userWalletId: UserWalletId): CompletionResult<Unit> {
override suspend fun resetBackupCard(cardNumber: Int, userWalletId: UserWalletId): CompletionResult<Unit> {
return runTaskAsyncReturnOnMain(
runnable = ResetBackupCardTask(userWalletId),
initialMessage = Message(resources.getString(R.string.card_settings_reset_card_to_factory)),
initialMessage = Message(
resources.getString(
R.string.initial_message_reset_backup_card_header,
cardNumber.toString(),
),
),
)
}

View file

@ -87,7 +87,7 @@ class MockTangemSdkManager(
return MockProvider.getCardDto()
}
override suspend fun resetBackupCard(userWalletId: UserWalletId): CompletionResult<Unit> {
override suspend fun resetBackupCard(cardNumber: Int, userWalletId: UserWalletId): CompletionResult<Unit> {
return CompletionResult.Success(Unit)
}