Updated on 2026-08-14

This commit is contained in:
Tangem 2024-07-31 00:26:59 +04:00
parent 01b9ceda96
commit 3b5f51c639
4 changed files with 59 additions and 39 deletions

View file

@ -24,6 +24,8 @@ import com.tangem.tap.common.redux.AppDialog
import com.tangem.tap.domain.extensions.signedHashesCount
import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.features.details.ui.common.utils.*
import com.tangem.tap.features.onboarding.products.twins.redux.CreateTwinWalletMode
import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction
import com.tangem.tap.store
import com.tangem.wallet.R
import dagger.hilt.android.lifecycle.HiltViewModel
@ -129,27 +131,8 @@ internal class CardSettingsViewModel @Inject constructor(
changeAccessCode()
}
is CardInfo.ResetToFactorySettings -> {
val card = requireNotNull(scannedScanResponse.value) {
"Impossible to reset card if ScanResponse is null"
}.card
Analytics.send(Settings.CardSettings.ButtonFactoryReset())
store.dispatchNavigationAction {
push(
route = AppRoute.ResetToFactory(
userWalletId = userWalletId,
cardId = card.cardId,
isActiveBackupStatus = card.backupStatus?.isActive == true,
backupCardsCount = when (val status = card.backupStatus) {
is CardDTO.BackupStatus.Active -> status.cardCount
is CardDTO.BackupStatus.CardLinked,
CardDTO.BackupStatus.NoBackup,
null,
-> 0
},
),
)
}
resetWalletToFactorySettings()
}
is CardInfo.SecurityMode -> {
Analytics.send(Settings.CardSettings.ButtonChangeSecurityMode())
@ -166,6 +149,37 @@ internal class CardSettingsViewModel @Inject constructor(
}
}
private fun resetWalletToFactorySettings() {
val scanResponse = requireNotNull(scannedScanResponse.value) {
"Impossible to reset card if ScanResponse is null"
}
if (scanResponse.cardTypesResolver.isTangemTwins()) {
store.dispatch(TwinCardsAction.SetMode(CreateTwinWalletMode.RecreateWallet(scanResponse)))
store.dispatchNavigationAction { push(AppRoute.OnboardingTwins) }
} else {
val card = scanResponse.card
store.dispatchNavigationAction {
push(
route = AppRoute.ResetToFactory(
userWalletId = userWalletId,
cardId = card.cardId,
isActiveBackupStatus = card.backupStatus?.isActive == true,
backupCardsCount = when (val status = card.backupStatus) {
is CardDTO.BackupStatus.Active -> status.cardCount
is CardDTO.BackupStatus.CardLinked,
CardDTO.BackupStatus.NoBackup,
null,
-> 0
},
),
)
}
}
}
private fun changeAccessCode() = viewModelScope.launch {
val scanResponse = requireNotNull(scannedScanResponse.value) { "Scan response is null" }

View file

@ -46,7 +46,7 @@ object TwinCardsMiddleware {
val handler = twinsWalletMiddleware
}
private val twinsWalletMiddleware: Middleware<AppState> = { dispatch, state ->
private val twinsWalletMiddleware: Middleware<AppState> = { dispatch, _ ->
{ next ->
{ action ->
handle(action, dispatch)
@ -65,16 +65,16 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
val userWalletsListManager = store.inject(DaggerGraphState::generalUserWalletsListManager)
fun getScanResponse(): ScanResponse {
return when (twinCardsState.mode) {
CreateTwinWalletMode.CreateWallet -> onboardingManager?.scanResponse
CreateTwinWalletMode.RecreateWallet -> globalState.scanResponse
return when (val mode = twinCardsState.mode) {
is CreateTwinWalletMode.CreateWallet -> onboardingManager?.scanResponse
is CreateTwinWalletMode.RecreateWallet -> mode.scanResponse
} ?: throw NullPointerException("ScanResponse can't be NULL")
}
fun updateScanResponse(response: ScanResponse) {
when (twinCardsState.mode) {
CreateTwinWalletMode.CreateWallet -> onboardingManager?.scanResponse = response
CreateTwinWalletMode.RecreateWallet -> store.dispatchOnMain(GlobalAction.SaveScanResponse(response))
is CreateTwinWalletMode.CreateWallet -> onboardingManager?.scanResponse = response
is CreateTwinWalletMode.RecreateWallet -> store.dispatchOnMain(GlobalAction.SaveScanResponse(response))
}
}
@ -113,7 +113,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
}
when (twinCardsState.mode) {
CreateTwinWalletMode.CreateWallet -> {
is CreateTwinWalletMode.CreateWallet -> {
mainScope.launch {
val wasTwinsOnboardingShown = store.inject(DaggerGraphState::wasTwinsOnboardingShownUseCase)
.invokeSync()
@ -132,7 +132,7 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
store.dispatch(dispatchAction)
}
}
CreateTwinWalletMode.RecreateWallet -> {
is CreateTwinWalletMode.RecreateWallet -> {
store.dispatch(TwinCardsAction.SetStepOfScreen(TwinCardsStep.Warning))
}
}
@ -226,10 +226,10 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
delay(DELAY_SDK_DIALOG_CLOSE)
withMainContext {
when (twinCardsState.mode) {
CreateTwinWalletMode.CreateWallet -> {
is CreateTwinWalletMode.CreateWallet -> {
store.dispatch(TwinCardsAction.SetStepOfScreen(TwinCardsStep.TopUpWallet))
}
CreateTwinWalletMode.RecreateWallet -> {
is CreateTwinWalletMode.RecreateWallet -> {
store.dispatch(TwinCardsAction.SetStepOfScreen(TwinCardsStep.Done))
}
}
@ -319,11 +319,11 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
TwinCardsAction.Done -> {
val scanResponse = getScanResponse()
when (twinCardsState.mode) {
CreateTwinWalletMode.CreateWallet -> {
is CreateTwinWalletMode.CreateWallet -> {
store.dispatchOnMain(GlobalAction.Onboarding.Stop)
OnboardingHelper.trySaveWalletAndNavigateToWalletScreen(scanResponse)
}
CreateTwinWalletMode.RecreateWallet -> {
is CreateTwinWalletMode.RecreateWallet -> {
scope.launch {
val walletsRepository = store.inject(DaggerGraphState::walletsRepository)

View file

@ -32,7 +32,7 @@ data class TwinCardsState(
val steps: List<TwinCardsStep>
get() = when (mode) {
CreateTwinWalletMode.CreateWallet -> listOf(
is CreateTwinWalletMode.CreateWallet -> listOf(
TwinCardsStep.None,
TwinCardsStep.CreateFirstWallet,
TwinCardsStep.CreateSecondWallet,
@ -40,7 +40,7 @@ data class TwinCardsState(
TwinCardsStep.TopUpWallet,
TwinCardsStep.Done,
)
CreateTwinWalletMode.RecreateWallet -> listOf(
is CreateTwinWalletMode.RecreateWallet -> listOf(
TwinCardsStep.None,
TwinCardsStep.CreateFirstWallet,
TwinCardsStep.CreateSecondWallet,
@ -56,7 +56,13 @@ data class TwinCardsState(
get() = currentStep == TwinCardsStep.CreateSecondWallet || currentStep == TwinCardsStep.CreateThirdWallet
}
enum class CreateTwinWalletMode { CreateWallet, RecreateWallet }
sealed class CreateTwinWalletMode {
data object CreateWallet : CreateTwinWalletMode()
data class RecreateWallet(
val scanResponse: ScanResponse,
) : CreateTwinWalletMode()
}
sealed class TwinCardsStep {
object None : TwinCardsStep()

View file

@ -56,10 +56,10 @@ internal class OnboardingTwinsFragment : BaseOnboardingFragment<TwinCardsState>(
override fun configureTransitions() {
when (store.state.twinCardsState.mode) {
CreateTwinWalletMode.CreateWallet -> {
is CreateTwinWalletMode.CreateWallet -> {
super.configureTransitions()
}
CreateTwinWalletMode.RecreateWallet -> {
is CreateTwinWalletMode.RecreateWallet -> {
configureDefaultTransactions()
}
}
@ -391,8 +391,8 @@ internal class OnboardingTwinsFragment : BaseOnboardingFragment<TwinCardsState>(
tvBody.setText(R.string.onboarding_done_body)
val layout = when (state.mode) {
CreateTwinWalletMode.CreateWallet -> R.layout.lp_onboarding_done_activation_twins
CreateTwinWalletMode.RecreateWallet -> R.layout.lp_onboarding_done
is CreateTwinWalletMode.CreateWallet -> R.layout.lp_onboarding_done_activation_twins
is CreateTwinWalletMode.RecreateWallet -> R.layout.lp_onboarding_done
}
updateConstraints(state.currentStep, layout)
}