Updated on 2026-08-14

This commit is contained in:
Tangem 2023-06-30 09:26:53 +08:00
parent 65ff4a4b49
commit 9112d2bab8
55 changed files with 492 additions and 389 deletions

View file

@ -7,6 +7,7 @@ import com.tangem.common.doOnFailure
import com.tangem.common.doOnSuccess
import com.tangem.core.analytics.Analytics
import com.tangem.core.analytics.AnalyticsEvent
import com.tangem.domain.card.CardTypeResolver
import com.tangem.domain.common.extensions.withMainContext
import com.tangem.domain.common.util.twinsIsTwinned
import com.tangem.domain.models.scan.ScanResponse
@ -22,6 +23,7 @@ import com.tangem.tap.features.disclaimer.redux.DisclaimerCallback
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
import com.tangem.tap.proxy.redux.DaggerGraphState
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@ -71,7 +73,11 @@ internal object LegacyScanProcessor {
tangemSdkManager.changeDisplayedCardIdNumbersCount(scanResponse)
onScanStateChange(false)
sendAnalytics(analyticsEvent, scanResponse)
sendAnalytics(
analyticsEvent = analyticsEvent,
scanResponse = scanResponse,
cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver),
)
showDisclaimerIfNeed(
scanResponse = scanResponse,
@ -89,10 +95,14 @@ internal object LegacyScanProcessor {
}
}
private fun sendAnalytics(analyticsEvent: AnalyticsEvent?, scanResponse: ScanResponse) {
private fun sendAnalytics(
analyticsEvent: AnalyticsEvent?,
scanResponse: ScanResponse,
cardTypeResolver: CardTypeResolver,
) {
analyticsEvent?.let {
// this workaround needed to send CardWasScannedEvent without adding a context
val interceptor = CardContextInterceptor(scanResponse)
val interceptor = CardContextInterceptor(scanResponse, cardTypeResolver)
val params = it.params.toMutableMap()
interceptor.intercept(params)
it.params = params.toMap()
@ -146,18 +156,25 @@ internal object LegacyScanProcessor {
) {
val globalState = store.state.globalState
val tapWalletManager = globalState.tapWalletManager
tapWalletManager.updateConfigManager(scanResponse)
tapWalletManager.updateConfigManager()
store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(scanResponse))
if (OnboardingHelper.isOnboardingCase(scanResponse)) {
Analytics.addContext(scanResponse)
val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver)
if (OnboardingHelper.isOnboardingCase(scanResponse, cardTypeResolver)) {
Analytics.addContext(
scanResponse = scanResponse,
cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver),
)
onWalletNotCreated()
store.dispatchOnMain(GlobalAction.Onboarding.Start(scanResponse, canSkipBackup = true))
val appScreen = OnboardingHelper.whereToNavigate(scanResponse)
navigateTo(appScreen) { onProgressStateChange(it) }
} else {
Analytics.setContext(scanResponse)
Analytics.setContext(
scanResponse = scanResponse,
cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver),
)
if (scanResponse.twinsIsTwinned() && !preferencesStorage.wasTwinsOnboardingShown()) {
onWalletNotCreated()
store.dispatchOnMain(TwinCardsAction.SetStepOfScreen(TwinCardsStep.WelcomeOnly(scanResponse)))

View file

@ -49,7 +49,12 @@ internal object UseCaseScanProcessor {
val chains = buildList {
add(ScanningFinishedChain { onScanStateChange(false) })
if (analyticsEvent != null) {
add(AnalyticsChain(analyticsEvent))
add(
AnalyticsChain(
event = analyticsEvent,
cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver),
),
)
}
add(DisclaimerChain(store, disclaimerWillShow))
add(CheckForOnboardingChain(store, store.state.globalState.tapWalletManager, preferencesStorage))

View file

@ -4,6 +4,7 @@ import arrow.core.Either
import arrow.core.right
import com.tangem.core.analytics.Analytics
import com.tangem.core.analytics.AnalyticsEvent
import com.tangem.domain.card.CardTypeResolver
import com.tangem.domain.card.ScanCardException
import com.tangem.domain.core.chain.Chain
import com.tangem.domain.models.scan.ScanResponse
@ -19,12 +20,16 @@ import com.tangem.tap.common.analytics.paramsInterceptor.CardContextInterceptor
*/
class AnalyticsChain(
private val event: AnalyticsEvent,
private val cardTypeResolver: CardTypeResolver,
) : Chain<ScanCardException.ChainException, ScanResponse> {
override suspend fun invoke(
previousChainResult: ScanResponse,
): Either<ScanCardException.ChainException, ScanResponse> {
val interceptor = CardContextInterceptor(previousChainResult)
val interceptor = CardContextInterceptor(
scanResponse = previousChainResult,
cardTypeResolver = cardTypeResolver,
)
val params = event.params.toMutableMap()
interceptor.intercept(params)
event.params = params.toMap()

View file

@ -20,6 +20,7 @@ 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
import com.tangem.tap.proxy.redux.DaggerGraphState
import kotlinx.coroutines.delay
import org.rekotlin.Store
@ -44,18 +45,25 @@ class CheckForOnboardingChain(
override suspend fun invoke(
previousChainResult: ScanResponse,
): Either<ScanCardException.ChainException, ScanResponse> {
tapWalletManager.updateConfigManager(previousChainResult)
tapWalletManager.updateConfigManager()
store.dispatchOnMain(TwinCardsAction.IfTwinsPrepareState(previousChainResult))
val cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver)
return when {
OnboardingHelper.isOnboardingCase(previousChainResult) -> {
Analytics.addContext(previousChainResult)
OnboardingHelper.isOnboardingCase(previousChainResult, cardTypeResolver) -> {
Analytics.addContext(
scanResponse = previousChainResult,
cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver),
)
store.dispatchOnMain(GlobalAction.Onboarding.Start(previousChainResult, canSkipBackup = true))
val appScreen = OnboardingHelper.whereToNavigate(previousChainResult)
ScanChainException.OnboardingNeeded(appScreen).left()
}
else -> {
Analytics.setContext(previousChainResult)
Analytics.setContext(
scanResponse = previousChainResult,
cardTypeResolver = store.state.daggerGraphState.get(DaggerGraphState::cardTypeResolver),
)
// If twins was twinned previously but twins welcome not shown
if (previousChainResult.twinsIsTwinned() && !preferencesStore.wasTwinsOnboardingShown()) {
store.dispatchOnMain(