Updated on 2026-08-14

This commit is contained in:
Tangem 2025-01-21 13:32:44 +03:00
parent 780686645b
commit 5b841dbac5
13 changed files with 235 additions and 54 deletions

View file

@ -5,11 +5,17 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.tangem.common.CompletionResult
import com.tangem.common.core.TangemSdkError
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.models.event.OnboardingAnalyticsEvent
import com.tangem.core.decompose.di.ComponentScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.ui.UiMessageSender
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.toWrappedList
import com.tangem.core.ui.message.dialog.Dialogs
import com.tangem.domain.card.repository.CardSdkConfigRepository
import com.tangem.domain.feedback.SendFeedbackEmailUseCase
import com.tangem.domain.feedback.models.FeedbackEmailType
import com.tangem.domain.models.scan.ProductType
import com.tangem.features.onboarding.v2.impl.R
import com.tangem.features.onboarding.v2.multiwallet.impl.analytics.OnboardingEvent
@ -21,6 +27,7 @@ import com.tangem.features.onboarding.v2.multiwallet.impl.child.backup.ui.resetB
import com.tangem.features.onboarding.v2.multiwallet.impl.child.backup.ui.state.MultiWalletBackupUM
import com.tangem.sdk.api.BackupServiceHolder
import com.tangem.sdk.api.TangemSdkManager
import com.tangem.sdk.extensions.localizedDescriptionRes
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
@ -31,13 +38,16 @@ import javax.inject.Inject
@Stable
@ComponentScoped
@Suppress("LongParameterList")
class MultiWalletBackupModel @Inject constructor(
paramsContainer: ParamsContainer,
override val dispatchers: CoroutineDispatcherProvider,
private val backupServiceHolder: BackupServiceHolder,
private val cardSdkConfigRepository: CardSdkConfigRepository,
private val tangemSdkManager: TangemSdkManager,
private val analyticsHandler: AnalyticsEventHandler,
private val analyticsEventHandler: AnalyticsEventHandler,
private val uiMessageSender: UiMessageSender,
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
) : Model() {
@Suppress("UnusedPrivateMember")
@ -65,10 +75,10 @@ class MultiWalletBackupModel @Inject constructor(
init {
// for wallet 1 this event is sent in Wallet1ChooseOptionModel
if (scanResponse.productType == ProductType.Wallet2 || scanResponse.productType == ProductType.Ring) {
analyticsHandler.send(OnboardingEvent.Backup.ScreenOpened)
analyticsEventHandler.send(OnboardingEvent.Backup.ScreenOpened)
}
analyticsHandler.send(OnboardingEvent.Backup.Started)
analyticsEventHandler.send(OnboardingEvent.Backup.Started)
}
private fun getInitState(): MultiWalletBackupUM {
@ -153,7 +163,7 @@ class MultiWalletBackupModel @Inject constructor(
modelScope.launch { eventFlow.emit(MultiWalletBackupComponent.Event.Done) }
analyticsHandler.send(OnboardingEvent.Backup.Finished(cardsCount = state.value.numberOfBackupCards + 1))
analyticsEventHandler.send(OnboardingEvent.Backup.Finished(cardsCount = state.value.numberOfBackupCards + 1))
}
private fun showOnlyOneBackupWarningDialog() {
@ -203,6 +213,7 @@ class MultiWalletBackupModel @Inject constructor(
}
is CompletionResult.Failure -> {
when (val error = result.error) {
is TangemSdkError.CardVerificationFailed -> showCardVerificationFailedDialog(error)
is TangemSdkError.BackupFailedNotEmptyWallets -> {
_uiState.update { st ->
st.copy(
@ -212,7 +223,7 @@ class MultiWalletBackupModel @Inject constructor(
_uiState.update { it.copy(dialog = null) }
},
onDismissClick = {
analyticsHandler.send(OnboardingEvent.Backup.ResetCancelEvent)
analyticsEventHandler.send(OnboardingEvent.Backup.ResetCancelEvent)
},
),
)
@ -234,8 +245,27 @@ class MultiWalletBackupModel @Inject constructor(
}
}
private fun showCardVerificationFailedDialog(error: TangemSdkError.CardVerificationFailed) {
analyticsEventHandler.send(event = OnboardingAnalyticsEvent.Onboarding.OfflineAttestationFailed)
val resource = error.localizedDescriptionRes()
val resId = resource.resId ?: com.tangem.core.ui.R.string.common_unknown_error
val resArgs = resource.args.map { it.value }
uiMessageSender.send(
message = Dialogs.cardVerificationFailed(
errorDescription = resourceReference(id = resId, resArgs.toWrappedList()),
onRequestSupport = {
modelScope.launch {
sendFeedbackEmailUseCase(type = FeedbackEmailType.CardAttestationFailed)
}
},
),
)
}
private fun resetBackupCard(cardId: String) {
analyticsHandler.send(OnboardingEvent.Backup.ResetPerformEvent)
analyticsEventHandler.send(OnboardingEvent.Backup.ResetPerformEvent)
modelScope.launch {
tangemSdkManager.resetToFactorySettings(