diff --git a/app/src/main/java/com/tangem/tap/common/DialogManager.kt b/app/src/main/java/com/tangem/tap/common/DialogManager.kt index 8e36ea5a94..5ae8d9ce04 100644 --- a/app/src/main/java/com/tangem/tap/common/DialogManager.kt +++ b/app/src/main/java/com/tangem/tap/common/DialogManager.kt @@ -131,7 +131,7 @@ class DialogManager : StoreSubscriber { is BackupDialog.BackupInProgress -> BackupInProgressDialog.create(context) is BackupDialog.UnfinishedBackupFound -> UnfinishedBackupFoundDialog.create(context) is BackupDialog.ConfirmDiscardingBackup -> ConfirmDiscardingBackupDialog.create(context) - is SaltPayDialog.Activation.NoFunds -> NoFundsForActivationDialog.create(context) + is SaltPayDialog.Activation.NoGas -> NoFundsForActivationDialog.create(context) is SaltPayDialog.Activation.TryToInterrupt -> TryToInterruptRegistrationDialog.create(context, state.dialog) is SaltPayDialog.Activation.OnError -> RegistrationErrorDialog.create(context, state.dialog) is WalletDialog.CurrencySelectionDialog -> CurrencySelectionDialog.create(state.dialog, context) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 3d596bbce3..a3aba839df 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -38,8 +38,20 @@ sealed class GlobalAction : Action { object HideDialog : GlobalAction() sealed class Onboarding : GlobalAction() { + /** + * Initiate an onboarding process. + * For SaltPay cards it's additionally checks for unfinished backup. + * For resuming unfinished backup for standard Wallet cards see CheckForUnfinishedBackup and + * StartForUnfinishedBackup + */ data class Start(val scanResponse: ScanResponse, val canSkipBackup: Boolean = true) : Onboarding() - data class StartForUnfinishedBackup(val isSaltPayBackup: Boolean) : Onboarding() + + /** + * Initiate resuming of unfinished backup only for standard Wallet cards. + * For SaltPay cards unfinished backup resumed after scanning the card on HomeScreen through Onboarding.Start. + * See more Onboarding.Start, CheckForUnfinishedBackup + */ + object StartForUnfinishedBackup : Onboarding() object Stop : Onboarding() } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt index ce9a6b6c41..885f57fa99 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletAction.kt @@ -5,7 +5,7 @@ import org.rekotlin.Action sealed class OnboardingWalletAction : Action { object Init : OnboardingWalletAction() - object StartSaltPayCardActivation: OnboardingWalletAction() + object StartSaltPayCardActivation : OnboardingWalletAction() object GetToCreateWalletStep : OnboardingWalletAction() object GetToSaltPayStep : OnboardingWalletAction() object CreateWallet : OnboardingWalletAction() @@ -30,6 +30,11 @@ sealed class BackupAction : Action { object StartAddingPrimaryCard : BackupAction() object ScanPrimaryCard : BackupAction() + /** + * Check for unfinished backup of standard Wallet cards. + * For SaltPay cards unfinished backup resumed after scanning the card on HomeScreen through Onboarding.Start. + * See more Onboarding.Start, CheckForUnfinishedBackup, StartForUnfinishedBackup + */ object CheckForUnfinishedBackup : BackupAction() object StartAddingBackupCards : BackupAction() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt index b03729bda9..148b1061a5 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletMiddleware.kt @@ -62,24 +62,26 @@ private fun handleWalletAction(action: Action, state: () -> AppState?, dispatch: when (action) { OnboardingWalletAction.Init -> { - // if (walletState.onboardingSaltPayState?.isTest == true) { - // store.dispatch(BackupAction.FinishBackup) - // return - // } - when { card == null -> { - // StartForUnfinishedBackup -> navigateTo(OnboardingWallet) -> OnboardingWalletAction.Init + // it's possible when found unfinished backup for standard Wallet cards store.dispatch(OnboardingWalletAction.ResumeBackup) } card.hasWallets() && card.backupStatus == Card.BackupStatus.NoBackup -> { store.dispatch(OnboardingWalletAction.ResumeBackup) } card.hasWallets() && card.backupStatus?.isActive == true -> { - if (scanResponse.isSaltPay()) { - store.dispatch(OnboardingWalletAction.GetToSaltPayStep) + when { + // check for unfinished backup for saltPay cards. See more + scanResponse.isSaltPay() && backupService.hasIncompletedBackup -> { + store.dispatch(OnboardingWalletAction.ResumeBackup) + } + scanResponse.isSaltPay() -> { + store.dispatch(OnboardingWalletAction.GetToSaltPayStep) + store.dispatch(BackupAction.FinishBackup) + } + else -> store.dispatch(BackupAction.FinishBackup) } - store.dispatch(BackupAction.FinishBackup) } else -> { store.dispatch(OnboardingWalletAction.GetToCreateWalletStep) @@ -327,15 +329,12 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) backupService.discardSavedBackup() } is BackupAction.CheckForUnfinishedBackup -> { - if (backupService.hasIncompletedBackup) { + if (backupService.hasIncompletedBackup && !backupService.primaryCardIsSaltPay()) { store.dispatch(GlobalAction.ShowDialog(BackupDialog.UnfinishedBackupFound)) } } is BackupAction.ResumeFoundUnfinishedBackup -> { - val isSaltPay = backupService.primaryCardId?.slice(0..3)?.let { - SaltPayWorkaround.isVisaBatchId(it) - } ?: false - store.dispatch(GlobalAction.Onboarding.StartForUnfinishedBackup(isSaltPay)) + store.dispatch(GlobalAction.Onboarding.StartForUnfinishedBackup) store.dispatch(NavigationAction.NavigateTo(AppScreen.OnboardingWallet)) } is BackupAction.DismissBackup -> { @@ -345,6 +344,12 @@ private fun handleBackupAction(appState: () -> AppState?, action: BackupAction) } } +private fun BackupService.primaryCardIsSaltPay(): Boolean { + return primaryCardId?.slice(0..3)?.let { + SaltPayWorkaround.isVisaBatchId(it) + } ?: false +} + /** * SaltPay state maybe not initialized if backup resumed from ResumeFoundUnfinishedBackup action */ diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt index 0f79ba3da0..e90b69a31a 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletReducer.kt @@ -38,26 +38,28 @@ private fun internalReduce(action: Action, appState: AppState): OnboardingWallet private class ReducerForGlobalAction { companion object { - fun reduce(action: GlobalAction.Onboarding, state: OnboardingWalletState): OnboardingWalletState = when (action) { - is GlobalAction.Onboarding.Start -> { - OnboardingWalletState( - backupState = state.backupState.copy( - maxBackupCards = if (action.scanResponse.isSaltPay()) 1 else 2, - canSkipBackup = if (action.scanResponse.isSaltPay()) false else action.canSkipBackup, - ), - isSaltPay = action.scanResponse.isSaltPay() - ) + fun reduce(action: GlobalAction.Onboarding, state: OnboardingWalletState): OnboardingWalletState { + return when (action) { + is GlobalAction.Onboarding.Start -> { + OnboardingWalletState( + backupState = state.backupState.copy( + maxBackupCards = if (action.scanResponse.isSaltPay()) 1 else 2, + canSkipBackup = if (action.scanResponse.isSaltPay()) false else action.canSkipBackup, + ), + isSaltPay = action.scanResponse.isSaltPay(), + ) + } + is GlobalAction.Onboarding.StartForUnfinishedBackup -> { + OnboardingWalletState( + backupState = state.backupState.copy( + maxBackupCards = 2, + canSkipBackup = false, + ), + isSaltPay = false, + ) + } + else -> state } - is GlobalAction.Onboarding.StartForUnfinishedBackup -> { - OnboardingWalletState( - backupState = state.backupState.copy( - maxBackupCards = if (action.isSaltPayBackup) 1 else 2, - canSkipBackup = false, - ), - isSaltPay = action.isSaltPayBackup, - ) - } - else -> state } } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt index 7be228dcde..f31637ea10 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt @@ -16,7 +16,7 @@ class SaltPayExceptionHandler { when (throwable) { is SaltPayRegistrationError -> { val dialog = when (throwable) { - is SaltPayRegistrationError.NoGas -> SaltPayDialog.Activation.NoFunds + is SaltPayRegistrationError.NoGas -> SaltPayDialog.Activation.NoGas else -> SaltPayDialog.Activation.OnError(throwable) } store.dispatchDialogShow(dialog) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt index f28a3a29a2..4417886278 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/SaltPayDialog.kt @@ -9,7 +9,7 @@ import com.tangem.tap.features.onboarding.products.wallet.saltPay.message.SaltPa */ sealed class SaltPayDialog : StateDialog { sealed class Activation : SaltPayDialog() { - object NoFunds : SaltPayDialog() + object NoGas : SaltPayDialog() data class OnError(val error: SaltPayRegistrationError) : SaltPayDialog() data class TryToInterrupt(val onOk: VoidCallback, val onCancel: VoidCallback) : SaltPayDialog() } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt index b721043f3d..0bcfb5d36f 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/ui/OnboardingSaltPayView.kt @@ -150,7 +150,7 @@ internal class OnboardingSaltPayView( private fun handleNoGas() { // normally this shouldn't happen store.dispatch(NavigationAction.PopBackTo(AppScreen.Home)) - store.dispatchDialogShow(SaltPayDialog.Activation.NoFunds) + store.dispatchDialogShow(SaltPayDialog.Activation.NoGas) } private fun handleNeedPin() = with(walletFragment.bindingSaltPay) {