Updated on 2026-08-14

This commit is contained in:
Tangem 2025-09-16 17:40:53 +05:00
parent 3b9107f73f
commit 905905a64e
3 changed files with 97 additions and 19 deletions

View file

@ -134,6 +134,20 @@ internal object WalletsDomainModule {
) )
} }
@Provides
@Singleton
fun providesIsWalletAlreadySavedUseCase(
userWalletsListManager: UserWalletsListManager,
userWalletsListRepository: UserWalletsListRepository,
hotWalletFeatureToggles: HotWalletFeatureToggles,
): IsWalletAlreadySavedUseCase {
return IsWalletAlreadySavedUseCase(
userWalletsListManager = userWalletsListManager,
userWalletsListRepository = userWalletsListRepository,
useNewRepository = hotWalletFeatureToggles.isHotWalletEnabled,
)
}
@Provides @Provides
@Singleton @Singleton
fun providesOpenBuyTangemCardUseCase(): GenerateBuyTangemCardLinkUseCase { fun providesOpenBuyTangemCardUseCase(): GenerateBuyTangemCardLinkUseCase {

View file

@ -0,0 +1,32 @@
package com.tangem.domain.wallets.usecase
import arrow.core.Either
import arrow.core.raise.either
import com.tangem.domain.core.wallets.UserWalletsListRepository
import com.tangem.domain.core.wallets.error.SaveWalletError
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.wallets.legacy.UserWalletsListManager
class IsWalletAlreadySavedUseCase(
private val userWalletsListManager: UserWalletsListManager,
private val userWalletsListRepository: UserWalletsListRepository,
private val useNewRepository: Boolean,
) {
suspend operator fun invoke(
userWallet: UserWallet,
canOverride: Boolean = false,
): Either<SaveWalletError, Boolean> {
return if (useNewRepository) {
either {
userWalletsListRepository.userWalletsSync()
.any { it.walletId == userWallet.walletId }
}
} else {
either {
userWalletsListManager.userWalletsSync
.any { it.walletId == userWallet.walletId }
}
}
}
}

View file

@ -1,18 +1,28 @@
package com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.model package com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.model
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import arrow.core.getOrElse
import com.tangem.common.CompletionResult import com.tangem.common.CompletionResult
import com.tangem.common.core.TangemSdkError import com.tangem.common.core.TangemSdkError
import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.di.GlobalUiMessageSender
import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.ui.UiMessageSender
import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.navigation.url.UrlOpener
import com.tangem.core.ui.R
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.crypto.bip39.Mnemonic import com.tangem.crypto.bip39.Mnemonic
import com.tangem.domain.card.repository.CardRepository import com.tangem.domain.card.repository.CardRepository
import com.tangem.domain.feedback.GetWalletMetaInfoUseCase import com.tangem.domain.feedback.GetWalletMetaInfoUseCase
import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase
import com.tangem.domain.feedback.models.FeedbackEmailType import com.tangem.domain.feedback.models.FeedbackEmailType
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.wallets.builder.ColdUserWalletBuilder
import com.tangem.domain.wallets.usecase.IsWalletAlreadySavedUseCase
import com.tangem.features.hotwallet.MnemonicRepository import com.tangem.features.hotwallet.MnemonicRepository
import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent
import com.tangem.features.onboarding.v2.common.ui.OnboardingDialogUM import com.tangem.features.onboarding.v2.common.ui.OnboardingDialogUM
@ -47,6 +57,9 @@ internal class MultiWalletSeedPhraseModel @Inject constructor(
private val getWalletMetaInfoUseCase: GetWalletMetaInfoUseCase, private val getWalletMetaInfoUseCase: GetWalletMetaInfoUseCase,
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
private val analyticsHandler: AnalyticsEventHandler, private val analyticsHandler: AnalyticsEventHandler,
private val isWalletAlreadySavedUseCase: IsWalletAlreadySavedUseCase,
private val coldUserWalletBuilderFactory: ColdUserWalletBuilder.Factory,
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
) : Model() { ) : Model() {
private val params = paramsContainer.require<MultiWalletChildParams>() private val params = paramsContainer.require<MultiWalletChildParams>()
@ -198,30 +211,42 @@ internal class MultiWalletSeedPhraseModel @Inject constructor(
when (result) { when (result) {
is CompletionResult.Success -> { is CompletionResult.Success -> {
analyticsHandler.send( val updatedScanResponse = multiWalletState.value.currentScanResponse.copy(
OnboardingEvent.CreateWallet.WalletCreatedSuccessfully( card = result.data.card,
creationType = if (generatedSeedPhrase) { derivedKeys = result.data.derivedKeys,
OnboardingEvent.CreateWallet.WalletCreationType.NewSeed primaryCard = result.data.primaryCard,
} else {
OnboardingEvent.CreateWallet.WalletCreationType.SeedImport
},
seedPhraseLength = mnemonic.mnemonicComponents.size,
),
) )
multiWalletState.update { val wallet = createUserWallet(updatedScanResponse)
it.copy(
currentScanResponse = it.currentScanResponse.copy( val isWalletAlreadySaved = isWalletAlreadySavedUseCase
card = result.data.card, .invoke(wallet)
derivedKeys = result.data.derivedKeys, .getOrElse { false }
primaryCard = result.data.primaryCard,
if (!isWalletAlreadySaved) {
analyticsHandler.send(
OnboardingEvent.CreateWallet.WalletCreatedSuccessfully(
creationType = if (generatedSeedPhrase) {
OnboardingEvent.CreateWallet.WalletCreationType.NewSeed
} else {
OnboardingEvent.CreateWallet.WalletCreationType.SeedImport
},
seedPhraseLength = mnemonic.mnemonicComponents.size,
), ),
) )
multiWalletState.update {
it.copy(currentScanResponse = updatedScanResponse)
}
cardRepository.startCardActivation(cardId = result.data.card.cardId)
onDone.emit(Unit)
} else {
uiMessageSender.send(
SnackbarMessage(resourceReference(R.string.hw_import_seed_phrase_already_imported)),
)
} }
cardRepository.startCardActivation(cardId = result.data.card.cardId)
onDone.emit(Unit)
} }
is CompletionResult.Failure -> { is CompletionResult.Failure -> {
if (result.error is TangemSdkError.WalletAlreadyCreated) { if (result.error is TangemSdkError.WalletAlreadyCreated) {
@ -255,6 +280,13 @@ internal class MultiWalletSeedPhraseModel @Inject constructor(
} }
} }
private fun createUserWallet(scanResponse: ScanResponse): UserWallet.Cold {
return requireNotNull(
value = coldUserWalletBuilderFactory.create(scanResponse = scanResponse).build(),
lazyMessage = { "User wallet not created" },
)
}
fun navigateToSupportScreen() { fun navigateToSupportScreen() {
modelScope.launch { modelScope.launch {
val cardInfo = val cardInfo =