From 73b80b5ef9e88f7ea7c4505a5bcf746bee945210 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 19 Sep 2024 13:51:48 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../common/redux/global/GlobalMiddleware.kt | 33 ++++++++------- .../tap/common/redux/global/GlobalState.kt | 1 + .../tangem/tap/features/main/MainViewModel.kt | 12 ++++++ .../features/onboarding/OnboardingHelper.kt | 42 +++++++++++++++++++ .../note/redux/OnboardingNoteMiddleware.kt | 27 +++--------- .../twins/redux/TwinCardsMiddleware.kt | 28 +++---------- .../middlewares/TradeCryptoMiddleware.kt | 39 ++++++++++------- 7 files changed, 108 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt index 43d85d7fc5..65341daa53 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMiddleware.kt @@ -92,21 +92,24 @@ private fun handleAction(action: Action, appState: () -> AppState?) { scope.launch { exchangeManager.update() } } is GlobalAction.FetchUserCountry -> { - scope.launch { - // TODO("After adding DI") get dependencies by DI - runCatching { store.state.featureRepositoryProvider.homeRepository.getUserCountryCode() } - .onSuccess { - store.dispatchOnMain( - GlobalAction.FetchUserCountry.Success(countryCode = it.code.lowercase()), - ) - } - .onFailure { - store.dispatchOnMain( - GlobalAction.FetchUserCountry.Success( - countryCode = Locale.getDefault().country.lowercase(), - ), - ) - } + val homeFeatureToggles = store.inject(DaggerGraphState::homeFeatureToggles) + + if (!homeFeatureToggles.isMigrateUserCountryCodeEnabled) { + scope.launch { + runCatching { store.state.featureRepositoryProvider.homeRepository.getUserCountryCode() } + .onSuccess { + store.dispatchOnMain( + GlobalAction.FetchUserCountry.Success(countryCode = it.code.lowercase()), + ) + } + .onFailure { + store.dispatchOnMain( + GlobalAction.FetchUserCountry.Success( + countryCode = Locale.getDefault().country.lowercase(), + ), + ) + } + } } } } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt index 420951087b..86573ec741 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt @@ -23,6 +23,7 @@ data class GlobalState( val scanCardFailsCounter: Int = 0, val dialog: StateDialog? = null, val exchangeManager: CurrencyExchangeManager = CurrencyExchangeManager.dummy(), + @Deprecated("Use GetUserCountryCodeUseCase instead") val userCountryCode: String? = null, val appThemeMode: AppThemeMode = AppThemeMode.DEFAULT, ) : StateType diff --git a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt index 6ba358cced..2fc52d0c05 100644 --- a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt @@ -16,11 +16,13 @@ import com.tangem.domain.balancehiding.UpdateBalanceHidingSettingsUseCase import com.tangem.domain.feedback.FeedbackManagerFeatureToggles import com.tangem.domain.settings.DeleteDeprecatedLogsUseCase import com.tangem.domain.settings.IncrementAppLaunchCounterUseCase +import com.tangem.domain.settings.usercountry.FetchUserCountryUseCase import com.tangem.domain.staking.FetchStakingTokensUseCase import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.features.staking.api.featuretoggles.StakingFeatureToggles import com.tangem.tap.common.extensions.setContext +import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles import com.tangem.tap.features.main.model.MainScreenState import com.tangem.tap.store import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -47,6 +49,8 @@ internal class MainViewModel @Inject constructor( stakingFeatureToggles: StakingFeatureToggles, private val fetchStakingTokensUseCase: FetchStakingTokensUseCase, private val apiConfigsManager: ApiConfigsManager, + private val homeFeatureToggles: HomeFeatureToggles, + private val fetchUserCountryUseCase: FetchUserCountryUseCase, getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, ) : ViewModel(), MainIntents { @@ -67,6 +71,14 @@ internal class MainViewModel @Inject constructor( viewModelScope.launch(dispatchers.main) { incrementAppLaunchCounterUseCase() } + if (homeFeatureToggles.isMigrateUserCountryCodeEnabled) { + viewModelScope.launch { + fetchUserCountryUseCase().onLeft { + Timber.e("Unable to fetch the user country code $it") + } + } + } + updateAppCurrencies() observeFlips() displayBalancesHidingStatusToast() diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index bc085c6dca..130eddc672 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -1,22 +1,31 @@ package com.tangem.tap.features.onboarding +import com.tangem.blockchain.common.WalletManager import com.tangem.common.doOnFailure import com.tangem.common.doOnSuccess import com.tangem.common.extensions.guard import com.tangem.common.routing.AppRoute import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.models.Basic +import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.CardDTO import com.tangem.domain.models.scan.ProductType import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.settings.usercountry.models.UserCountry import com.tangem.domain.wallets.builder.UserWalletBuilder import com.tangem.domain.wallets.builder.UserWalletIdBuilder import com.tangem.tap.common.analytics.converters.ParamCardCurrencyConverter +import com.tangem.tap.common.analytics.events.AnalyticsParam +import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.extensions.* +import com.tangem.tap.common.redux.AppDialog +import com.tangem.tap.common.redux.global.GlobalState import com.tangem.tap.features.demo.DemoHelper +import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.saveWallet.redux.SaveWalletAction import com.tangem.tap.mainScope import com.tangem.tap.proxy.redux.DaggerGraphState @@ -138,6 +147,39 @@ object OnboardingHelper { } } + fun handleTopUpAction(walletManager: WalletManager, scanResponse: ScanResponse, globalState: GlobalState) { + val blockchain = walletManager.wallet.blockchain + val cryptoCurrency = CryptoCurrencyFactory().createCoin( + blockchain = blockchain, + extraDerivationPath = null, + derivationStyleProvider = scanResponse.derivationStyleProvider, + ) ?: return + + val topUpUrl = walletManager.getTopUpUrl(cryptoCurrency) ?: return + + val currencyType = AnalyticsParam.CurrencyType.Blockchain(blockchain) + Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType)) + + scope.launch { + val homeFeatureToggles = store.inject(DaggerGraphState::homeFeatureToggles) + + val isRussia = if (homeFeatureToggles.isMigrateUserCountryCodeEnabled) { + val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase) + + getUserCountryCodeUseCase().isRight { it is UserCountry.Russia } + } else { + globalState.userCountryCode == RUSSIA_COUNTRY_CODE + } + + if (isRussia) { + val dialogData = AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl) + store.dispatchDialogShow(AppDialog.RussianCardholdersWarningDialog(dialogData)) + } else { + store.dispatchOpenUrl(topUpUrl) + } + } + } + private suspend fun proceedWithScanResponse( scanResponse: ScanResponse, backupCardsIds: List?, diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt index 52af2f7d66..d47862a648 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/note/redux/OnboardingNoteMiddleware.kt @@ -4,12 +4,8 @@ import com.tangem.common.CompletionResult import com.tangem.common.extensions.guard import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.Analytics - -import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.domain.common.extensions.makePrimaryWalletManager import com.tangem.domain.common.extensions.withMainContext -import com.tangem.domain.common.util.derivationStyleProvider -import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.entities.ProgressState import com.tangem.tap.common.extensions.* @@ -20,7 +16,6 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapError import com.tangem.tap.domain.model.Currency import com.tangem.tap.features.demo.DemoHelper -import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.onboarding.OnboardingDialog import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.mainScope @@ -178,23 +173,11 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch return } - val blockchain = walletManager.wallet.blockchain - val cryptoCurrency = CryptoCurrencyFactory().createCoin( - blockchain, - null, - scanResponse.derivationStyleProvider, - ) ?: return - val topUpUrl = walletManager.getTopUpUrl(cryptoCurrency) ?: return - - val currencyType = AnalyticsParam.CurrencyType.Blockchain(blockchain) - Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType)) - - if (globalState.userCountryCode == RUSSIA_COUNTRY_CODE) { - val dialogData = AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl) - store.dispatchDialogShow(AppDialog.RussianCardholdersWarningDialog(dialogData)) - } else { - store.dispatchOpenUrl(topUpUrl) - } + OnboardingHelper.handleTopUpAction( + walletManager = walletManager, + scanResponse = scanResponse, + globalState = globalState, + ) } is OnboardingNoteAction.Done -> { store.dispatch(GlobalAction.Onboarding.Stop) 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 047a5caaa8..ef29db32d4 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 @@ -6,16 +6,12 @@ import com.tangem.common.extensions.guard import com.tangem.common.routing.AppRoute import com.tangem.common.routing.utils.popTo import com.tangem.core.analytics.Analytics - -import com.tangem.data.common.currency.CryptoCurrencyFactory import com.tangem.domain.common.extensions.makePrimaryWalletManager import com.tangem.domain.common.extensions.withMainContext -import com.tangem.domain.common.util.derivationStyleProvider import com.tangem.domain.common.util.twinsIsTwinned import com.tangem.domain.models.scan.ScanResponse import com.tangem.domain.wallets.builder.UserWalletIdBuilder import com.tangem.domain.wallets.legacy.asLockable -import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Onboarding import com.tangem.tap.common.entities.ProgressState import com.tangem.tap.common.extensions.* @@ -26,7 +22,6 @@ import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.domain.TapError import com.tangem.tap.domain.model.Currency import com.tangem.tap.domain.twins.TwinCardsManager -import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.features.onboarding.OnboardingDialog import com.tangem.tap.features.onboarding.OnboardingHelper import com.tangem.tap.mainScope @@ -301,24 +296,11 @@ private fun handle(action: Action, dispatch: DispatchFunction) { return } - val scanResponse = onboardingManager?.scanResponse ?: return - val blockchain = walletManager.wallet.blockchain - val cryptoCurrency = CryptoCurrencyFactory().createCoin( - blockchain, - null, - scanResponse.derivationStyleProvider, - ) ?: return - val topUpUrl = walletManager.getTopUpUrl(cryptoCurrency) ?: return - - val currencyType = AnalyticsParam.CurrencyType.Blockchain(blockchain) - Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType)) - - if (globalState.userCountryCode == RUSSIA_COUNTRY_CODE) { - val dialogData = AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl) - store.dispatchDialogShow(AppDialog.RussianCardholdersWarningDialog(dialogData)) - } else { - store.dispatchOpenUrl(topUpUrl) - } + OnboardingHelper.handleTopUpAction( + walletManager = walletManager, + scanResponse = onboardingManager?.scanResponse ?: return, + globalState = globalState, + ) } TwinCardsAction.Done -> { val scanResponse = getScanResponse() diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt index 1abdf861b9..2f26b2a39a 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/TradeCryptoMiddleware.kt @@ -5,6 +5,7 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.Analytics +import com.tangem.domain.settings.usercountry.models.UserCountry import com.tangem.domain.tokens.legacy.TradeCryptoAction import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.NetworkAddress @@ -70,16 +71,26 @@ object TradeCryptoMiddleware { isDarkTheme = MutableAppThemeModeHolder.isDarkThemeActive, ) - if (action.checkUserLocation && state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE) { - val dialogData = topUrl?.let { - AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl = it) - } - store.dispatchDialogShow(AppDialog.RussianCardholdersWarningDialog(data = dialogData)) - return - } + scope.launch { + val homeFeatureToggles = store.inject(DaggerGraphState::homeFeatureToggles) - if (currency is CryptoCurrency.Token && currency.network.isTestnet) { - scope.launch { + val isRussia = if (homeFeatureToggles.isMigrateUserCountryCodeEnabled) { + val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase) + + getUserCountryCodeUseCase().isRight { it is UserCountry.Russia } + } else { + state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE + } + + if (action.checkUserLocation && isRussia) { + val dialogData = topUrl?.let { + AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl = it) + } + store.dispatchDialogShow(AppDialog.RussianCardholdersWarningDialog(data = dialogData)) + return@launch + } + + if (currency is CryptoCurrency.Token && currency.network.isTestnet) { val walletManager = store.inject(DaggerGraphState::walletManagersFacade) .getOrCreateWalletManager( userWalletId = action.userWallet.walletId, @@ -97,13 +108,13 @@ object TradeCryptoMiddleware { walletManager = walletManager, destinationAddress = currency.contractAddress, ) + return@launch } - return - } - topUrl?.let { - store.dispatchOpenUrl(it) - Analytics.send(Token.Topup.ScreenOpened()) + topUrl?.let { + store.dispatchOpenUrl(it) + Analytics.send(Token.Topup.ScreenOpened()) + } } }