diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt index d8b9f44ca9..47425804ff 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/cardsettings/CardSettingsViewModel.kt @@ -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" } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt index 2bc6f07ce1..a53d4f51a7 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsMiddleware.kt @@ -46,7 +46,7 @@ object TwinCardsMiddleware { val handler = twinsWalletMiddleware } -private val twinsWalletMiddleware: Middleware = { dispatch, state -> +private val twinsWalletMiddleware: Middleware = { 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) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt index a8867a1a2c..83e641bc8a 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/redux/TwinCardsState.kt @@ -32,7 +32,7 @@ data class TwinCardsState( val steps: List 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() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/OnboardingTwinsFragment.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/OnboardingTwinsFragment.kt index 69db8e0120..eda118c3dc 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/OnboardingTwinsFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/twins/ui/OnboardingTwinsFragment.kt @@ -56,10 +56,10 @@ internal class OnboardingTwinsFragment : BaseOnboardingFragment( 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( 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) }