Updated on 2026-08-14
This commit is contained in:
parent
3b9107f73f
commit
905905a64e
3 changed files with 97 additions and 19 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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 =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue