diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index 2e99af7238..439833b6dc 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -35,7 +35,6 @@ import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles import com.tangem.features.onramp.OnrampFeatureToggles import com.tangem.tap.common.log.TangemAppLoggerInitializer import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles -import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles import com.tangem.tap.proxy.AppStateHolder import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.hilt.EntryPoint @@ -112,8 +111,6 @@ interface ApplicationEntryPoint { fun getTransactionSignerFactory(): TransactionSignerFactory - fun getHomeFeatureToggles(): HomeFeatureToggles - fun getGetUserCountryCodeUseCase(): GetUserCountryUseCase fun getOnrampFeatureToggles(): OnrampFeatureToggles diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index a118c8e072..db0d4da929 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -57,7 +57,6 @@ import com.tangem.tap.common.redux.AppState import com.tangem.tap.common.redux.appReducer import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles import com.tangem.tap.domain.tasks.product.DerivationsFinder -import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles import com.tangem.tap.proxy.AppStateHolder import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.utils.coroutines.CoroutineDispatcherProvider @@ -177,9 +176,6 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { private val transactionSignerFactory: TransactionSignerFactory get() = entryPoint.getTransactionSignerFactory() - private val homeFeatureToggles: HomeFeatureToggles - get() = entryPoint.getHomeFeatureToggles() - private val getUserCountryUseCase: GetUserCountryUseCase get() = entryPoint.getGetUserCountryCodeUseCase() @@ -272,7 +268,6 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { shareManager = shareManager, appRouter = appRouter, transactionSignerFactory = transactionSignerFactory, - homeFeatureToggles = homeFeatureToggles, getUserCountryUseCase = getUserCountryUseCase, onrampFeatureToggles = onrampFeatureToggles, environmentConfigStorage = environmentConfigStorage, diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt index 4fed318b36..04d6fa4896 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/AppState.kt @@ -1,8 +1,5 @@ package com.tangem.tap.common.redux -import com.tangem.domain.redux.DomainState -import com.tangem.domain.redux.domainStore -import com.tangem.domain.redux.global.NetworkServices import com.tangem.tap.common.redux.global.GlobalMiddleware import com.tangem.tap.common.redux.global.GlobalState import com.tangem.tap.common.redux.legacy.LegacyMiddleware @@ -28,7 +25,6 @@ import com.tangem.tap.features.welcome.redux.WelcomeMiddleware import com.tangem.tap.features.welcome.redux.WelcomeState import com.tangem.tap.proxy.redux.DaggerGraphMiddleware import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider import org.rekotlin.Middleware import org.rekotlin.StateType @@ -46,18 +42,6 @@ data class AppState( val daggerGraphState: DaggerGraphState = DaggerGraphState(), ) : StateType { - private val domainState: DomainState - get() = domainStore.state - - private val domainNetworks: NetworkServices - get() = domainState.globalState.networkServices - - val featureRepositoryProvider: FeatureRepositoryProvider - get() = FeatureRepositoryProvider( - tangemTechApi = domainNetworks.tangemTechService.api, - dispatchers = AppCoroutineDispatcherProvider(), - ) - companion object { fun getMiddleware(): List> { return listOf( diff --git a/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryProvider.kt b/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryProvider.kt deleted file mode 100644 index 55e4c0b653..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/FeatureRepositoryProvider.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.tangem.tap.common.redux - -import com.tangem.datasource.api.tangemTech.TangemTechApi -import com.tangem.tap.features.home.data.HomeRepositoryImpl -import com.tangem.tap.features.home.domain.HomeRepository -import com.tangem.utils.coroutines.CoroutineDispatcherProvider - -class FeatureRepositoryProvider(tangemTechApi: TangemTechApi, dispatchers: CoroutineDispatcherProvider) { - - val homeRepository: HomeRepository = HomeRepositoryImpl(tangemTechApi, dispatchers) -} \ No newline at end of file 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 740f5bd460..87fae53bc3 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 @@ -82,8 +82,4 @@ sealed class GlobalAction : Action { object Update : GlobalAction() } - - object FetchUserCountry : GlobalAction() { - data class Success(val countryCode: String) : GlobalAction() - } } \ No newline at end of file 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 b8865305c5..e7f1d6613d 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 @@ -25,7 +25,6 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import org.rekotlin.Action import org.rekotlin.Middleware -import java.util.Locale object GlobalMiddleware { val handler = globalMiddlewareHandler @@ -87,27 +86,6 @@ private fun handleAction(action: Action, appState: () -> AppState?) { } scope.launch { exchangeManager.update() } } - is GlobalAction.FetchUserCountry -> { - 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/GlobalReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt index d55f99d21b..c05d9bbc89 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt @@ -1,7 +1,5 @@ package com.tangem.tap.common.redux.global -import com.tangem.domain.redux.domainStore -import com.tangem.domain.redux.global.DomainGlobalAction import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.onboarding.OnboardingManager import com.tangem.tap.proxy.AppStateHolder @@ -38,7 +36,6 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde } is GlobalAction.SaveScanResponse -> { appStateHolder.scanResponse = action.scanResponse - domainStore.dispatch(DomainGlobalAction.SaveScanNoteResponse(action.scanResponse)) globalState.copy(scanResponse = action.scanResponse) } is GlobalAction.ChangeAppCurrency -> { @@ -77,9 +74,6 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde } is GlobalAction.SetIfCardVerifiedOnline -> globalState.copy(cardVerifiedOnline = action.verified) - is GlobalAction.FetchUserCountry.Success -> { - globalState.copy(userCountryCode = action.countryCode) - } else -> globalState } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/data/HomeRepositoryImpl.kt b/app/src/main/java/com/tangem/tap/features/home/data/HomeRepositoryImpl.kt deleted file mode 100644 index fed3f2e394..0000000000 --- a/app/src/main/java/com/tangem/tap/features/home/data/HomeRepositoryImpl.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.tangem.tap.features.home.data - -import com.tangem.datasource.api.tangemTech.TangemTechApi -import com.tangem.datasource.api.tangemTech.models.GeoResponse -import com.tangem.tap.features.home.domain.HomeRepository -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.coroutines.withContext - -/** - * Implementation of repository for Home feature - * - * @property tangemTechApi API for server requests - * @property dispatchers coroutine dispatcher provider - */ -class HomeRepositoryImpl( - private val tangemTechApi: TangemTechApi, - private val dispatchers: CoroutineDispatcherProvider, -) : HomeRepository { - - override suspend fun getUserCountryCode(): GeoResponse = withContext(dispatchers.io) { - tangemTechApi.getUserCountryCode() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/domain/HomeRepository.kt b/app/src/main/java/com/tangem/tap/features/home/domain/HomeRepository.kt deleted file mode 100644 index ad489ae0fe..0000000000 --- a/app/src/main/java/com/tangem/tap/features/home/domain/HomeRepository.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.tangem.tap.features.home.domain - -import com.tangem.datasource.api.tangemTech.models.GeoResponse - -/** Repository for Home feature */ -interface HomeRepository { - - /** Get user's country code */ - suspend fun getUserCountryCode(): GeoResponse -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt b/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt deleted file mode 100644 index 55ebe3e10d..0000000000 --- a/app/src/main/java/com/tangem/tap/features/home/featuretoggles/HomeFeatureToggles.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tangem.tap.features.home.featuretoggles - -import com.tangem.core.configtoggle.feature.FeatureTogglesManager -import javax.inject.Inject - -class HomeFeatureToggles @Inject constructor( - private val featureTogglesManager: FeatureTogglesManager, -) { - - val isMigrateUserCountryCodeEnabled: Boolean - get() = featureTogglesManager.isFeatureEnabled(name = "MIGRATE_USER_COUNTRY_CODE_ENABLED") -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 87a615ef97..ffe384bee5 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -53,7 +53,6 @@ private fun handleHomeAction(action: Action) { store.dispatch(GlobalAction.RestoreAppCurrency) store.dispatch(GlobalAction.ExchangeManager.Init) - store.dispatch(GlobalAction.FetchUserCountry) } is HomeAction.ReadCard -> { action.scope.launch { 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 d4f05a284a..1bc9c4dd87 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 @@ -18,7 +18,6 @@ import com.tangem.domain.settings.usercountry.FetchUserCountryUseCase import com.tangem.domain.staking.FetchStakingTokensUseCase import com.tangem.domain.wallets.legacy.UserWalletsListManager 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.utils.coroutines.CoroutineDispatcherProvider import dagger.hilt.android.lifecycle.HiltViewModel @@ -41,7 +40,6 @@ internal class MainViewModel @Inject constructor( private val dispatchers: CoroutineDispatcherProvider, private val fetchStakingTokensUseCase: FetchStakingTokensUseCase, private val apiConfigsManager: ApiConfigsManager, - homeFeatureToggles: HomeFeatureToggles, private val fetchUserCountryUseCase: FetchUserCountryUseCase, getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase, ) : ViewModel(), MainIntents { @@ -63,11 +61,9 @@ 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") - } + viewModelScope.launch { + fetchUserCountryUseCase().onLeft { + Timber.e("Unable to fetch the user country code $it") } } 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 7ab791d0b4..bf36d9a031 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 @@ -22,11 +22,9 @@ 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.onboarding.products.wallet.redux.OnboardingWalletAction import com.tangem.tap.features.onboarding.products.wallet.redux.BackupStartedSource +import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletAction import com.tangem.tap.features.saveWallet.redux.SaveWalletAction import com.tangem.tap.mainScope import com.tangem.tap.proxy.redux.DaggerGraphState @@ -50,7 +48,7 @@ object OnboardingHelper { if (!response.twinsIsTwinned()) { true } else { - onboardingManager.isActivationInProgress(cardId) ?: false + onboardingManager.isActivationInProgress(cardId) } } @@ -62,7 +60,7 @@ object OnboardingHelper { emptyWallets || activationInProgress || isNoBackup } - response.card.wallets.isNotEmpty() -> onboardingManager.isActivationInProgress(cardId) ?: false + response.card.wallets.isNotEmpty() -> onboardingManager.isActivationInProgress(cardId) else -> true } } @@ -222,7 +220,7 @@ object OnboardingHelper { } } - fun handleTopUpAction(walletManager: WalletManager, scanResponse: ScanResponse, globalState: GlobalState) { + fun handleTopUpAction(walletManager: WalletManager, scanResponse: ScanResponse) { val blockchain = walletManager.wallet.blockchain val excludedBlockchains = store.inject(DaggerGraphState::excludedBlockchains) @@ -238,15 +236,8 @@ object OnboardingHelper { 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 - } + val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase) + val isRussia = getUserCountryCodeUseCase().isRight { it is UserCountry.Russia } if (isRussia) { val dialogData = AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl) 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 d47862a648..99c704189c 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 @@ -176,7 +176,6 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch OnboardingHelper.handleTopUpAction( walletManager = walletManager, scanResponse = scanResponse, - globalState = globalState, ) } is OnboardingNoteAction.Done -> { 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 ef29db32d4..37ecb6d41f 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 @@ -299,7 +299,6 @@ private fun handle(action: Action, dispatch: DispatchFunction) { OnboardingHelper.handleTopUpAction( walletManager = walletManager, scanResponse = onboardingManager?.scanResponse ?: return, - globalState = globalState, ) } TwinCardsAction.Done -> { 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 7c99d07e6e..0f69711e27 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 @@ -17,7 +17,6 @@ import com.tangem.tap.common.extensions.* import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.common.redux.AppState import com.tangem.tap.features.demo.DemoHelper -import com.tangem.tap.features.home.RUSSIA_COUNTRY_CODE import com.tangem.tap.network.exchangeServices.CurrencyExchangeManager import com.tangem.tap.network.exchangeServices.buyErc20TestnetTokens import com.tangem.tap.proxy.redux.DaggerGraphState @@ -26,7 +25,6 @@ import com.tangem.tap.store import kotlinx.coroutines.launch import org.rekotlin.Middleware -@Suppress("LargeClass") @Deprecated("Will be removed soon") object TradeCryptoMiddleware { @@ -41,25 +39,24 @@ object TradeCryptoMiddleware { } } - @Suppress("LongMethod", "CyclomaticComplexMethod") private fun handle(state: () -> AppState?, action: TradeCryptoAction) { if (DemoHelper.tryHandle(state, action)) return when (action) { is TradeCryptoAction.FinishSelling -> openReceiptUrl(action.transactionId) - is TradeCryptoAction.Buy -> proceedBuyAction(state, action) + is TradeCryptoAction.Buy -> proceedBuyAction(action) is TradeCryptoAction.Sell -> proceedSellAction(action) is TradeCryptoAction.SendToken -> handleNewSendToken(action = action) is TradeCryptoAction.SendCoin -> handleNewSendCoin(action = action) } } - private fun proceedBuyAction(state: () -> AppState?, action: TradeCryptoAction.Buy) { + private fun proceedBuyAction(action: TradeCryptoAction.Buy) { val isOnrampEnabled = store.inject(DaggerGraphState::onrampFeatureToggles).isFeatureEnabled if (isOnrampEnabled) { proceedWithOnramp(action.userWallet.walletId, action.cryptoCurrencyStatus.currency, action.source) } else { - proceedWithLegacyBuyAction(state, action) + proceedWithLegacyBuyAction(action) } } @@ -75,7 +72,7 @@ object TradeCryptoMiddleware { } } - private fun proceedWithLegacyBuyAction(state: () -> AppState?, action: TradeCryptoAction.Buy) { + private fun proceedWithLegacyBuyAction(action: TradeCryptoAction.Buy) { val networkAddress = action.cryptoCurrencyStatus.value.networkAddress ?.defaultAddress ?.let(NetworkAddress.Address::value) @@ -94,15 +91,9 @@ object TradeCryptoMiddleware { ) scope.launch { - val homeFeatureToggles = store.inject(DaggerGraphState::homeFeatureToggles) + val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase) - val isRussia = if (homeFeatureToggles.isMigrateUserCountryCodeEnabled) { - val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase) - - getUserCountryCodeUseCase().isRight { it is UserCountry.Russia } - } else { - state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE - } + val isRussia = getUserCountryCodeUseCase().isRight { it is UserCountry.Russia } if (action.checkUserLocation && isRussia) { val dialogData = topUrl?.let { diff --git a/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeViewModel.kt b/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeViewModel.kt index 0ecd71bd5d..592678f735 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeViewModel.kt @@ -130,6 +130,5 @@ internal class WelcomeViewModel @Inject constructor( private fun initGlobalState() { store.dispatch(GlobalAction.RestoreAppCurrency) store.dispatch(GlobalAction.ExchangeManager.Init) - store.dispatch(GlobalAction.FetchUserCountry) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt index 2fda147000..ac62d34a55 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt @@ -34,7 +34,6 @@ import com.tangem.features.staking.api.navigation.StakingRouter import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles import com.tangem.tap.domain.walletconnect2.domain.LegacyWalletConnectRepository import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor -import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles import com.tangem.tap.proxy.AppStateHolder import org.rekotlin.StateType @@ -68,7 +67,6 @@ data class DaggerGraphState( val appRouter: AppRouter? = null, val pushNotificationsRouter: PushNotificationsRouter? = null, val transactionSignerFactory: TransactionSignerFactory? = null, - val homeFeatureToggles: HomeFeatureToggles? = null, val getUserCountryUseCase: GetUserCountryUseCase? = null, val onrampFeatureToggles: OnrampFeatureToggles? = null, val environmentConfigStorage: EnvironmentConfigStorage? = null, diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json index a461c660b8..c7dc28c8b7 100644 --- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json @@ -11,10 +11,6 @@ "name": "IS_ETHEREUM_EIP_1559_ENABLED", "version": "5.17.0" }, - { - "name": "MIGRATE_USER_COUNTRY_CODE_ENABLED", - "version": "5.17.0" - }, { "name": "ONRAMP_ENABLED", "version": "5.19.0" diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechService.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechService.kt deleted file mode 100644 index 4c08c5ce73..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/TangemTechService.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.tangem.datasource.api.tangemTech - -import com.tangem.datasource.api.common.MoshiConverter -import com.tangem.datasource.api.common.response.ApiResponseCallAdapterFactory -import com.tangem.datasource.utils.RequestHeader -import com.tangem.datasource.utils.RequestHeader.AuthenticationHeader -import com.tangem.datasource.utils.RequestHeader.CacheControlHeader -import com.tangem.datasource.utils.addHeaders -import com.tangem.datasource.utils.addLoggers -import okhttp3.OkHttpClient -import retrofit2.Retrofit - -/** -[REDACTED_AUTHOR] - */ -// TODO("Remove after removing Redux") -@Deprecated("Use TangemTechApi") -object TangemTechService { - - var api: TangemTechApi = createApi() - private set - - private const val TANGEM_TECH_BASE_URL = "https://api.tangem-tech.com/v1/" - - fun addAuthenticationHeader(header: AuthenticationHeader) { - api = createApi(header) - } - - private fun createApi(header: RequestHeader? = null): TangemTechApi { - val headers = mutableListOf(CacheControlHeader).apply { header?.let(::add) } - return Retrofit.Builder() - .addConverterFactory(MoshiConverter.networkMoshiConverter) - .addCallAdapterFactory(ApiResponseCallAdapterFactory.create()) - .baseUrl(TANGEM_TECH_BASE_URL) - .client( - OkHttpClient.Builder() - .addHeaders(*headers.toTypedArray()) - .addLoggers() - .build(), - ) - .build() - .create(TangemTechApi::class.java) - } -} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/DomainState.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/DomainState.kt deleted file mode 100644 index 67be91d2dd..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/DomainState.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.tangem.domain.redux - -import com.tangem.domain.redux.global.DomainGlobalState -import org.rekotlin.StateType - -/** -[REDACTED_AUTHOR] - */ -data class DomainState(val globalState: DomainGlobalState = DomainGlobalState()) : StateType \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/DomainStore.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/DomainStore.kt deleted file mode 100644 index a141cd5f9a..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/DomainStore.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.tangem.domain.redux - -import com.tangem.domain.redux.global.DomainGlobalHub -import org.rekotlin.Action -import org.rekotlin.Store - -/** -[REDACTED_AUTHOR] - */ -private val RE_STORE_HUBS: List> = listOf(DomainGlobalHub()) - -val domainStore = Store( - state = DomainState(), - middleware = RE_STORE_HUBS.map { it.getMiddleware() }, - reducer = { action, state -> reduce(action, state) }, -) - -private fun reduce(action: Action, domainState: DomainState?): DomainState { - requireNotNull(domainState) - - // we can examine the store state after each change by reducer - var assembleReducedDomainState: DomainState = domainState - val reducedStatesByAction = mutableListOf>() - - RE_STORE_HUBS.forEach { - val reducedState = it.reduce(action, assembleReducedDomainState) - - assembleReducedDomainState = if (reducedState != assembleReducedDomainState) { - reducedStatesByAction.add(action to assembleReducedDomainState) - reducedState - } else { - assembleReducedDomainState - } - } - - return assembleReducedDomainState -} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/ReStoreHub.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/ReStoreHub.kt deleted file mode 100644 index fcef0871d2..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/ReStoreHub.kt +++ /dev/null @@ -1,112 +0,0 @@ -package com.tangem.domain.redux - -import android.webkit.ValueCallback -import com.tangem.domain.redux.global.DomainGlobalState -import com.tangem.utils.coroutines.FeatureCoroutineExceptionHandler -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.CoroutineName -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.asCoroutineDispatcher -import kotlinx.coroutines.job -import kotlinx.coroutines.launch -import org.rekotlin.Action -import org.rekotlin.DispatchFunction -import org.rekotlin.Middleware -import java.util.concurrent.Executors - -/** -[REDACTED_AUTHOR] - * ReStoreHub's should not store the or the , because this can lead to destabilization of - * a state behavior. - * All ReStoreHub's must be marked as internal - */ -internal interface ReStoreHub { - fun getMiddleware(): Middleware - fun reduce(action: Action, domainState: StoreState): StoreState -} - -internal interface ReStoreReducer { - fun reduceAction(action: Action, state: State): State -} - -/** - * ReStoreHub is the entry point for actions. It processes it through middleware and reducer. - * Actions handled by ReStoreHub go into coroutine scope, which can be canceled while the action is being processed. - * All action went from the middleware must be dispatched through ReStoreHub.dispatchOnMain(Actions) to prevent - * concurrent modification in the Store - * Only the changed hub State will change its state in the DomainState - * Do not implement other states like as DomainGlobalState. Because it can dilute the responsibility of - * states. - * @param name - name of the Hub - * @param dispatcher - main coroutine dispatcher for actions - * @property globalState - state witch produce accessibility to global variables - */ -internal abstract class BaseStoreHub( - private val name: String, - private val dispatcher: CoroutineDispatcher = Executors.newFixedThreadPool(1).asCoroutineDispatcher(), -) : ReStoreHub { - - val globalState: DomainGlobalState - get() = domainStore.state.globalState - - val hubScope = CoroutineScope( - Job() + dispatcher + CoroutineName(name) + FeatureCoroutineExceptionHandler.create(name), - ) - - private val actionsAndJobs = mutableMapOf() - - override fun getMiddleware(): Middleware { - return { dispatch, state -> - { next -> - { action -> - handle(state, action, dispatch) - next(action) - } - } - } - } - - /** - * Launches new coroutine and stores the action with it's coroutine job. (Coroutine can be cancelled - * through invoking the cancelActionJob() function inside a middleware). - * Removes the action when job is completed. - */ - protected open fun handle(storeStateHolder: () -> DomainState?, action: Action, dispatch: DispatchFunction) { - val storeState = storeStateHolder() - ?: throw UnsupportedOperationException("StoreState for the $name can't be NULL") - - hubScope.launch { - actionsAndJobs[action] = this.coroutineContext.job - actionsAndJobs[action]?.invokeOnCompletion { actionsAndJobs.remove(action) } - - handleAction(action, storeState) { - actionsAndJobs.remove(it)?.cancel() - } - } - } - - /** - * Reduce the action and check it. If the action hasn't updated the hubState, then it doesn't need to update - * storeState - */ - override fun reduce(action: Action, domainState: DomainState): DomainState { - val hubOldState = getHubState(domainState) - val hubNewState = getReducer().reduceAction(action, hubOldState) - return if (hubOldState === hubNewState) { - domainState - } else { - updateStoreState(domainState, hubNewState) - } - } - - protected fun cancelAll() { - actionsAndJobs.forEach { (_, job) -> job.cancel() } - } - - protected abstract suspend fun handleAction(action: Action, storeState: DomainState, cancel: ValueCallback) - protected abstract fun getReducer(): ReStoreReducer - - protected abstract fun getHubState(storeState: DomainState): State - protected abstract fun updateStoreState(storeState: DomainState, newHubState: State): DomainState -} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/extensions/Dispatch.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/extensions/Dispatch.kt deleted file mode 100644 index 36db6ef7ed..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/extensions/Dispatch.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tangem.domain.redux.extensions - -import com.tangem.domain.common.extensions.withMainContext -import com.tangem.domain.redux.domainStore -import org.rekotlin.Action - -/** -[REDACTED_AUTHOR] - */ -internal suspend inline fun dispatchOnMain(vararg actions: Action) { - withMainContext { actions.forEach { domainStore.dispatch(it) } } -} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalAction.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalAction.kt deleted file mode 100644 index 90bf41578e..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalAction.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tangem.domain.redux.global - -import com.tangem.domain.models.scan.ScanResponse -import org.rekotlin.Action - -/** -[REDACTED_AUTHOR] - */ -// TODO: refactoring: is alias for the GlobalAction -sealed class DomainGlobalAction : Action { - data class SaveScanNoteResponse(val scanResponse: ScanResponse) : DomainGlobalAction() -} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalHub.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalHub.kt deleted file mode 100644 index 18f081f8a7..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalHub.kt +++ /dev/null @@ -1,53 +0,0 @@ -package com.tangem.domain.redux.global - -import android.webkit.ValueCallback -import com.tangem.common.extensions.toHexString -import com.tangem.datasource.api.common.AuthProvider -import com.tangem.datasource.utils.RequestHeader -import com.tangem.domain.redux.BaseStoreHub -import com.tangem.domain.redux.DomainState -import com.tangem.domain.redux.ReStoreReducer -import org.rekotlin.Action - -/** -[REDACTED_AUTHOR] - */ -// TODO: refactoring: is alias for the GlobalMiddleware and the GlobalReducer -internal class DomainGlobalHub : BaseStoreHub("DomainGlobalHub") { - - override fun getHubState(storeState: DomainState): DomainGlobalState { - return storeState.globalState - } - - override fun updateStoreState(storeState: DomainState, newHubState: DomainGlobalState): DomainState { - return storeState.copy(globalState = newHubState) - } - - override suspend fun handleAction(action: Action, storeState: DomainState, cancel: ValueCallback) { - if (action !is DomainGlobalAction) return - } - - override fun getReducer(): ReStoreReducer = DomainGlobalReducer() -} - -private class DomainGlobalReducer : ReStoreReducer { - - override fun reduceAction(action: Action, state: DomainGlobalState): DomainGlobalState { - return when (action) { - is DomainGlobalAction.SaveScanNoteResponse -> { - val card = action.scanResponse.card - // TODO: AuthHeaders: try to remove it, because now we can use headers with dynamic values - state.networkServices.tangemTechService.addAuthenticationHeader( - RequestHeader.AuthenticationHeader( - object : AuthProvider { - override fun getCardPublicKey(): String = card.cardPublicKey.toHexString() - override fun getCardId(): String = card.cardId - }, - ), - ) - state.copy(scanResponse = action.scanResponse) - } - else -> state - } - } -} \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalState.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalState.kt deleted file mode 100644 index bd6efc230c..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/global/DomainGlobalState.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.tangem.domain.redux.global - -import com.tangem.datasource.api.tangemTech.TangemTechService -import com.tangem.domain.models.scan.ScanResponse - -/** -[REDACTED_AUTHOR] - */ -data class DomainGlobalState( - // there is a part of mirrors from the GlobalState. - // It updates on GlobalAction.SaveScanNoteResponse -> DomainGlobalAction.SaveScanNoteResponse(scanResponse) - val scanResponse: ScanResponse? = null, - // - val networkServices: NetworkServices = NetworkServices(), -) - -data class NetworkServices( - val tangemTechService: TangemTechService = TangemTechService, -) \ No newline at end of file