Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-24 10:58:42 +03:00
parent 7bec897552
commit 200d7d4c3a
13 changed files with 26 additions and 144 deletions

View file

@ -1,4 +0,0 @@
{
"isTopUpEnabled": true,
"isCreatingTwinCardsAllowed": true
}

View file

@ -1,4 +0,0 @@
{
"isTopUpEnabled": true,
"isCreatingTwinCardsAllowed": true
}

View file

@ -4,10 +4,7 @@ import com.tangem.blockchain.common.Token
import com.tangem.blockchain.common.Wallet
import com.tangem.core.analytics.Analytics
import com.tangem.core.analytics.models.Basic
import com.tangem.datasource.config.ConfigManager
import com.tangem.domain.common.extensions.withMainContext
import com.tangem.domain.common.util.cardTypesResolver
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.operations.attestation.Attestation
import com.tangem.tap.common.extensions.setContext
@ -50,7 +47,6 @@ class TapWalletManager(
tangemSdkManager.changeDisplayedCardIdNumbersCount(scanResponse)
updateConfigManager(scanResponse)
withMainContext {
// Order is important
store.dispatch(TwinCardsAction.IfTwinsPrepareState(scanResponse))
@ -58,16 +54,6 @@ class TapWalletManager(
store.dispatch(GlobalAction.SetIfCardVerifiedOnline(!attestationFailed))
}
}
fun updateConfigManager(data: ScanResponse) {
val configManager = store.state.globalState.configManager
if (data.cardTypesResolver.isStart2Coin()) {
configManager?.turnOff(ConfigManager.IS_TOP_UP_ENABLED)
} else {
configManager?.resetToDefault(ConfigManager.IS_TOP_UP_ENABLED)
}
}
}
fun Wallet.getFirstToken(): Token? = getTokens().toList().getOrNull(index = 0)

View file

@ -132,10 +132,6 @@ internal object LegacyScanProcessor {
crossinline onWalletNotCreated: suspend () -> Unit,
crossinline onSuccess: suspend (ScanResponse) -> Unit,
) {
val globalState = store.state.globalState
val tapWalletManager = globalState.tapWalletManager
tapWalletManager.updateConfigManager(scanResponse)
store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(scanResponse))
if (OnboardingHelper.isOnboardingCase(scanResponse)) {

View file

@ -60,7 +60,7 @@ internal object UseCaseScanProcessor {
)
add(AnalyticsChain(Basic.CardWasScanned(analyticsSource)))
add(DisclaimerChain(store, disclaimerWillShow))
add(CheckForOnboardingChain(store, store.state.globalState.tapWalletManager))
add(CheckForOnboardingChain(store))
}
scanCardUseCase(cardId, afterScanChains = chains).fold(

View file

@ -16,7 +16,6 @@ import com.tangem.tap.common.extensions.inject
import com.tangem.tap.common.extensions.setContext
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.domain.TapWalletManager
import com.tangem.tap.features.onboarding.OnboardingHelper
import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsAction
import com.tangem.tap.features.onboarding.products.twins.redux.TwinCardsStep
@ -32,17 +31,14 @@ import org.rekotlin.Store
* - [ScanChainException.OnboardingNeeded] if onboarding required.
*
* @param store the [Store] that holds the state of the app.
* @param tapWalletManager manager responsible for handling operations related to the Wallet.
*
* @see Chain for more information about the Chain interface.
*/
class CheckForOnboardingChain(
private val store: Store<AppState>,
private val tapWalletManager: TapWalletManager,
) : ResultChain<ScanCardException, ScanResponse>() {
override suspend fun launch(previousChainResult: ScanResponse): ScanChainResult {
tapWalletManager.updateConfigManager(previousChainResult)
store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(previousChainResult))
return when {

View file

@ -11,13 +11,4 @@ interface ConfigManager {
val config: Config
suspend fun load(configLoader: Loader<ConfigModel>, onComplete: ((config: Config) -> Unit)? = null)
fun turnOff(name: String)
fun resetToDefault(name: String)
companion object {
const val IS_CREATING_TWIN_CARDS_ALLOWED = "isCreatingTwinCardsAllowed"
const val IS_TOP_UP_ENABLED = "isTopUpEnabled"
}
}

View file

@ -1,12 +1,9 @@
package com.tangem.datasource.config
import com.tangem.blockchain.common.*
import com.tangem.datasource.config.ConfigManager.Companion.IS_CREATING_TWIN_CARDS_ALLOWED
import com.tangem.datasource.config.ConfigManager.Companion.IS_TOP_UP_ENABLED
import com.tangem.datasource.config.models.Config
import com.tangem.datasource.config.models.ConfigModel
import com.tangem.datasource.config.models.ConfigValueModel
import com.tangem.datasource.config.models.FeatureModel
import javax.inject.Inject
import javax.inject.Singleton
@ -16,59 +13,21 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager {
override var config: Config = Config()
private set
private var defaultConfig = Config()
override suspend fun load(configLoader: Loader<ConfigModel>, onComplete: ((config: Config) -> Unit)?) {
configLoader.load { configModel ->
setupFeature(configModel.features)
setupConfigValues(configModel.configValues)
onComplete?.invoke(config)
}
}
override fun turnOff(name: String) {
when (name) {
IS_TOP_UP_ENABLED -> config = config.copy(isTopUpEnabled = false)
IS_CREATING_TWIN_CARDS_ALLOWED -> config = config.copy(isCreatingTwinCardsAllowed = false)
}
}
override fun resetToDefault(name: String) {
when (name) {
IS_TOP_UP_ENABLED -> {
config = config.copy(isTopUpEnabled = defaultConfig.isTopUpEnabled)
}
IS_CREATING_TWIN_CARDS_ALLOWED -> {
config = config.copy(isCreatingTwinCardsAllowed = defaultConfig.isCreatingTwinCardsAllowed)
}
else -> Unit
}
}
private fun setupFeature(featureModel: FeatureModel?) {
val model = featureModel ?: return
config = config.copy(
isTopUpEnabled = model.isTopUpEnabled,
isCreatingTwinCardsAllowed = model.isCreatingTwinCardsAllowed,
)
defaultConfig = defaultConfig.copy(
isTopUpEnabled = model.isTopUpEnabled,
isCreatingTwinCardsAllowed = model.isCreatingTwinCardsAllowed,
)
}
private fun setupConfigValues(configValues: ConfigValueModel?) {
val values = configValues ?: return
config = createConfig(config, values)
defaultConfig = config.copy()
}
private fun createConfig(config: Config, configValues: ConfigValueModel): Config {
return config.copy(
coinMarketCapKey = configValues.coinMarketCapKey,
moonPayApiKey = configValues.moonPayApiKey,
moonPayApiSecretKey = configValues.moonPayApiSecretKey,
mercuryoWidgetId = configValues.mercuryoWidgetId,
@ -105,9 +64,7 @@ internal class ConfigManagerImpl @Inject constructor() : ConfigManager {
koinosProApiKey = configValues.koinosProApiKey,
),
amplitudeApiKey = configValues.amplitudeApiKey,
sprinklr = configValues.sprinklr,
walletConnectProjectId = configValues.walletConnectProjectId,
tangemComAuthorization = configValues.tangemComAuthorization,
express = configValues.express,
devExpress = configValues.devExpress,
stakeKitApiKey = configValues.stakeKitApiKey,

View file

@ -3,7 +3,6 @@ package com.tangem.datasource.config
import com.tangem.datasource.asset.loader.AssetLoader
import com.tangem.datasource.config.models.ConfigModel
import com.tangem.datasource.config.models.ConfigValueModel
import com.tangem.datasource.config.models.FeatureModel
/**
[REDACTED_AUTHOR]
@ -13,12 +12,10 @@ class FeaturesLocalLoader(
buildEnvironment: String,
) : Loader<ConfigModel> {
private val featuresName = "features_$buildEnvironment"
private val configValuesName = "tangem-app-config/config_$buildEnvironment"
override suspend fun load(onComplete: (ConfigModel) -> Unit) {
ConfigModel(
features = assetLoader.load<FeatureModel>(fileName = featuresName),
configValues = assetLoader.load<ConfigValueModel>(fileName = configValuesName),
).also(onComplete)
}

View file

@ -1,13 +0,0 @@
package com.tangem.datasource.config.models
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
sealed interface ChatConfig
@JsonClass(generateAdapter = true)
data class SprinklrConfig(
@Json(name = "appID") val appId: String,
@Json(name = "apiKey") val apiKey: String,
@Json(name = "environment") val environment: String,
) : ChatConfig

View file

@ -3,19 +3,14 @@ package com.tangem.datasource.config.models
import com.tangem.blockchain.common.BlockchainSdkConfig
data class Config(
val coinMarketCapKey: String = "f6622117-c043-47a0-8975-9d673ce484de",
val moonPayApiKey: String = "pk_test_kc90oYTANy7UQdBavDKGfL4K9l6VEPE",
val moonPayApiSecretKey: String = "sk_test_V8w4M19LbDjjYOt170s0tGuvXAgyEb1C",
val mercuryoWidgetId: String = "",
val mercuryoSecret: String = "",
val amplitudeApiKey: String = "",
val blockchainSdkConfig: BlockchainSdkConfig = BlockchainSdkConfig(),
val isTopUpEnabled: Boolean = false,
@Deprecated("Not relevant since version 3.23")
val isCreatingTwinCardsAllowed: Boolean = false,
val sprinklr: SprinklrConfig? = null,
val walletConnectProjectId: String = "",
val tangemComAuthorization: String? = null,
val express: ExpressModel? = null,
val devExpress: ExpressModel? = null,
val stakeKitApiKey: String? = null,

View file

@ -3,47 +3,35 @@ package com.tangem.datasource.config.models
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
/**
[REDACTED_AUTHOR]
*/
// TODO remove
class FeatureModel(
val isTopUpEnabled: Boolean,
val isCreatingTwinCardsAllowed: Boolean,
)
@Suppress("LongParameterList")
@JsonClass(generateAdapter = true)
class ConfigValueModel(
val coinMarketCapKey: String,
val mercuryoWidgetId: String,
val mercuryoSecret: String,
val moonPayApiKey: String,
val moonPayApiSecretKey: String,
val blockchairApiKeys: List<String>,
val blockchairAuthorizationToken: String?,
val quiknodeSubdomain: String,
val quiknodeApiKey: String,
val bscQuiknodeSubdomain: String,
val bscQuiknodeApiKey: String,
val nowNodesApiKey: String,
@Json(name = "mercuryoWidgetId") val mercuryoWidgetId: String,
@Json(name = "mercuryoSecret") val mercuryoSecret: String,
@Json(name = "moonPayApiKey") val moonPayApiKey: String,
@Json(name = "moonPayApiSecretKey") val moonPayApiSecretKey: String,
@Json(name = "blockchairApiKeys") val blockchairApiKeys: List<String>,
@Json(name = "blockchairAuthorizationToken") val blockchairAuthorizationToken: String?,
@Json(name = "quiknodeSubdomain") val quiknodeSubdomain: String,
@Json(name = "quiknodeApiKey") val quiknodeApiKey: String,
@Json(name = "bscQuiknodeSubdomain") val bscQuiknodeSubdomain: String,
@Json(name = "bscQuiknodeApiKey") val bscQuiknodeApiKey: String,
@Json(name = "nowNodesApiKey") val nowNodesApiKey: String,
@Json(name = "getBlockAccessTokens") val getBlockAccessTokens: GetBlockAccessTokens?,
@Json(name = "tonCenterApiKey") val tonCenterKeys: TonCenterKeys,
val blockcypherTokens: Set<String>?,
val infuraProjectId: String?,
val sprinklr: SprinklrConfig?,
val tronGridApiKey: String,
val amplitudeApiKey: String,
val kaspaSecondaryApiUrl: String,
val walletConnectProjectId: String,
val tangemComAuthorization: String?,
val chiaFireAcademyApiKey: String?,
val chiaTangemApiKey: String?,
val devExpress: ExpressModel?,
val express: ExpressModel?,
@Json(name = "blockcypherTokens") val blockcypherTokens: Set<String>?,
@Json(name = "infuraProjectId") val infuraProjectId: String?,
@Json(name = "tronGridApiKey") val tronGridApiKey: String,
@Json(name = "amplitudeApiKey") val amplitudeApiKey: String,
@Json(name = "kaspaSecondaryApiUrl") val kaspaSecondaryApiUrl: String,
@Json(name = "walletConnectProjectId") val walletConnectProjectId: String,
@Json(name = "chiaFireAcademyApiKey") val chiaFireAcademyApiKey: String?,
@Json(name = "chiaTangemApiKey") val chiaTangemApiKey: String?,
@Json(name = "devExpress") val devExpress: ExpressModel?,
@Json(name = "express") val express: ExpressModel?,
@Json(name = "hederaArkhiaKey") val hederaArkhiaKey: String?,
val polygonScanApiKey: String?,
val stakeKitApiKey: String?,
@Json(name = "polygonScanApiKey") val polygonScanApiKey: String?,
@Json(name = "stakeKitApiKey") val stakeKitApiKey: String?,
@Json(name = "bittensorDwellirKey") val bittensorDwellirApiKey: String?,
@Json(name = "bittensorOnfinalityKey") val bittensorOnfinalityKey: String?,
@Json(name = "koinosProApiKey") val koinosProApiKey: String?,
@ -89,10 +77,9 @@ data class GetBlockToken(
)
class ConfigModel(
val features: FeatureModel?,
val configValues: ConfigValueModel?,
) {
companion object {
fun empty(): ConfigModel = ConfigModel(null, null)
fun empty(): ConfigModel = ConfigModel(null)
}
}

View file

@ -19,6 +19,4 @@ internal class MockConfigManager : ConfigManager {
)
override suspend fun load(configLoader: Loader<ConfigModel>, onComplete: ((config: Config) -> Unit)?) = Unit
override fun turnOff(name: String) = Unit
override fun resetToDefault(name: String) = Unit
}