From 5cef4d684f5cfbf8b41f00ef0e432f00ea22dd52 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 21 Apr 2026 18:22:32 +0400 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 1 - app/libs/rekotlin-1.0.4.jar | Bin 33612 -> 0 bytes .../com/tangem/tap/ApplicationEntryPoint.kt | 99 ---------- .../java/com/tangem/tap/TangemApplication.kt | 176 ------------------ .../com/tangem/tap/common/extensions/Store.kt | 62 ------ .../AccessCodeRequestPolicyMiddleware.kt | 33 ---- .../com/tangem/tap/common/redux/AppReducer.kt | 18 -- .../com/tangem/tap/common/redux/AppState.kt | 24 --- .../redux/LockUserWalletsTimerMiddleware.kt | 15 -- .../tangem/tap/common/redux/LogMiddleware.kt | 16 -- .../tap/common/redux/global/GlobalAction.kt | 11 -- .../tap/common/redux/global/GlobalReducer.kt | 18 -- .../tap/common/redux/global/GlobalState.kt | 14 -- .../com/tangem/tap/di/AppStateHolderModule.kt | 18 -- .../com/tangem/tap/domain/TapWalletManager.kt | 54 ------ .../com/tangem/tap/domain/model/Currency.kt | 5 +- .../tap/features/demo/DemoMiddleware.kt | 12 -- .../com/tangem/tap/proxy/AppStateHolder.kt | 33 ---- .../com/tangem/tap/proxy/di/ProxyModule.kt | 19 -- .../tap/proxy/redux/DaggerGraphAction.kt | 13 -- .../tap/proxy/redux/DaggerGraphMiddleware.kt | 13 -- .../tap/proxy/redux/DaggerGraphReducer.kt | 21 --- .../tap/proxy/redux/DaggerGraphState.kt | 78 -------- core/navigation/build.gradle.kts | 1 - domain/legacy/build.gradle.kts | 1 - .../tangem/domain/redux/ReduxStateHolder.kt | 13 -- domain/tokens/build.gradle.kts | 1 - features/details/impl/build.gradle.kts | 1 - features/manage-tokens/impl/build.gradle.kts | 1 - features/onramp/impl/build.gradle.kts | 1 - features/tokendetails/impl/build.gradle.kts | 1 - .../wallet-settings/impl/build.gradle.kts | 1 - features/wallet/impl/build.gradle.kts | 1 - gradle/dependencies.toml | 2 - 34 files changed, 2 insertions(+), 775 deletions(-) delete mode 100644 app/libs/rekotlin-1.0.4.jar delete mode 100644 app/src/main/java/com/tangem/tap/common/extensions/Store.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/AccessCodeRequestPolicyMiddleware.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/AppState.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/LockUserWalletsTimerMiddleware.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt delete mode 100644 app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt delete mode 100644 app/src/main/java/com/tangem/tap/di/AppStateHolderModule.kt delete mode 100644 app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt delete mode 100644 app/src/main/java/com/tangem/tap/features/demo/DemoMiddleware.kt delete mode 100644 app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt delete mode 100644 app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt delete mode 100644 app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt delete mode 100644 app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphMiddleware.kt delete mode 100644 app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt delete mode 100644 app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt delete mode 100644 domain/legacy/src/main/java/com/tangem/domain/redux/ReduxStateHolder.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6f398fb14f..8bc51a5ecd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -394,7 +394,6 @@ dependencies { implementation(deps.viewBindingDelegate) implementation(deps.armadillo) implementation(deps.kotlin.serialization) - implementation(deps.reKotlin) implementation(deps.reownCore) implementation(deps.reownWeb3) implementation(deps.prettyLogger) diff --git a/app/libs/rekotlin-1.0.4.jar b/app/libs/rekotlin-1.0.4.jar deleted file mode 100644 index 3221e554bec48e962f07ac64728e414a2a3a5820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33612 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 diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index b8b0a9e92e..47d5f23ab4 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -2,156 +2,57 @@ package com.tangem.tap import androidx.hilt.work.HiltWorkerFactory import com.tangem.TangemSdkLogger -import com.tangem.blockchainsdk.BlockchainSDKFactory -import com.tangem.blockchainsdk.utils.ExcludedBlockchains -import com.tangem.common.routing.AppRouter import com.tangem.core.abtests.manager.ABTestsManager import com.tangem.core.analytics.filter.OneTimeEventFilter import com.tangem.core.analytics.paramsinterceptor.SendTransactionSignerInfoInterceptor -import com.tangem.core.analytics.utils.TrackingContextProxy import com.tangem.core.configtoggle.blockchain.ExcludedBlockchainsManager import com.tangem.core.configtoggle.feature.FeatureTogglesManager -import com.tangem.core.decompose.di.GlobalUiMessageSender -import com.tangem.core.decompose.ui.UiMessageSender -import com.tangem.core.navigation.settings.SettingsManager -import com.tangem.core.navigation.share.ShareManager -import com.tangem.core.navigation.url.UrlOpener -import com.tangem.core.ui.clipboard.ClipboardManager -import com.tangem.data.card.TransactionSignerFactory import com.tangem.datasource.api.common.config.managers.ApiConfigsManager -import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.datasource.local.config.environment.EnvironmentConfig -import com.tangem.datasource.local.config.issuers.IssuersConfigStorage import com.tangem.datasource.local.logs.AppLogsStore -import com.tangem.datasource.local.preferences.AppPreferencesStore -import com.tangem.domain.appcurrency.repository.AppCurrencyRepository import com.tangem.domain.apptheme.GetAppThemeModeUseCase -import com.tangem.domain.apptheme.repository.AppThemeModeRepository -import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository -import com.tangem.domain.card.ScanCardProcessor -import com.tangem.domain.card.ScanFailsRequester -import com.tangem.domain.card.repository.CardRepository -import com.tangem.domain.common.wallets.UserWalletsListRepository -import com.tangem.domain.feedback.GetWalletMetaInfoUseCase -import com.tangem.domain.feedback.SendFeedbackEmailUseCase -import com.tangem.domain.onboarding.SaveTwinsOnboardingShownUseCase -import com.tangem.domain.onboarding.WasTwinsOnboardingShownUseCase -import com.tangem.domain.onboarding.repository.OnboardingRepository -import com.tangem.domain.settings.repositories.SettingsRepository import com.tangem.domain.walletconnect.usecase.initialize.WcInitializeUseCase -import com.tangem.domain.walletmanager.WalletManagersFacade -import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.repository.WalletsRepository -import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles -import com.tangem.hot.sdk.TangemHotSdk import com.tangem.tap.common.analytics.handlers.BlockchainExceptionHandler import com.tangem.tap.common.analytics.handlers.appsflyer.AppsFlyerClient import com.tangem.tap.common.log.TangemAppLoggerInitializer -import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles -import com.tangem.tap.proxy.AppStateHolder import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent @EntryPoint @InstallIn(SingletonComponent::class) -@Suppress("TooManyFunctions") interface ApplicationEntryPoint { - fun getAppStateHolder(): AppStateHolder - - fun getIssuersConfigStorage(): IssuersConfigStorage - fun getEnvironmentConfig(): EnvironmentConfig fun getFeatureTogglesManager(): FeatureTogglesManager fun getExcludedBlockchainsManager(): ExcludedBlockchainsManager - fun getNetworkConnectionManager(): NetworkConnectionManager - - fun getCardScanningFeatureToggles(): CardScanningFeatureToggles - - fun getScanCardProcessor(): ScanCardProcessor - - fun getAppCurrencyRepository(): AppCurrencyRepository - - fun getWalletManagersFacade(): WalletManagersFacade - - fun getAppThemeModeRepository(): AppThemeModeRepository - - fun getBalanceHidingRepository(): BalanceHidingRepository - - fun getAppPreferencesStore(): AppPreferencesStore - fun getGetAppThemeModeUseCase(): GetAppThemeModeUseCase fun getWalletsRepository(): WalletsRepository fun getOneTimeEventFilter(): OneTimeEventFilter - fun getWasTwinsOnboardingShownUseCase(): WasTwinsOnboardingShownUseCase - - fun getSaveTwinsOnboardingShownUseCase(): SaveTwinsOnboardingShownUseCase - - fun getCardRepository(): CardRepository - fun getTangemSdkLogger(): TangemSdkLogger - fun getSettingsRepository(): SettingsRepository - - fun getBlockchainSDKFactory(): BlockchainSDKFactory - - fun getSendFeedbackEmailUseCase(): SendFeedbackEmailUseCase - - fun getWalletMetaInfoUseCase(): GetWalletMetaInfoUseCase - - fun getUrlOpener(): UrlOpener - - fun getShareManager(): ShareManager - - fun getAppRouter(): AppRouter - fun getTangemAppLogger(): TangemAppLoggerInitializer - fun getTransactionSignerFactory(): TransactionSignerFactory - - fun getOnboardingV2FeatureToggles(): OnboardingV2FeatureToggles - - fun getOnboardingRepository(): OnboardingRepository - - fun getExcludedBlockchains(): ExcludedBlockchains - fun getAppLogsStore(): AppLogsStore - fun getClipboardManager(): ClipboardManager - - fun getSettingsManager(): SettingsManager - fun getBlockchainExceptionHandler(): BlockchainExceptionHandler - @GlobalUiMessageSender - fun getUiMessageSender(): UiMessageSender - fun getWorkerFactory(): HiltWorkerFactory - fun getColdUserWalletBuilderFactory(): ColdUserWalletBuilder.Factory - fun getApiConfigsManager(): ApiConfigsManager - fun getUserWalletsListRepository(): UserWalletsListRepository - - fun getTangemHotSdk(): TangemHotSdk - fun getWcInitializeUseCase(): WcInitializeUseCase - fun getTrackingContextProxy(): TrackingContextProxy - fun getABTestsManager(): ABTestsManager fun getAppsFlyerClientFactory(): AppsFlyerClient.Factory - fun getScanFailsRequester(): ScanFailsRequester - fun getSendTransactionSignerInfoInterceptor(): SendTransactionSignerInfoInterceptor } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index ba43027039..61c9e07c43 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -13,46 +13,22 @@ import com.tangem.Log import com.tangem.TangemSdkLogger import com.tangem.blockchain.common.ExceptionHandler import com.tangem.blockchain.network.BlockchainSdkRetrofitBuilder -import com.tangem.blockchainsdk.BlockchainSDKFactory -import com.tangem.blockchainsdk.utils.ExcludedBlockchains -import com.tangem.common.routing.AppRouter import com.tangem.core.abtests.manager.ABTestsManager import com.tangem.core.analytics.Analytics import com.tangem.core.analytics.filter.AppsFlyerEventFilter import com.tangem.core.analytics.filter.OneTimeEventFilter import com.tangem.core.configtoggle.blockchain.ExcludedBlockchainsManager import com.tangem.core.configtoggle.feature.FeatureTogglesManager -import com.tangem.core.decompose.ui.UiMessageSender -import com.tangem.core.navigation.settings.SettingsManager -import com.tangem.core.ui.clipboard.ClipboardManager -import com.tangem.data.card.TransactionSignerFactory import com.tangem.datasource.api.common.MoshiConverter import com.tangem.datasource.api.common.config.managers.ApiConfigsManager import com.tangem.datasource.api.common.createNetworkLoggingInterceptor -import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.datasource.local.config.environment.EnvironmentConfig -import com.tangem.datasource.local.config.issuers.IssuersConfigStorage import com.tangem.datasource.local.logs.AppLogsStore -import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.utils.NetworkLogsSaveInterceptor import com.tangem.datasource.utils.WireMockRedirectInterceptor -import com.tangem.domain.appcurrency.repository.AppCurrencyRepository import com.tangem.domain.apptheme.GetAppThemeModeUseCase -import com.tangem.domain.apptheme.repository.AppThemeModeRepository -import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository -import com.tangem.domain.card.ScanCardProcessor -import com.tangem.domain.card.repository.CardRepository import com.tangem.domain.common.LogConfig -import com.tangem.domain.feedback.GetWalletMetaInfoUseCase -import com.tangem.domain.feedback.SendFeedbackEmailUseCase -import com.tangem.domain.onboarding.SaveTwinsOnboardingShownUseCase -import com.tangem.domain.onboarding.WasTwinsOnboardingShownUseCase -import com.tangem.domain.onboarding.repository.OnboardingRepository -import com.tangem.domain.settings.repositories.SettingsRepository -import com.tangem.domain.walletmanager.WalletManagersFacade -import com.tangem.domain.wallets.builder.ColdUserWalletBuilder import com.tangem.domain.wallets.repository.WalletsRepository -import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles import com.tangem.operations.attestation.api.TangemApiServiceSettings import com.tangem.tap.common.analytics.AnalyticsFactory import com.tangem.tap.common.analytics.api.AnalyticsHandlerBuilder @@ -64,20 +40,12 @@ import com.tangem.tap.common.analytics.handlers.customerio.CustomerIoAnalyticsHa import com.tangem.tap.common.analytics.handlers.firebase.FirebaseAnalyticsHandler import com.tangem.tap.common.images.createCoilImageLoader import com.tangem.tap.common.log.TangemAppLoggerInitializer -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.proxy.AppStateHolder -import com.tangem.tap.proxy.redux.DaggerGraphState import com.tangem.utils.logging.TangemLogger import com.tangem.wallet.BuildConfig import dagger.hilt.EntryPoints import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch -import org.rekotlin.Store - -lateinit var store: Store lateinit var walletsRepository: WalletsRepository @@ -89,12 +57,6 @@ open class TangemApplication : Application(), ImageLoaderFactory, Configuration. private val entryPoint: ApplicationEntryPoint get() = EntryPoints.get(this, ApplicationEntryPoint::class.java) - private val appStateHolder: AppStateHolder - get() = entryPoint.getAppStateHolder() - - private val issuersConfigStorage: IssuersConfigStorage - get() = entryPoint.getIssuersConfigStorage() - private val environmentConfig: EnvironmentConfig get() = entryPoint.getEnvironmentConfig() @@ -104,96 +66,21 @@ open class TangemApplication : Application(), ImageLoaderFactory, Configuration. private val excludedBlockchainsManager: ExcludedBlockchainsManager get() = entryPoint.getExcludedBlockchainsManager() - private val networkConnectionManager: NetworkConnectionManager - get() = entryPoint.getNetworkConnectionManager() - - private val cardScanningFeatureToggles: CardScanningFeatureToggles - get() = entryPoint.getCardScanningFeatureToggles() - - private val scanCardProcessor: ScanCardProcessor - get() = entryPoint.getScanCardProcessor() - - private val appCurrencyRepository: AppCurrencyRepository - get() = entryPoint.getAppCurrencyRepository() - - private val walletManagersFacade: WalletManagersFacade - get() = entryPoint.getWalletManagersFacade() - - private val appThemeModeRepository: AppThemeModeRepository - get() = entryPoint.getAppThemeModeRepository() - - private val balanceHidingRepository: BalanceHidingRepository - get() = entryPoint.getBalanceHidingRepository() - - private val appPreferencesStore: AppPreferencesStore - get() = entryPoint.getAppPreferencesStore() - val getAppThemeModeUseCase: GetAppThemeModeUseCase get() = entryPoint.getGetAppThemeModeUseCase() private val oneTimeEventFilter: OneTimeEventFilter get() = entryPoint.getOneTimeEventFilter() - private val wasTwinsOnboardingShownUseCase: WasTwinsOnboardingShownUseCase - get() = entryPoint.getWasTwinsOnboardingShownUseCase() - - private val saveTwinsOnboardingShownUseCase: SaveTwinsOnboardingShownUseCase - get() = entryPoint.getSaveTwinsOnboardingShownUseCase() - - private val cardRepository: CardRepository - get() = entryPoint.getCardRepository() - private val tangemSdkLogger: TangemSdkLogger get() = entryPoint.getTangemSdkLogger() - private val settingsRepository: SettingsRepository - get() = entryPoint.getSettingsRepository() - - private val blockchainSDKFactory: BlockchainSDKFactory - get() = entryPoint.getBlockchainSDKFactory() - - private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase - get() = entryPoint.getSendFeedbackEmailUseCase() - - private val getWalletMetaInfoUseCase: GetWalletMetaInfoUseCase - get() = entryPoint.getWalletMetaInfoUseCase() - - private val urlOpener - get() = entryPoint.getUrlOpener() - - private val shareManager - get() = entryPoint.getShareManager() - - private val appRouter: AppRouter - get() = entryPoint.getAppRouter() - private val tangemAppLoggerInitializer: TangemAppLoggerInitializer get() = entryPoint.getTangemAppLogger() - private val transactionSignerFactory: TransactionSignerFactory - get() = entryPoint.getTransactionSignerFactory() - - private val onboardingV2FeatureToggles: OnboardingV2FeatureToggles - get() = entryPoint.getOnboardingV2FeatureToggles() - - private val onboardingRepository: OnboardingRepository - get() = entryPoint.getOnboardingRepository() - - private val excludedBlockchains: ExcludedBlockchains - get() = entryPoint.getExcludedBlockchains() - private val appLogsStore: AppLogsStore get() = entryPoint.getAppLogsStore() - private val clipboardManager: ClipboardManager - get() = entryPoint.getClipboardManager() - - private val settingsManager: SettingsManager - get() = entryPoint.getSettingsManager() - - private val uiMessageSender: UiMessageSender - get() = entryPoint.getUiMessageSender() - private val blockchainExceptionHandler: BlockchainExceptionHandler get() = entryPoint.getBlockchainExceptionHandler() @@ -205,33 +92,18 @@ open class TangemApplication : Application(), ImageLoaderFactory, Configuration. .setWorkerFactory(workerFactory) .build() - private val coldUserWalletBuilderFactory: ColdUserWalletBuilder.Factory - get() = entryPoint.getColdUserWalletBuilderFactory() - private val apiConfigsManager: ApiConfigsManager get() = entryPoint.getApiConfigsManager() - private val userWalletsListRepository - get() = entryPoint.getUserWalletsListRepository() - - private val tangemHotSdk - get() = entryPoint.getTangemHotSdk() - private val wcInitializeUseCase get() = entryPoint.getWcInitializeUseCase() - private val trackingContextProxy - get() = entryPoint.getTrackingContextProxy() - private val abTestsManager: ABTestsManager get() = entryPoint.getABTestsManager() private val appsFlyerClientFactory: AppsFlyerClient.Factory get() = entryPoint.getAppsFlyerClientFactory() - private val scanFailsRequester - get() = entryPoint.getScanFailsRequester() - private val sendTransactionSignerInfoInterceptor get() = entryPoint.getSendTransactionSignerInfoInterceptor() @@ -279,8 +151,6 @@ open class TangemApplication : Application(), ImageLoaderFactory, Configuration. apiConfigsManager.initialize() - store = createReduxStore() - TangemLogger.i("APP STARTED") if (BuildConfig.TESTER_MENU_ENABLED) { TangemLogger.i(featureTogglesManager.toString()) @@ -321,57 +191,11 @@ open class TangemApplication : Application(), ImageLoaderFactory, Configuration. ) } - appStateHolder.mainStore = store - wcInitializeUseCase.init( projectId = environmentConfig.walletConnectProjectId, ) } - private fun createReduxStore(): Store { - return Store( - reducer = { action, state -> appReducer(action, requireNotNull(state)) }, - middleware = AppState.getMiddleware(), - state = AppState( - daggerGraphState = DaggerGraphState( - networkConnectionManager = networkConnectionManager, - cardScanningFeatureToggles = cardScanningFeatureToggles, - scanCardProcessor = scanCardProcessor, - appCurrencyRepository = appCurrencyRepository, - walletManagersFacade = walletManagersFacade, - appStateHolder = appStateHolder, - appThemeModeRepository = appThemeModeRepository, - balanceHidingRepository = balanceHidingRepository, - walletsRepository = walletsRepository, - wasTwinsOnboardingShownUseCase = wasTwinsOnboardingShownUseCase, - saveTwinsOnboardingShownUseCase = saveTwinsOnboardingShownUseCase, - cardRepository = cardRepository, - settingsRepository = settingsRepository, - blockchainSDKFactory = blockchainSDKFactory, - sendFeedbackEmailUseCase = sendFeedbackEmailUseCase, - getWalletMetaInfoUseCase = getWalletMetaInfoUseCase, - issuersConfigStorage = issuersConfigStorage, - urlOpener = urlOpener, - shareManager = shareManager, - appRouter = appRouter, - transactionSignerFactory = transactionSignerFactory, - onboardingV2FeatureToggles = onboardingV2FeatureToggles, - onboardingRepository = onboardingRepository, - excludedBlockchains = excludedBlockchains, - appPreferencesStore = appPreferencesStore, - clipboardManager = clipboardManager, - settingsManager = settingsManager, - uiMessageSender = uiMessageSender, - coldUserWalletBuilderFactory = coldUserWalletBuilderFactory, - userWalletsListRepository = userWalletsListRepository, - tangemHotSdk = tangemHotSdk, - trackingContextProxy = trackingContextProxy, - scanFailsRequester = scanFailsRequester, - ), - ), - ) - } - private fun updateLogFiles() { appLogsStore.deleteOldLogsFile() diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Store.kt b/app/src/main/java/com/tangem/tap/common/extensions/Store.kt deleted file mode 100644 index 8d38cb9f3a..0000000000 --- a/app/src/main/java/com/tangem/tap/common/extensions/Store.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.tangem.tap.common.extensions - -import com.tangem.common.routing.AppRouter -import com.tangem.domain.common.extensions.withMainContext -import com.tangem.domain.models.wallet.UserWallet -import com.tangem.tap.common.redux.AppState -import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.tap.scope -import com.tangem.tap.store -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.rekotlin.Action -import org.rekotlin.Store - -/** - * Dispatch action with creating the new coroutine with the Main dispatcher - * - * @see dispatchWithMain - */ -fun Store<*>.dispatchOnMain(action: Action) { - scope.launch(Dispatchers.Main) { - dispatch(action) - } -} - -/** - * Dispatch action on the Main coroutine context - * - * @param action [Action] to be dispatched - * - * @see dispatchOnMain - * */ -suspend fun Store<*>.dispatchWithMain(action: Action) { - withMainContext { - dispatch(action) - } -} - -suspend fun Store.onUserWalletSelected(userWallet: UserWallet) { - state.globalState.tapWalletManager.onWalletSelected(userWallet) -} - -/** - * Dispatch action inside a coroutine with the Main dispatcher - */ -@Deprecated( - message = "Use dispatchWithMain instead", - replaceWith = ReplaceWith(expression = "dispatchWithMain"), -) -suspend fun dispatchOnMain(vararg actions: Action) { - withMainContext { actions.forEach { store.dispatch(it) } } -} - -fun Store.dispatchNavigationAction(action: AppRouter.() -> Unit) { - inject(DaggerGraphState::appRouter).action() -} - -inline fun Store.inject(getDependency: DaggerGraphState.() -> T?): T { - return requireNotNull(state.daggerGraphState.getDependency()) { - "${T::class.simpleName.orEmpty()} isn't initialized " - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/AccessCodeRequestPolicyMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/AccessCodeRequestPolicyMiddleware.kt deleted file mode 100644 index 57be8c6e21..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/AccessCodeRequestPolicyMiddleware.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.tangem.tap.common.redux - -import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.common.extensions.inject -import com.tangem.tap.common.redux.global.GlobalAction -import com.tangem.tap.mainScope -import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.tap.store -import kotlinx.coroutines.launch -import org.rekotlin.Middleware - -class AccessCodeRequestPolicyMiddleware { - val middleware: Middleware = { _, _ -> - { next -> - { action -> - if (action is GlobalAction.SaveScanResponse) { - updateAccessCodeRequestPolicy(action.scanResponse) - } - next(action) - } - } - } - - private fun updateAccessCodeRequestPolicy(scanResponse: ScanResponse) { - mainScope.launch { - val shouldSaveAccessCodes = store.inject(DaggerGraphState::settingsRepository).shouldSaveAccessCodes() - - store.inject(DaggerGraphState::cardSdkConfigRepository).setAccessCodeRequestPolicy( - isBiometricsRequestPolicy = shouldSaveAccessCodes && scanResponse.card.isAccessCodeSet, - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt b/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt deleted file mode 100644 index 092abd503b..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/AppReducer.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.tangem.tap.common.redux - -import com.tangem.tap.common.redux.global.globalReducer -import com.tangem.tap.proxy.redux.DaggerGraphReducer -import org.rekotlin.Action - -fun appReducer(action: Action, state: AppState): AppState { - if (action is AppAction.RestoreState) return action.state - - return AppState( - globalState = globalReducer(action, state), - daggerGraphState = DaggerGraphReducer.reduce(action, state), - ) -} - -sealed class AppAction : Action { - data class RestoreState(val state: AppState) : AppAction() -} \ No newline at end of file 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 deleted file mode 100644 index d854ba1088..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/AppState.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.tangem.tap.common.redux - -import com.tangem.tap.common.redux.global.GlobalState -import com.tangem.tap.proxy.redux.DaggerGraphMiddleware -import com.tangem.tap.proxy.redux.DaggerGraphState -import org.rekotlin.Middleware -import org.rekotlin.StateType - -data class AppState( - val globalState: GlobalState = GlobalState(), - val daggerGraphState: DaggerGraphState = DaggerGraphState(), -) : StateType { - - companion object { - fun getMiddleware(): List> { - return listOf( - logMiddleware, - LockUserWalletsTimerMiddleware().middleware, - AccessCodeRequestPolicyMiddleware().middleware, - DaggerGraphMiddleware.daggerGraphMiddleware, - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/LockUserWalletsTimerMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/LockUserWalletsTimerMiddleware.kt deleted file mode 100644 index 67bb53a5b5..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/LockUserWalletsTimerMiddleware.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.tangem.tap.common.redux - -import com.tangem.tap.lockUserWalletsTimer -import org.rekotlin.Middleware - -class LockUserWalletsTimerMiddleware { - val middleware: Middleware = { _, _ -> - { nextDispatch -> - { action -> - lockUserWalletsTimer?.restart() - nextDispatch(action) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt deleted file mode 100644 index 7dd3992c54..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/LogMiddleware.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.tangem.tap.common.redux - -import com.tangem.utils.logging.TangemLogger -import org.rekotlin.Middleware - -/** -[REDACTED_AUTHOR] - */ -val logMiddleware: Middleware = { _, _ -> - { nextDispatch -> - { action -> - TangemLogger.i("Dispatch action: ${action::class.java.simpleName}") - nextDispatch(action) - } - } -} \ 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 deleted file mode 100644 index c446ff5206..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.tangem.tap.common.redux.global - -import com.tangem.domain.models.scan.ScanResponse -import org.rekotlin.Action - -sealed class GlobalAction : Action { - - data class SaveScanResponse(val scanResponse: ScanResponse) : GlobalAction() - - data class IsSignWithRing(val isSignWithRing: Boolean) : GlobalAction() -} \ No newline at end of file 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 deleted file mode 100644 index 32164696dc..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalReducer.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.tangem.tap.common.redux.global - -import com.tangem.tap.common.redux.AppState -import org.rekotlin.Action - -@Suppress("LongMethod", "ComplexMethod") -fun globalReducer(action: Action, state: AppState): GlobalState { - if (action !is GlobalAction) return state.globalState - - val globalState = state.globalState - - return when (action) { - is GlobalAction.SaveScanResponse -> { - globalState.copy(scanResponse = action.scanResponse) - } - is GlobalAction.IsSignWithRing -> globalState.copy(isLastSignWithRing = action.isSignWithRing) - } -} \ No newline at end of file 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 deleted file mode 100644 index 843d9f2977..0000000000 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalState.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.tangem.tap.common.redux.global - -import com.tangem.domain.models.scan.ScanResponse -import com.tangem.tap.domain.TapWalletManager -import org.rekotlin.StateType - -data class GlobalState( - @Deprecated("Use scan response from selected user wallet") - val scanResponse: ScanResponse? = null, - val tapWalletManager: TapWalletManager = TapWalletManager(), - val isLastSignWithRing: Boolean = false, -) : StateType - -typealias CryptoCurrencyName = String \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/di/AppStateHolderModule.kt b/app/src/main/java/com/tangem/tap/di/AppStateHolderModule.kt deleted file mode 100644 index 267fa733f1..0000000000 --- a/app/src/main/java/com/tangem/tap/di/AppStateHolderModule.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.tangem.tap.di - -import com.tangem.domain.redux.ReduxStateHolder -import com.tangem.tap.proxy.AppStateHolder -import dagger.Binds -import dagger.Module -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -internal interface AppStateHolderModule { - - @Binds - @Singleton - fun bindsReduxStateHolder(appStateHolder: AppStateHolder): ReduxStateHolder -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt b/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt deleted file mode 100644 index f486cce85c..0000000000 --- a/app/src/main/java/com/tangem/tap/domain/TapWalletManager.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.tangem.tap.domain - -import com.tangem.blockchain.common.Token -import com.tangem.blockchain.common.Wallet -import com.tangem.domain.common.extensions.withMainContext -import com.tangem.domain.models.wallet.UserWallet -import com.tangem.tap.common.extensions.inject -import com.tangem.tap.common.redux.global.GlobalAction -import com.tangem.tap.proxy.redux.DaggerGraphState -import com.tangem.tap.store -import com.tangem.tap.tangemSdkManager -import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider -import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch - -class TapWalletManager( - private val dispatchers: CoroutineDispatcherProvider = AppCoroutineDispatcherProvider(), -) { - - private var loadUserWalletDataJob: Job? = null - set(value) { - field?.cancel() - field = value - } - - suspend fun onWalletSelected(userWallet: UserWallet) { - // If a previous job was running, it gets cancelled before the new one starts, - // ensuring that only one job is active at any given time. - loadUserWalletDataJob = CoroutineScope(dispatchers.io) - .launch { loadUserWalletData(userWallet) } - .apply { join() } - } - - /** - * [REDACTED_TODO_COMMENT] - */ - private suspend fun loadUserWalletData(userWallet: UserWallet) { - val trackingContextProxy = store.inject(DaggerGraphState::trackingContextProxy) - trackingContextProxy.setContext(userWallet) - - if (userWallet is UserWallet.Cold) { - val scanResponse = userWallet.scanResponse - tangemSdkManager.changeDisplayedCardIdNumbersCount(scanResponse) - withMainContext { - // Order is important - store.dispatch(GlobalAction.SaveScanResponse(scanResponse)) - } - } - } -} - -fun Wallet.getFirstToken(): Token? = getTokens().toList().getOrNull(index = 0) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/model/Currency.kt b/app/src/main/java/com/tangem/tap/domain/model/Currency.kt index 29c89811fc..4de663c36c 100644 --- a/app/src/main/java/com/tangem/tap/domain/model/Currency.kt +++ b/app/src/main/java/com/tangem/tap/domain/model/Currency.kt @@ -1,12 +1,11 @@ package com.tangem.tap.domain.model -import com.tangem.tap.common.redux.global.CryptoCurrencyName import com.tangem.blockchain.common.Blockchain as SdkBlockchain import com.tangem.blockchain.common.Token as SdkToken sealed interface Currency { val blockchain: SdkBlockchain - val currencySymbol: CryptoCurrencyName + val currencySymbol: String val derivationPath: String? val decimals get() = when (this) { @@ -26,6 +25,6 @@ sealed interface Currency { override val blockchain: SdkBlockchain, override val derivationPath: String?, ) : Currency { - override val currencySymbol: CryptoCurrencyName = blockchain.currency + override val currencySymbol: String = blockchain.currency } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/demo/DemoMiddleware.kt b/app/src/main/java/com/tangem/tap/features/demo/DemoMiddleware.kt deleted file mode 100644 index 4ddd62e7f3..0000000000 --- a/app/src/main/java/com/tangem/tap/features/demo/DemoMiddleware.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tangem.tap.features.demo - -import com.tangem.domain.demo.models.DemoConfig -import com.tangem.domain.models.scan.ScanResponse -import org.rekotlin.Action - -/** -[REDACTED_AUTHOR] - */ -interface DemoMiddleware { - fun tryHandle(config: DemoConfig, scanResponse: ScanResponse, action: Action): Boolean -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt b/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt deleted file mode 100644 index e85f806bdc..0000000000 --- a/app/src/main/java/com/tangem/tap/proxy/AppStateHolder.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.tangem.tap.proxy - -import com.tangem.domain.models.wallet.UserWallet -import com.tangem.domain.redux.ReduxStateHolder -import com.tangem.tap.common.extensions.dispatchWithMain -import com.tangem.tap.common.extensions.onUserWalletSelected -import com.tangem.tap.common.redux.AppState -import com.tangem.tap.network.exchangeServices.SellService -import org.rekotlin.Action -import org.rekotlin.Store -import javax.inject.Inject - -/** - * Holds objects from old modules, that missing in DI graph. - * Object sets manually to use in new modules and [AppStateHolder] proxies its to DI. - */ -class AppStateHolder @Inject constructor() : ReduxStateHolder { - - var mainStore: Store? = null - var sellService: SellService? = null - - override fun dispatch(action: Action) { - mainStore?.dispatch(action) - } - - override suspend fun dispatchWithMain(action: Action) { - mainStore?.dispatchWithMain(action) - } - - override suspend fun onUserWalletSelected(userWallet: UserWallet) { - mainStore?.onUserWalletSelected(userWallet) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt b/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt deleted file mode 100644 index 5c943d917b..0000000000 --- a/app/src/main/java/com/tangem/tap/proxy/di/ProxyModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.tangem.tap.proxy.di - -import com.tangem.tap.proxy.AppStateHolder -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton - -@Module -@InstallIn(SingletonComponent::class) -internal object ProxyModule { - - @Provides - @Singleton - fun provideAppStateHolder(): AppStateHolder { - return AppStateHolder() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt deleted file mode 100644 index ef0fab7352..0000000000 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.tangem.tap.proxy.redux - -import com.tangem.domain.card.ScanCardUseCase -import com.tangem.domain.card.repository.CardSdkConfigRepository -import org.rekotlin.Action - -sealed interface DaggerGraphAction : Action { - - data class SetActivityDependencies( - val scanCardUseCase: ScanCardUseCase, - val cardSdkConfigRepository: CardSdkConfigRepository, - ) : DaggerGraphAction -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphMiddleware.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphMiddleware.kt deleted file mode 100644 index 0e822a4edc..0000000000 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphMiddleware.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.tangem.tap.proxy.redux - -import com.tangem.tap.common.redux.AppState -import org.rekotlin.Middleware - -@Suppress("MemberNameEqualsClassName") -object DaggerGraphMiddleware { - val daggerGraphMiddleware: Middleware = { _, _ -> - { next -> - { action -> next(action) } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt deleted file mode 100644 index 6a2e43b96a..0000000000 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.tangem.tap.proxy.redux - -import com.tangem.tap.common.redux.AppState -import org.rekotlin.Action - -object DaggerGraphReducer { - fun reduce(action: Action, state: AppState): DaggerGraphState { - if (action !is DaggerGraphAction) return state.daggerGraphState - - return internalReduce(action, state) - } - - private fun internalReduce(action: DaggerGraphAction, state: AppState): DaggerGraphState { - return when (action) { - is DaggerGraphAction.SetActivityDependencies -> state.daggerGraphState.copy( - scanCardUseCase = action.scanCardUseCase, - cardSdkConfigRepository = action.cardSdkConfigRepository, - ) - } - } -} \ 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 deleted file mode 100644 index 9f31ff291c..0000000000 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.tangem.tap.proxy.redux - -import com.tangem.blockchainsdk.BlockchainSDKFactory -import com.tangem.blockchainsdk.utils.ExcludedBlockchains -import com.tangem.common.routing.AppRouter -import com.tangem.core.analytics.utils.TrackingContextProxy -import com.tangem.core.decompose.ui.UiMessageSender -import com.tangem.core.navigation.settings.SettingsManager -import com.tangem.core.navigation.share.ShareManager -import com.tangem.core.navigation.url.UrlOpener -import com.tangem.core.ui.clipboard.ClipboardManager -import com.tangem.data.card.TransactionSignerFactory -import com.tangem.datasource.connection.NetworkConnectionManager -import com.tangem.datasource.local.config.issuers.IssuersConfigStorage -import com.tangem.datasource.local.preferences.AppPreferencesStore -import com.tangem.domain.appcurrency.repository.AppCurrencyRepository -import com.tangem.domain.apptheme.repository.AppThemeModeRepository -import com.tangem.domain.balancehiding.repositories.BalanceHidingRepository -import com.tangem.domain.card.ScanCardProcessor -import com.tangem.domain.card.ScanCardUseCase -import com.tangem.domain.card.ScanFailsRequester -import com.tangem.domain.card.repository.CardRepository -import com.tangem.domain.card.repository.CardSdkConfigRepository -import com.tangem.domain.common.wallets.UserWalletsListRepository -import com.tangem.domain.feedback.GetWalletMetaInfoUseCase -import com.tangem.domain.feedback.SendFeedbackEmailUseCase -import com.tangem.domain.onboarding.SaveTwinsOnboardingShownUseCase -import com.tangem.domain.onboarding.WasTwinsOnboardingShownUseCase -import com.tangem.domain.onboarding.repository.OnboardingRepository -import com.tangem.domain.settings.repositories.SettingsRepository -import com.tangem.domain.walletmanager.WalletManagersFacade -import com.tangem.domain.wallets.builder.ColdUserWalletBuilder -import com.tangem.domain.wallets.repository.WalletsRepository -import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles -import com.tangem.hot.sdk.TangemHotSdk -import com.tangem.operations.attestation.CardArtworksProvider -import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles -import com.tangem.tap.proxy.AppStateHolder -import org.rekotlin.StateType - -data class DaggerGraphState( - val networkConnectionManager: NetworkConnectionManager? = null, - val cardScanningFeatureToggles: CardScanningFeatureToggles? = null, - val scanCardUseCase: ScanCardUseCase? = null, - val scanCardProcessor: ScanCardProcessor? = null, - val cardSdkConfigRepository: CardSdkConfigRepository? = null, - val appCurrencyRepository: AppCurrencyRepository? = null, - val walletManagersFacade: WalletManagersFacade? = null, - val appStateHolder: AppStateHolder? = null, - val appThemeModeRepository: AppThemeModeRepository? = null, - val balanceHidingRepository: BalanceHidingRepository? = null, - val walletsRepository: WalletsRepository? = null, - val wasTwinsOnboardingShownUseCase: WasTwinsOnboardingShownUseCase? = null, - val saveTwinsOnboardingShownUseCase: SaveTwinsOnboardingShownUseCase? = null, - val cardRepository: CardRepository? = null, - val settingsRepository: SettingsRepository? = null, - val blockchainSDKFactory: BlockchainSDKFactory? = null, - val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase? = null, - val getWalletMetaInfoUseCase: GetWalletMetaInfoUseCase? = null, - val issuersConfigStorage: IssuersConfigStorage? = null, - val urlOpener: UrlOpener? = null, - val shareManager: ShareManager? = null, - val appRouter: AppRouter? = null, - val transactionSignerFactory: TransactionSignerFactory? = null, - val onboardingV2FeatureToggles: OnboardingV2FeatureToggles? = null, - val onboardingRepository: OnboardingRepository? = null, - val excludedBlockchains: ExcludedBlockchains? = null, - val appPreferencesStore: AppPreferencesStore? = null, - val clipboardManager: ClipboardManager? = null, - val settingsManager: SettingsManager? = null, - val uiMessageSender: UiMessageSender? = null, - val cardArworksProvider: CardArtworksProvider? = null, - val coldUserWalletBuilderFactory: ColdUserWalletBuilder.Factory? = null, - val userWalletsListRepository: UserWalletsListRepository? = null, - val tangemHotSdk: TangemHotSdk? = null, - val trackingContextProxy: TrackingContextProxy? = null, - val scanFailsRequester: ScanFailsRequester? = null, -) : StateType \ No newline at end of file diff --git a/core/navigation/build.gradle.kts b/core/navigation/build.gradle.kts index 3020e44ee4..c2e83ab662 100644 --- a/core/navigation/build.gradle.kts +++ b/core/navigation/build.gradle.kts @@ -17,5 +17,4 @@ dependencies { kapt(deps.hilt.kapt) implementation(deps.material) - implementation(deps.reKotlin) } \ No newline at end of file diff --git a/domain/legacy/build.gradle.kts b/domain/legacy/build.gradle.kts index 6d09dae413..59b91dd6a8 100644 --- a/domain/legacy/build.gradle.kts +++ b/domain/legacy/build.gradle.kts @@ -42,7 +42,6 @@ dependencies { implementation(deps.kotlin.coroutines) implementation(deps.moshi) implementation(deps.moshi.kotlin) - implementation(deps.reKotlin) ksp(deps.moshi.kotlin.codegen) /** Testing libraries */ diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/ReduxStateHolder.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/ReduxStateHolder.kt deleted file mode 100644 index 3a96226153..0000000000 --- a/domain/legacy/src/main/java/com/tangem/domain/redux/ReduxStateHolder.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.tangem.domain.redux - -import com.tangem.domain.models.wallet.UserWallet -import org.rekotlin.Action - -interface ReduxStateHolder { - - fun dispatch(action: Action) - - suspend fun dispatchWithMain(action: Action) - - suspend fun onUserWalletSelected(userWallet: UserWallet) -} \ No newline at end of file diff --git a/domain/tokens/build.gradle.kts b/domain/tokens/build.gradle.kts index 236ce7785f..5fc40e8cea 100644 --- a/domain/tokens/build.gradle.kts +++ b/domain/tokens/build.gradle.kts @@ -56,7 +56,6 @@ dependencies { /** Utils */ implementation(deps.jodatime) - implementation(deps.reKotlin) implementation(tangemDeps.blockchain) { exclude(module = "joda-time") diff --git a/features/details/impl/build.gradle.kts b/features/details/impl/build.gradle.kts index 7fc4587458..e2f9062600 100644 --- a/features/details/impl/build.gradle.kts +++ b/features/details/impl/build.gradle.kts @@ -78,7 +78,6 @@ dependencies { /* Other */ implementation(deps.kotlin.immutable.collections) - implementation(deps.reKotlin) implementation(deps.arrow.core) implementation(deps.arrow.fx) } \ No newline at end of file diff --git a/features/manage-tokens/impl/build.gradle.kts b/features/manage-tokens/impl/build.gradle.kts index 5c8bc1a2ed..f2e5b7170c 100644 --- a/features/manage-tokens/impl/build.gradle.kts +++ b/features/manage-tokens/impl/build.gradle.kts @@ -69,5 +69,4 @@ dependencies { /* Other */ implementation(deps.kotlin.immutable.collections) implementation(deps.decompose.ext.compose) - implementation(deps.reKotlin) // need for legacy onboarding } \ No newline at end of file diff --git a/features/onramp/impl/build.gradle.kts b/features/onramp/impl/build.gradle.kts index 60286429b9..87252298e9 100644 --- a/features/onramp/impl/build.gradle.kts +++ b/features/onramp/impl/build.gradle.kts @@ -82,5 +82,4 @@ dependencies { /** Other */ implementation(deps.decompose.ext.compose) implementation(deps.kotlin.immutable.collections) - implementation(deps.reKotlin) } \ No newline at end of file diff --git a/features/tokendetails/impl/build.gradle.kts b/features/tokendetails/impl/build.gradle.kts index c47f2c68ed..379ae600f2 100644 --- a/features/tokendetails/impl/build.gradle.kts +++ b/features/tokendetails/impl/build.gradle.kts @@ -37,7 +37,6 @@ dependencies { implementation(deps.arrow.core) implementation(deps.jodatime) implementation(deps.kotlin.immutable.collections) - implementation(deps.reKotlin) implementation(tangemDeps.blockchain) implementation(tangemDeps.card.core) implementation(deps.lifecycle.compose) diff --git a/features/wallet-settings/impl/build.gradle.kts b/features/wallet-settings/impl/build.gradle.kts index 51e2d587f8..073dc92b0f 100644 --- a/features/wallet-settings/impl/build.gradle.kts +++ b/features/wallet-settings/impl/build.gradle.kts @@ -73,7 +73,6 @@ dependencies { /* Other */ implementation(deps.kotlin.immutable.collections) - implementation(deps.reKotlin) /** Tangem libraries */ implementation(tangemDeps.hot.core) diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index 60c99dd9a8..83c646bcc9 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -41,7 +41,6 @@ dependencies { implementation(deps.googlePlay.review) implementation(deps.jodatime) implementation(deps.kotlin.immutable.collections) - implementation(deps.reKotlin) implementation(tangemDeps.hot.core) implementation(tangemDeps.card.core) implementation(tangemDeps.blockchain) diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 32ce0df01b..cb69868e03 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -73,7 +73,6 @@ lottie-compose = "6.6.0" moshi = "1.15.1" moshiAdaptersExt = "0.1.5" okhttp = "4.9.3" -rekotlin = "1.0.4" retrofit = "2.11.0" retrofitMoshiConverter = "2.9.0" spongycastleCryptoCore = "1.58.0.0" @@ -279,7 +278,6 @@ moshi-kotlin-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", ver okHttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } okHttp-prettyLogging = { module = "com.github.ihsanbal:LoggingInterceptor", version.ref = "okHttp-prettyLogging" } spongecastle-core = { module = "com.madgag.spongycastle:core", version.ref = "spongycastleCryptoCore" } -reKotlin = { module = "org.rekotlin:rekotlin", version.ref = "rekotlin" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } retrofit-response-type-keeper = { module = "com.squareup.retrofit2:response-type-keeper", version.ref = "retrofit" } retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.ref = "retrofitMoshiConverter" }