Updated on 2026-08-14
This commit is contained in:
parent
4403db60bf
commit
56e42b6c90
27 changed files with 15 additions and 457 deletions
|
|
@ -35,7 +35,6 @@ import com.tangem.features.onboarding.v2.OnboardingV2FeatureToggles
|
||||||
import com.tangem.features.onramp.OnrampFeatureToggles
|
import com.tangem.features.onramp.OnrampFeatureToggles
|
||||||
import com.tangem.tap.common.log.TangemAppLoggerInitializer
|
import com.tangem.tap.common.log.TangemAppLoggerInitializer
|
||||||
import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles
|
import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles
|
||||||
import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles
|
|
||||||
import com.tangem.tap.proxy.AppStateHolder
|
import com.tangem.tap.proxy.AppStateHolder
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import dagger.hilt.EntryPoint
|
import dagger.hilt.EntryPoint
|
||||||
|
|
@ -112,8 +111,6 @@ interface ApplicationEntryPoint {
|
||||||
|
|
||||||
fun getTransactionSignerFactory(): TransactionSignerFactory
|
fun getTransactionSignerFactory(): TransactionSignerFactory
|
||||||
|
|
||||||
fun getHomeFeatureToggles(): HomeFeatureToggles
|
|
||||||
|
|
||||||
fun getGetUserCountryCodeUseCase(): GetUserCountryUseCase
|
fun getGetUserCountryCodeUseCase(): GetUserCountryUseCase
|
||||||
|
|
||||||
fun getOnrampFeatureToggles(): OnrampFeatureToggles
|
fun getOnrampFeatureToggles(): OnrampFeatureToggles
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,6 @@ import com.tangem.tap.common.redux.AppState
|
||||||
import com.tangem.tap.common.redux.appReducer
|
import com.tangem.tap.common.redux.appReducer
|
||||||
import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles
|
import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles
|
||||||
import com.tangem.tap.domain.tasks.product.DerivationsFinder
|
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.AppStateHolder
|
||||||
import com.tangem.tap.proxy.redux.DaggerGraphState
|
import com.tangem.tap.proxy.redux.DaggerGraphState
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
|
|
@ -177,9 +176,6 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
|
||||||
private val transactionSignerFactory: TransactionSignerFactory
|
private val transactionSignerFactory: TransactionSignerFactory
|
||||||
get() = entryPoint.getTransactionSignerFactory()
|
get() = entryPoint.getTransactionSignerFactory()
|
||||||
|
|
||||||
private val homeFeatureToggles: HomeFeatureToggles
|
|
||||||
get() = entryPoint.getHomeFeatureToggles()
|
|
||||||
|
|
||||||
private val getUserCountryUseCase: GetUserCountryUseCase
|
private val getUserCountryUseCase: GetUserCountryUseCase
|
||||||
get() = entryPoint.getGetUserCountryCodeUseCase()
|
get() = entryPoint.getGetUserCountryCodeUseCase()
|
||||||
|
|
||||||
|
|
@ -272,7 +268,6 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
|
||||||
shareManager = shareManager,
|
shareManager = shareManager,
|
||||||
appRouter = appRouter,
|
appRouter = appRouter,
|
||||||
transactionSignerFactory = transactionSignerFactory,
|
transactionSignerFactory = transactionSignerFactory,
|
||||||
homeFeatureToggles = homeFeatureToggles,
|
|
||||||
getUserCountryUseCase = getUserCountryUseCase,
|
getUserCountryUseCase = getUserCountryUseCase,
|
||||||
onrampFeatureToggles = onrampFeatureToggles,
|
onrampFeatureToggles = onrampFeatureToggles,
|
||||||
environmentConfigStorage = environmentConfigStorage,
|
environmentConfigStorage = environmentConfigStorage,
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package com.tangem.tap.common.redux
|
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.GlobalMiddleware
|
||||||
import com.tangem.tap.common.redux.global.GlobalState
|
import com.tangem.tap.common.redux.global.GlobalState
|
||||||
import com.tangem.tap.common.redux.legacy.LegacyMiddleware
|
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.features.welcome.redux.WelcomeState
|
||||||
import com.tangem.tap.proxy.redux.DaggerGraphMiddleware
|
import com.tangem.tap.proxy.redux.DaggerGraphMiddleware
|
||||||
import com.tangem.tap.proxy.redux.DaggerGraphState
|
import com.tangem.tap.proxy.redux.DaggerGraphState
|
||||||
import com.tangem.utils.coroutines.AppCoroutineDispatcherProvider
|
|
||||||
import org.rekotlin.Middleware
|
import org.rekotlin.Middleware
|
||||||
import org.rekotlin.StateType
|
import org.rekotlin.StateType
|
||||||
|
|
||||||
|
|
@ -46,18 +42,6 @@ data class AppState(
|
||||||
val daggerGraphState: DaggerGraphState = DaggerGraphState(),
|
val daggerGraphState: DaggerGraphState = DaggerGraphState(),
|
||||||
) : StateType {
|
) : 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 {
|
companion object {
|
||||||
fun getMiddleware(): List<Middleware<AppState>> {
|
fun getMiddleware(): List<Middleware<AppState>> {
|
||||||
return listOf(
|
return listOf(
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
|
||||||
|
|
@ -82,8 +82,4 @@ sealed class GlobalAction : Action {
|
||||||
|
|
||||||
object Update : GlobalAction()
|
object Update : GlobalAction()
|
||||||
}
|
}
|
||||||
|
|
||||||
object FetchUserCountry : GlobalAction() {
|
|
||||||
data class Success(val countryCode: String) : GlobalAction()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -25,7 +25,6 @@ import kotlinx.coroutines.flow.firstOrNull
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.rekotlin.Action
|
import org.rekotlin.Action
|
||||||
import org.rekotlin.Middleware
|
import org.rekotlin.Middleware
|
||||||
import java.util.Locale
|
|
||||||
|
|
||||||
object GlobalMiddleware {
|
object GlobalMiddleware {
|
||||||
val handler = globalMiddlewareHandler
|
val handler = globalMiddlewareHandler
|
||||||
|
|
@ -87,27 +86,6 @@ private fun handleAction(action: Action, appState: () -> AppState?) {
|
||||||
}
|
}
|
||||||
scope.launch { exchangeManager.update() }
|
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(),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package com.tangem.tap.common.redux.global
|
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.common.redux.AppState
|
||||||
import com.tangem.tap.features.onboarding.OnboardingManager
|
import com.tangem.tap.features.onboarding.OnboardingManager
|
||||||
import com.tangem.tap.proxy.AppStateHolder
|
import com.tangem.tap.proxy.AppStateHolder
|
||||||
|
|
@ -38,7 +36,6 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde
|
||||||
}
|
}
|
||||||
is GlobalAction.SaveScanResponse -> {
|
is GlobalAction.SaveScanResponse -> {
|
||||||
appStateHolder.scanResponse = action.scanResponse
|
appStateHolder.scanResponse = action.scanResponse
|
||||||
domainStore.dispatch(DomainGlobalAction.SaveScanNoteResponse(action.scanResponse))
|
|
||||||
globalState.copy(scanResponse = action.scanResponse)
|
globalState.copy(scanResponse = action.scanResponse)
|
||||||
}
|
}
|
||||||
is GlobalAction.ChangeAppCurrency -> {
|
is GlobalAction.ChangeAppCurrency -> {
|
||||||
|
|
@ -77,9 +74,6 @@ fun globalReducer(action: Action, state: AppState, appStateHolder: AppStateHolde
|
||||||
}
|
}
|
||||||
is GlobalAction.SetIfCardVerifiedOnline ->
|
is GlobalAction.SetIfCardVerifiedOnline ->
|
||||||
globalState.copy(cardVerifiedOnline = action.verified)
|
globalState.copy(cardVerifiedOnline = action.verified)
|
||||||
is GlobalAction.FetchUserCountry.Success -> {
|
|
||||||
globalState.copy(userCountryCode = action.countryCode)
|
|
||||||
}
|
|
||||||
else -> globalState
|
else -> globalState
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
@ -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")
|
|
||||||
}
|
|
||||||
|
|
@ -53,7 +53,6 @@ private fun handleHomeAction(action: Action) {
|
||||||
|
|
||||||
store.dispatch(GlobalAction.RestoreAppCurrency)
|
store.dispatch(GlobalAction.RestoreAppCurrency)
|
||||||
store.dispatch(GlobalAction.ExchangeManager.Init)
|
store.dispatch(GlobalAction.ExchangeManager.Init)
|
||||||
store.dispatch(GlobalAction.FetchUserCountry)
|
|
||||||
}
|
}
|
||||||
is HomeAction.ReadCard -> {
|
is HomeAction.ReadCard -> {
|
||||||
action.scope.launch {
|
action.scope.launch {
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ import com.tangem.domain.settings.usercountry.FetchUserCountryUseCase
|
||||||
import com.tangem.domain.staking.FetchStakingTokensUseCase
|
import com.tangem.domain.staking.FetchStakingTokensUseCase
|
||||||
import com.tangem.domain.wallets.legacy.UserWalletsListManager
|
import com.tangem.domain.wallets.legacy.UserWalletsListManager
|
||||||
import com.tangem.tap.common.extensions.setContext
|
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.features.main.model.MainScreenState
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
|
@ -41,7 +40,6 @@ internal class MainViewModel @Inject constructor(
|
||||||
private val dispatchers: CoroutineDispatcherProvider,
|
private val dispatchers: CoroutineDispatcherProvider,
|
||||||
private val fetchStakingTokensUseCase: FetchStakingTokensUseCase,
|
private val fetchStakingTokensUseCase: FetchStakingTokensUseCase,
|
||||||
private val apiConfigsManager: ApiConfigsManager,
|
private val apiConfigsManager: ApiConfigsManager,
|
||||||
homeFeatureToggles: HomeFeatureToggles,
|
|
||||||
private val fetchUserCountryUseCase: FetchUserCountryUseCase,
|
private val fetchUserCountryUseCase: FetchUserCountryUseCase,
|
||||||
getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
|
getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
|
||||||
) : ViewModel(), MainIntents {
|
) : ViewModel(), MainIntents {
|
||||||
|
|
@ -63,11 +61,9 @@ internal class MainViewModel @Inject constructor(
|
||||||
|
|
||||||
viewModelScope.launch(dispatchers.main) { incrementAppLaunchCounterUseCase() }
|
viewModelScope.launch(dispatchers.main) { incrementAppLaunchCounterUseCase() }
|
||||||
|
|
||||||
if (homeFeatureToggles.isMigrateUserCountryCodeEnabled) {
|
viewModelScope.launch {
|
||||||
viewModelScope.launch {
|
fetchUserCountryUseCase().onLeft {
|
||||||
fetchUserCountryUseCase().onLeft {
|
Timber.e("Unable to fetch the user country code $it")
|
||||||
Timber.e("Unable to fetch the user country code $it")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.analytics.events.Onboarding
|
||||||
import com.tangem.tap.common.extensions.*
|
import com.tangem.tap.common.extensions.*
|
||||||
import com.tangem.tap.common.redux.AppDialog
|
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.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.BackupStartedSource
|
||||||
|
import com.tangem.tap.features.onboarding.products.wallet.redux.OnboardingWalletAction
|
||||||
import com.tangem.tap.features.saveWallet.redux.SaveWalletAction
|
import com.tangem.tap.features.saveWallet.redux.SaveWalletAction
|
||||||
import com.tangem.tap.mainScope
|
import com.tangem.tap.mainScope
|
||||||
import com.tangem.tap.proxy.redux.DaggerGraphState
|
import com.tangem.tap.proxy.redux.DaggerGraphState
|
||||||
|
|
@ -50,7 +48,7 @@ object OnboardingHelper {
|
||||||
if (!response.twinsIsTwinned()) {
|
if (!response.twinsIsTwinned()) {
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
onboardingManager.isActivationInProgress(cardId) ?: false
|
onboardingManager.isActivationInProgress(cardId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,7 +60,7 @@ object OnboardingHelper {
|
||||||
emptyWallets || activationInProgress || isNoBackup
|
emptyWallets || activationInProgress || isNoBackup
|
||||||
}
|
}
|
||||||
|
|
||||||
response.card.wallets.isNotEmpty() -> onboardingManager.isActivationInProgress(cardId) ?: false
|
response.card.wallets.isNotEmpty() -> onboardingManager.isActivationInProgress(cardId)
|
||||||
else -> true
|
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 blockchain = walletManager.wallet.blockchain
|
||||||
val excludedBlockchains = store.inject(DaggerGraphState::excludedBlockchains)
|
val excludedBlockchains = store.inject(DaggerGraphState::excludedBlockchains)
|
||||||
|
|
||||||
|
|
@ -238,15 +236,8 @@ object OnboardingHelper {
|
||||||
Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType))
|
Analytics.send(Onboarding.Topup.ButtonBuyCrypto(currencyType))
|
||||||
|
|
||||||
scope.launch {
|
scope.launch {
|
||||||
val homeFeatureToggles = store.inject(DaggerGraphState::homeFeatureToggles)
|
val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase)
|
||||||
|
val isRussia = getUserCountryCodeUseCase().isRight { it is UserCountry.Russia }
|
||||||
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) {
|
if (isRussia) {
|
||||||
val dialogData = AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl)
|
val dialogData = AppDialog.RussianCardholdersWarningDialog.Data(topUpUrl)
|
||||||
|
|
|
||||||
|
|
@ -176,7 +176,6 @@ private fun handleNoteAction(appState: () -> AppState?, action: Action, dispatch
|
||||||
OnboardingHelper.handleTopUpAction(
|
OnboardingHelper.handleTopUpAction(
|
||||||
walletManager = walletManager,
|
walletManager = walletManager,
|
||||||
scanResponse = scanResponse,
|
scanResponse = scanResponse,
|
||||||
globalState = globalState,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is OnboardingNoteAction.Done -> {
|
is OnboardingNoteAction.Done -> {
|
||||||
|
|
|
||||||
|
|
@ -299,7 +299,6 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
|
||||||
OnboardingHelper.handleTopUpAction(
|
OnboardingHelper.handleTopUpAction(
|
||||||
walletManager = walletManager,
|
walletManager = walletManager,
|
||||||
scanResponse = onboardingManager?.scanResponse ?: return,
|
scanResponse = onboardingManager?.scanResponse ?: return,
|
||||||
globalState = globalState,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
TwinCardsAction.Done -> {
|
TwinCardsAction.Done -> {
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ import com.tangem.tap.common.extensions.*
|
||||||
import com.tangem.tap.common.redux.AppDialog
|
import com.tangem.tap.common.redux.AppDialog
|
||||||
import com.tangem.tap.common.redux.AppState
|
import com.tangem.tap.common.redux.AppState
|
||||||
import com.tangem.tap.features.demo.DemoHelper
|
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.CurrencyExchangeManager
|
||||||
import com.tangem.tap.network.exchangeServices.buyErc20TestnetTokens
|
import com.tangem.tap.network.exchangeServices.buyErc20TestnetTokens
|
||||||
import com.tangem.tap.proxy.redux.DaggerGraphState
|
import com.tangem.tap.proxy.redux.DaggerGraphState
|
||||||
|
|
@ -26,7 +25,6 @@ import com.tangem.tap.store
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.rekotlin.Middleware
|
import org.rekotlin.Middleware
|
||||||
|
|
||||||
@Suppress("LargeClass")
|
|
||||||
@Deprecated("Will be removed soon")
|
@Deprecated("Will be removed soon")
|
||||||
object TradeCryptoMiddleware {
|
object TradeCryptoMiddleware {
|
||||||
|
|
||||||
|
|
@ -41,25 +39,24 @@ object TradeCryptoMiddleware {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("LongMethod", "CyclomaticComplexMethod")
|
|
||||||
private fun handle(state: () -> AppState?, action: TradeCryptoAction) {
|
private fun handle(state: () -> AppState?, action: TradeCryptoAction) {
|
||||||
if (DemoHelper.tryHandle(state, action)) return
|
if (DemoHelper.tryHandle(state, action)) return
|
||||||
|
|
||||||
when (action) {
|
when (action) {
|
||||||
is TradeCryptoAction.FinishSelling -> openReceiptUrl(action.transactionId)
|
is TradeCryptoAction.FinishSelling -> openReceiptUrl(action.transactionId)
|
||||||
is TradeCryptoAction.Buy -> proceedBuyAction(state, action)
|
is TradeCryptoAction.Buy -> proceedBuyAction(action)
|
||||||
is TradeCryptoAction.Sell -> proceedSellAction(action)
|
is TradeCryptoAction.Sell -> proceedSellAction(action)
|
||||||
is TradeCryptoAction.SendToken -> handleNewSendToken(action = action)
|
is TradeCryptoAction.SendToken -> handleNewSendToken(action = action)
|
||||||
is TradeCryptoAction.SendCoin -> handleNewSendCoin(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
|
val isOnrampEnabled = store.inject(DaggerGraphState::onrampFeatureToggles).isFeatureEnabled
|
||||||
if (isOnrampEnabled) {
|
if (isOnrampEnabled) {
|
||||||
proceedWithOnramp(action.userWallet.walletId, action.cryptoCurrencyStatus.currency, action.source)
|
proceedWithOnramp(action.userWallet.walletId, action.cryptoCurrencyStatus.currency, action.source)
|
||||||
} else {
|
} 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
|
val networkAddress = action.cryptoCurrencyStatus.value.networkAddress
|
||||||
?.defaultAddress
|
?.defaultAddress
|
||||||
?.let(NetworkAddress.Address::value)
|
?.let(NetworkAddress.Address::value)
|
||||||
|
|
@ -94,15 +91,9 @@ object TradeCryptoMiddleware {
|
||||||
)
|
)
|
||||||
|
|
||||||
scope.launch {
|
scope.launch {
|
||||||
val homeFeatureToggles = store.inject(DaggerGraphState::homeFeatureToggles)
|
val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase)
|
||||||
|
|
||||||
val isRussia = if (homeFeatureToggles.isMigrateUserCountryCodeEnabled) {
|
val isRussia = getUserCountryCodeUseCase().isRight { it is UserCountry.Russia }
|
||||||
val getUserCountryCodeUseCase = store.inject(DaggerGraphState::getUserCountryUseCase)
|
|
||||||
|
|
||||||
getUserCountryCodeUseCase().isRight { it is UserCountry.Russia }
|
|
||||||
} else {
|
|
||||||
state()?.globalState?.userCountryCode == RUSSIA_COUNTRY_CODE
|
|
||||||
}
|
|
||||||
|
|
||||||
if (action.checkUserLocation && isRussia) {
|
if (action.checkUserLocation && isRussia) {
|
||||||
val dialogData = topUrl?.let {
|
val dialogData = topUrl?.let {
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,5 @@ internal class WelcomeViewModel @Inject constructor(
|
||||||
private fun initGlobalState() {
|
private fun initGlobalState() {
|
||||||
store.dispatch(GlobalAction.RestoreAppCurrency)
|
store.dispatch(GlobalAction.RestoreAppCurrency)
|
||||||
store.dispatch(GlobalAction.ExchangeManager.Init)
|
store.dispatch(GlobalAction.ExchangeManager.Init)
|
||||||
store.dispatch(GlobalAction.FetchUserCountry)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -34,7 +34,6 @@ import com.tangem.features.staking.api.navigation.StakingRouter
|
||||||
import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles
|
import com.tangem.tap.domain.scanCard.CardScanningFeatureToggles
|
||||||
import com.tangem.tap.domain.walletconnect2.domain.LegacyWalletConnectRepository
|
import com.tangem.tap.domain.walletconnect2.domain.LegacyWalletConnectRepository
|
||||||
import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor
|
import com.tangem.tap.domain.walletconnect2.domain.WalletConnectInteractor
|
||||||
import com.tangem.tap.features.home.featuretoggles.HomeFeatureToggles
|
|
||||||
import com.tangem.tap.proxy.AppStateHolder
|
import com.tangem.tap.proxy.AppStateHolder
|
||||||
import org.rekotlin.StateType
|
import org.rekotlin.StateType
|
||||||
|
|
||||||
|
|
@ -68,7 +67,6 @@ data class DaggerGraphState(
|
||||||
val appRouter: AppRouter? = null,
|
val appRouter: AppRouter? = null,
|
||||||
val pushNotificationsRouter: PushNotificationsRouter? = null,
|
val pushNotificationsRouter: PushNotificationsRouter? = null,
|
||||||
val transactionSignerFactory: TransactionSignerFactory? = null,
|
val transactionSignerFactory: TransactionSignerFactory? = null,
|
||||||
val homeFeatureToggles: HomeFeatureToggles? = null,
|
|
||||||
val getUserCountryUseCase: GetUserCountryUseCase? = null,
|
val getUserCountryUseCase: GetUserCountryUseCase? = null,
|
||||||
val onrampFeatureToggles: OnrampFeatureToggles? = null,
|
val onrampFeatureToggles: OnrampFeatureToggles? = null,
|
||||||
val environmentConfigStorage: EnvironmentConfigStorage? = null,
|
val environmentConfigStorage: EnvironmentConfigStorage? = null,
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,6 @@
|
||||||
"name": "IS_ETHEREUM_EIP_1559_ENABLED",
|
"name": "IS_ETHEREUM_EIP_1559_ENABLED",
|
||||||
"version": "5.17.0"
|
"version": "5.17.0"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "MIGRATE_USER_COUNTRY_CODE_ENABLED",
|
|
||||||
"version": "5.17.0"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "ONRAMP_ENABLED",
|
"name": "ONRAMP_ENABLED",
|
||||||
"version": "5.19.0"
|
"version": "5.19.0"
|
||||||
|
|
|
||||||
|
|
@ -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<RequestHeader>(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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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<ReStoreHub<DomainState, *>> = 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<Pair<Action, DomainState>>()
|
|
||||||
|
|
||||||
RE_STORE_HUBS.forEach {
|
|
||||||
val reducedState = it.reduce(action, assembleReducedDomainState)
|
|
||||||
|
|
||||||
assembleReducedDomainState = if (reducedState != assembleReducedDomainState) {
|
|
||||||
reducedStatesByAction.add(action to assembleReducedDomainState)
|
|
||||||
reducedState
|
|
||||||
} else {
|
|
||||||
assembleReducedDomainState
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return assembleReducedDomainState
|
|
||||||
}
|
|
||||||
|
|
@ -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 <StoreState> or the <State>, because this can lead to destabilization of
|
|
||||||
* a state behavior.
|
|
||||||
* All ReStoreHub's must be marked as internal
|
|
||||||
*/
|
|
||||||
internal interface ReStoreHub<StoreState, State> {
|
|
||||||
fun getMiddleware(): Middleware<StoreState>
|
|
||||||
fun reduce(action: Action, domainState: StoreState): StoreState
|
|
||||||
}
|
|
||||||
|
|
||||||
internal interface ReStoreReducer<State> {
|
|
||||||
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<State>(
|
|
||||||
private val name: String,
|
|
||||||
private val dispatcher: CoroutineDispatcher = Executors.newFixedThreadPool(1).asCoroutineDispatcher(),
|
|
||||||
) : ReStoreHub<DomainState, State> {
|
|
||||||
|
|
||||||
val globalState: DomainGlobalState
|
|
||||||
get() = domainStore.state.globalState
|
|
||||||
|
|
||||||
val hubScope = CoroutineScope(
|
|
||||||
Job() + dispatcher + CoroutineName(name) + FeatureCoroutineExceptionHandler.create(name),
|
|
||||||
)
|
|
||||||
|
|
||||||
private val actionsAndJobs = mutableMapOf<Action, Job>()
|
|
||||||
|
|
||||||
override fun getMiddleware(): Middleware<DomainState> {
|
|
||||||
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<Action>)
|
|
||||||
protected abstract fun getReducer(): ReStoreReducer<State>
|
|
||||||
|
|
||||||
protected abstract fun getHubState(storeState: DomainState): State
|
|
||||||
protected abstract fun updateStoreState(storeState: DomainState, newHubState: State): DomainState
|
|
||||||
}
|
|
||||||
|
|
@ -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) } }
|
|
||||||
}
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
|
|
@ -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<DomainGlobalState>("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<Action>) {
|
|
||||||
if (action !is DomainGlobalAction) return
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getReducer(): ReStoreReducer<DomainGlobalState> = DomainGlobalReducer()
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DomainGlobalReducer : ReStoreReducer<DomainGlobalState> {
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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,
|
|
||||||
)
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue