diff --git a/app/src/main/java/com/tangem/tap/common/toggleWidget/IndeterminateProgressButtonWidget.kt b/app/src/main/java/com/tangem/tap/common/toggleWidget/IndeterminateProgressButtonWidget.kt index cc57977202..4b15ee3cb5 100644 --- a/app/src/main/java/com/tangem/tap/common/toggleWidget/IndeterminateProgressButtonWidget.kt +++ b/app/src/main/java/com/tangem/tap/common/toggleWidget/IndeterminateProgressButtonWidget.kt @@ -24,6 +24,12 @@ open class IndeterminateProgressButtonWidget( if (initialState != ProgressState.Done) changeState(initialState) } + var isEnabled: Boolean + get() = button.isEnabled + set(value) { + button.isEnabled = value + } + override val mainView: View = button override fun changeState(state: WidgetState) { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt index 48d6ef77cf..6fc233d092 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/redux/OnboardingWalletState.kt @@ -59,7 +59,8 @@ data class OnboardingWalletState( -> 9 SaltPayActivationStep.Claim -> 10 SaltPayActivationStep.ClaimInProgress -> 11 - SaltPayActivationStep.Finished -> getMaxProgress() + SaltPayActivationStep.ClaimSuccess, SaltPayActivationStep.Success, SaltPayActivationStep.Finished, + -> getMaxProgress() } } step == OnboardingWalletStep.Done -> getMaxProgress() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayAction.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayAction.kt index 3ab770c511..009f2350ad 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayAction.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayAction.kt @@ -33,7 +33,7 @@ sealed class OnboardingSaltPayAction : Action { data class TrySetPin(val pin: String) : OnboardingSaltPayAction() data class SetPin(val pin: String) : OnboardingSaltPayAction() - data class SetStep(val newStep: SaltPayActivationStep? = null) : OnboardingSaltPayAction() + data class SetStep(val newStep: SaltPayActivationStep) : OnboardingSaltPayAction() data class SetAmountToClaim(val amount: Amount?) : OnboardingSaltPayAction() data class SetTokenBalance(val balanceValue: BigDecimal) : OnboardingSaltPayAction() } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt index 47c04c1eae..ae5cf53c1b 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayMiddleware.kt @@ -195,30 +195,45 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App onException(it.error) return@launch } + + handleInProgress = false analyticsHandler.handleAnalyticsEvent(Onboarding.ClaimWasSuccessfully()) dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.ClaimInProgress)) dispatchOnMain(OnboardingSaltPayAction.RefreshClaim) } } is OnboardingSaltPayAction.RefreshClaim -> { - handleInProgress = true handleClaimRefreshInProgress = true val state = getState() scope.launch { - val tokenAmountValue = state.saltPayManager.getTokenAmount().successOr { - SaltPayExceptionHandler.handle(it.error) - handleClaimRefreshInProgress = false - return@launch - } + when (val amountToClaimResult = state.saltPayManager.getAmountToClaim()) { + is Result.Success -> { + // need to re claim + handleClaimRefreshInProgress = false + dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.Claim)) + } + is Result.Failure -> { + when (amountToClaimResult.error) { + is SaltPayActivationError.NoFundsToClaim -> { + val tokenAmountValue = state.saltPayManager.getTokenAmount().successOr { + SaltPayExceptionHandler.handle(it.error) + handleClaimRefreshInProgress = false + return@launch + } - if (tokenAmountValue.isPositive()) { - handleInProgress = false - handleClaimRefreshInProgress = false - dispatchOnMain(OnboardingSaltPayAction.SetTokenBalance(tokenAmountValue)) - dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.Finished)) - } else { - handleClaimRefreshInProgress = false + handleClaimRefreshInProgress = false + if (tokenAmountValue.isPositive()) { + dispatchOnMain(OnboardingSaltPayAction.SetTokenBalance(tokenAmountValue)) + dispatchOnMain(OnboardingSaltPayAction.SetStep(SaltPayActivationStep.ClaimSuccess)) + } + } + else -> { + handleClaimRefreshInProgress = false + SaltPayExceptionHandler.handle(amountToClaimResult.error) + } + } + } } } } @@ -229,20 +244,13 @@ private fun handleOnboardingSaltPayAction(anyAction: Action, appState: () -> App } } -fun handleAnalytics(analyticsHandler: GlobalAnalyticsEventHandler, step: SaltPayActivationStep?) { +private fun handleAnalytics(analyticsHandler: GlobalAnalyticsEventHandler, step: SaltPayActivationStep) { when (step) { - SaltPayActivationStep.None -> {} - SaltPayActivationStep.NoGas -> {} - SaltPayActivationStep.NeedPin -> {} - SaltPayActivationStep.CardRegistration -> {} - SaltPayActivationStep.KycIntro -> {} SaltPayActivationStep.KycStart -> analyticsHandler.handleAnalyticsEvent(Onboarding.KYCStarted()) SaltPayActivationStep.KycWaiting -> analyticsHandler.handleAnalyticsEvent(Onboarding.KYCInProgress()) SaltPayActivationStep.KycReject -> analyticsHandler.handleAnalyticsEvent(Onboarding.KYCRejected()) SaltPayActivationStep.Claim -> analyticsHandler.handleAnalyticsEvent(Onboarding.ClaimScreenOpened()) - SaltPayActivationStep.ClaimInProgress -> {} - SaltPayActivationStep.Finished -> {} - null -> {} + else -> {} } } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt index 0615e2d503..2f4d6c9054 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/redux/OnboardingSaltPayState.kt @@ -121,6 +121,7 @@ enum class SaltPayActivationStep { KycReject, Claim, ClaimInProgress, + ClaimSuccess, Success, Finished; } \ No newline at end of file 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 6552fbd9d5..4e6de08bef 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 @@ -142,7 +142,8 @@ internal class OnboardingSaltPayView( SaltPayActivationStep.KycReject -> handleKycReject() SaltPayActivationStep.Claim -> handleClaim(state) SaltPayActivationStep.ClaimInProgress -> handleClaim(state) - SaltPayActivationStep.Finished -> handleClaim(state) + SaltPayActivationStep.ClaimSuccess -> handleClaim(state) + SaltPayActivationStep.Success -> handleSuccess(state) } progressButton?.changeState(state.mainButtonState) } @@ -154,7 +155,7 @@ internal class OnboardingSaltPayView( } private fun handleNeedPin() = with(walletFragment.bindingSaltPay) { - toolbar.title = getString(R.string.onboarding_navbar_pin) + toolbar.title = getText(R.string.onboarding_navbar_pin) showOnlyView(pinCode.root) { progressButton = SaltPayProgressButton(pinCode.root) progressButton?.mainView?.isEnabled = false @@ -173,7 +174,7 @@ internal class OnboardingSaltPayView( } private fun handleCardRegistration() = with(walletFragment.bindingSaltPay) { - toolbar.title = getString(R.string.onboarding_navbar_register_wallet) + toolbar.title = getText(R.string.onboarding_navbar_register_wallet) showOnlyView(connectCard.root) { progressButton = SaltPayProgressButton(connectCard.root) connectCard.btnConnect.setOnClickListener { @@ -183,7 +184,7 @@ internal class OnboardingSaltPayView( } private fun handleKycIntro() = with(walletFragment.bindingSaltPay) { - toolbar.title = getString(R.string.onboarding_navbar_kyc_start) + toolbar.title = getText(R.string.onboarding_navbar_kyc_start) showOnlyView(verifyIdentity.root) { progressButton = SaltPayProgressButton(verifyIdentity.root) verifyIdentity.btnVerify.setOnClickListener { @@ -193,7 +194,7 @@ internal class OnboardingSaltPayView( } private fun handleKycStart(state: OnboardingSaltPayState) = with(walletFragment.bindingSaltPay) { - toolbar.title = getString(R.string.onboarding_navbar_kyc_start) + toolbar.title = getText(R.string.onboarding_navbar_kyc_start) showOnlyView(webvVerifyIdentity) { progressButton = null webvVerifyIdentity.configureSettings() @@ -210,19 +211,19 @@ internal class OnboardingSaltPayView( } private fun handleKycWaiting() = with(walletFragment.bindingSaltPay.kycInProgress) { - toolbar.title = getString(R.string.onboarding_navbar_kyc_progress) + toolbar.title = getText(R.string.onboarding_navbar_kyc_progress) showOnlyView(root) imvInProgress.setDrawable(R.drawable.ic_in_progress) - tvHeader.text = getString(R.string.onboarding_title_kyc_waiting) - tvBody.text = getString(R.string.onboarding_subtitle_kyc_waiting) + tvHeader.text = getText(R.string.onboarding_title_kyc_waiting) + tvBody.text = getText(R.string.onboarding_subtitle_kyc_waiting) btnOpenSupportChat.hide() btnOpenSupportChat.setOnClickListener { store.dispatch(GlobalAction.OpenChat(SupportInfo())) } - btnKycAction.text = getString(R.string.onboarding_button_kyc_waiting) + btnKycAction.text = getText(R.string.onboarding_button_kyc_waiting) btnKycAction.setOnClickListener { store.dispatch(OnboardingSaltPayAction.Update) } @@ -230,15 +231,15 @@ internal class OnboardingSaltPayView( } private fun handleKycReject() = with(walletFragment.bindingSaltPay.kycInProgress) { - toolbar.title = getString(R.string.onboarding_navbar_kyc_progress) + toolbar.title = getText(R.string.onboarding_navbar_kyc_progress) showOnlyView(root) imvInProgress.setDrawable(R.drawable.ic_reject) - tvHeader.text = getString(R.string.onboarding_title_kyc_retry) - tvBody.text = getString(R.string.onboarding_subtitle_kyc_retry) + tvHeader.text = getText(R.string.onboarding_title_kyc_retry) + tvBody.text = getText(R.string.onboarding_subtitle_kyc_retry) btnOpenSupportChat.hide() - btnKycAction.text = getString(R.string.onboarding_button_kyc_start) + btnKycAction.text = getText(R.string.onboarding_button_kyc_start) btnKycAction.setOnClickListener { store.dispatch(OnboardingSaltPayAction.Update) } @@ -246,7 +247,7 @@ internal class OnboardingSaltPayView( } private fun handleClaim(state: OnboardingSaltPayState) = with(walletFragment.bindingSaltPay) { - toolbar.title = getString(R.string.onboarding_navbar_claim) + toolbar.title = getText(R.string.onboarding_navbar_claim) val btnMain = actionContainer.btnContainer.findViewById(R.id.btn_main_action) val tvHeader = actionContainer.tvHeader val tvBody = actionContainer.tvBody @@ -279,22 +280,27 @@ internal class OnboardingSaltPayView( SaltPayActivationStep.Claim -> { btnRefreshBalanceWidget.mainView.hide() claimValueString(state)?.let { - tvHeader.text = getString(R.string.onboarding_title_claim, it) + tvHeader.text = getText(R.string.onboarding_title_claim, it) } - tvBody.text = getString(R.string.onboarding_subtitle_claim) + tvBody.text = getText(R.string.onboarding_subtitle_claim) - btnMain.text = getString(R.string.onboarding_button_claim) + btnMain.text = getText(R.string.onboarding_button_claim) + btnMain.isEnabled btnMain.setOnClickListener { store.dispatch(OnboardingSaltPayAction.Claim) } + progressButton = SaltPayProgressButton(actionContainer.root) + progressButton?.isEnabled = true } SaltPayActivationStep.ClaimInProgress -> { btnRefreshBalanceWidget.mainView.show() - tvHeader.text = getString(R.string.onboarding_title_claim_progress) - tvBody.text = getString(R.string.onboarding_subtitle_claim_progress) - btnMain.text = getString(R.string.onboarding_button_claim) + tvHeader.text = getText(R.string.onboarding_title_claim_progress) + tvBody.text = getText(R.string.onboarding_subtitle_claim_progress) + btnMain.text = getText(R.string.onboarding_button_claim) + progressButton = SaltPayProgressButton(actionContainer.root) + progressButton?.isEnabled = false } - SaltPayActivationStep.Finished -> { + SaltPayActivationStep.ClaimSuccess -> { tvHeader.setText(R.string.common_success) tvBody.setText(R.string.onboarding_subtitle_success_claim) @@ -307,12 +313,19 @@ internal class OnboardingSaltPayView( btnRefreshBalanceWidget.mainView.setOnClickListener(null) updateConstraints(state.step, R.layout.lp_onboarding_done_activation) walletFragment.showConfetti(true) + progressButton = SaltPayProgressButton(actionContainer.root) + progressButton?.isEnabled = true } else -> {} } + } - // need to recreate after any step - progressButton = SaltPayProgressButton(actionContainer.root) + private fun handleSuccess(state: OnboardingSaltPayState) = with(walletFragment.binding) { + walletFragment.bindingSaltPay.onboardingSaltpayContainer.hide() + onboardingWalletContainer.show() + walletFragment.showSuccess() + tvBody.text = getText(R.string.onboarding_subtitle_success_tangem_wallet_onboarding) + layoutButtonsCommon.btnWalletMainAction.text = getText(R.string.onboarding_button_continue_wallet) } private fun tokenAmountString(state: OnboardingSaltPayState): String? { @@ -349,11 +362,11 @@ internal class OnboardingSaltPayView( view.show { onShowListener?.invoke() } } - private fun getString(@StringRes resId: Int): String { + private fun getText(@StringRes resId: Int): String { return walletFragment.getString(resId) } - private fun getString(@StringRes resId: Int, vararg formatArgs: Any?): String { + private fun getText(@StringRes resId: Int, vararg formatArgs: Any?): String { return walletFragment.getString(resId, *formatArgs) }