From edb9b20b9e450edf536291bb7b48917439b3a882 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 16 Dec 2024 11:56:22 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../DefaultOnboardingMultiWalletComponent.kt | 7 ++ .../backup/model/MultiWalletBackupModel.kt | 7 +- .../Wallet1ScanPrimaryComponent.kt | 46 ++++++++++++ .../model/Wallet1ScanPrimaryModel.kt | 43 +++++++++++ .../scanprimary/ui/Wallet1ScanPrimary.kt | 74 +++++++++++++++++++ .../v2/multiwallet/impl/di/ComponentModule.kt | 6 ++ .../impl/model/OnboardingMultiWalletModel.kt | 10 ++- .../impl/model/OnboardingMultiWalletState.kt | 4 +- .../v2/multiwallet/impl/model/Utils.kt | 4 +- .../impl/ui/OnboardingMultiWallet.kt | 2 +- 10 files changed, 196 insertions(+), 7 deletions(-) create mode 100644 features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/Wallet1ScanPrimaryComponent.kt create mode 100644 features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/model/Wallet1ScanPrimaryModel.kt create mode 100644 features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/ui/Wallet1ScanPrimary.kt diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt index 9d853842ac..6e7321f878 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/DefaultOnboardingMultiWalletComponent.kt @@ -33,6 +33,7 @@ import com.tangem.features.onboarding.v2.multiwallet.impl.child.backup.MultiWall import com.tangem.features.onboarding.v2.multiwallet.impl.child.chooseoption.Wallet1ChooseOptionComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.createwallet.MultiWalletCreateWalletComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.finalize.MultiWalletFinalizeComponent +import com.tangem.features.onboarding.v2.multiwallet.impl.child.scanprimary.Wallet1ScanPrimaryComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.MultiWalletSeedPhraseComponent import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletModel import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletState @@ -59,6 +60,7 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor CreateWallet -> WalletArtworksState.Folded ChooseBackupOption -> WalletArtworksState.Fan SeedPhrase -> WalletArtworksState.Folded + ScanPrimary -> WalletArtworksState.Folded AddBackupDevice -> WalletArtworksState.Unfold(WalletArtworksState.Unfold.Step.First) Finalize -> WalletArtworksState.Stack() Done -> error("Done state should not be used as starting state") @@ -155,6 +157,11 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor backButtonClickFlow = backButtonClickFlow, onBack = { stackNavigation.pop() }, ) + ScanPrimary -> Wallet1ScanPrimaryComponent( + context = childContext, + params = childParams, + onDone = { handleNavigationEvent(AddBackupDevice) }, + ) AddBackupDevice -> MultiWalletBackupComponent( context = childContext, params = childParams, diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt index 77e8a58768..9d8fb21173 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/model/MultiWalletBackupModel.kt @@ -84,15 +84,16 @@ class MultiWalletBackupModel @Inject constructor( } private fun startBackupWallet() { - if (state.value.numberOfBackupCards == 0) { + if (state.value.numberOfBackupCards == 0 && scanResponse.primaryCard != null) { backupService.discardSavedBackup() } - val primaryCard = scanResponse.primaryCard + val primaryCard = scanResponse.primaryCard if (primaryCard != null) { backupService.setPrimaryCard(primaryCard) - addBackupCardWithService() } + + addBackupCardWithService() } private fun setNumberOfBackupCards(number: Int) { diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/Wallet1ScanPrimaryComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/Wallet1ScanPrimaryComponent.kt new file mode 100644 index 0000000000..a6d80fd63b --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/Wallet1ScanPrimaryComponent.kt @@ -0,0 +1,46 @@ +package com.tangem.features.onboarding.v2.multiwallet.impl.child.scanprimary + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.model.getOrCreateModel +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.features.onboarding.v2.impl.R +import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams +import com.tangem.features.onboarding.v2.multiwallet.impl.child.scanprimary.model.Wallet1ScanPrimaryModel +import com.tangem.features.onboarding.v2.multiwallet.impl.child.scanprimary.ui.Wallet1ScanPrimary +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +internal class Wallet1ScanPrimaryComponent( + context: AppComponentContext, + params: MultiWalletChildParams, + onDone: () -> Unit, +) : AppComponentContext by context, ComposableContentComponent { + + private val model: Wallet1ScanPrimaryModel = getOrCreateModel(params) + + init { + params.innerNavigation.update { + it.copy( + stackSize = 4, + stackMaxSize = 8, + ) + } + + params.parentParams.titleProvider.changeTitle( + text = resourceReference(R.string.onboarding_navbar_title_creating_backup), + ) + + componentScope.launch { model.onDone.collect { onDone() } } + } + + @Composable + override fun Content(modifier: Modifier) { + Wallet1ScanPrimary( + isRing = model.isRing, + onScanPrimaryClick = model::onScanPrimaryClick, + ) + } +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/model/Wallet1ScanPrimaryModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/model/Wallet1ScanPrimaryModel.kt new file mode 100644 index 0000000000..504e556fbc --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/model/Wallet1ScanPrimaryModel.kt @@ -0,0 +1,43 @@ +package com.tangem.features.onboarding.v2.multiwallet.impl.child.scanprimary.model + +import androidx.compose.runtime.Stable +import com.tangem.common.CompletionResult +import com.tangem.core.decompose.di.ComponentScoped +import com.tangem.core.decompose.model.Model +import com.tangem.core.decompose.model.ParamsContainer +import com.tangem.domain.common.util.cardTypesResolver +import com.tangem.features.onboarding.v2.impl.R +import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams +import com.tangem.sdk.api.BackupServiceHolder +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@Stable +@ComponentScoped +internal class Wallet1ScanPrimaryModel @Inject constructor( + paramsContainer: ParamsContainer, + override val dispatchers: CoroutineDispatcherProvider, + private val backupServiceHolder: BackupServiceHolder, +) : Model() { + + private val params = paramsContainer.require() + private val scanResponse = params.multiWalletState.value.currentScanResponse + + val isRing = scanResponse.cardTypesResolver.isRing() + val onDone = MutableSharedFlow() + + fun onScanPrimaryClick() { + val backupService = backupServiceHolder.backupService.get() ?: return + val iconScanRes = R.drawable.img_hand_scan_ring.takeIf { isRing } + backupService.readPrimaryCard(iconScanRes = iconScanRes, cardId = scanResponse.card.cardId) { result -> + when (result) { + is CompletionResult.Success -> { + modelScope.launch { onDone.emit(Unit) } + } + is CompletionResult.Failure -> Unit + } + } + } +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/ui/Wallet1ScanPrimary.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/ui/Wallet1ScanPrimary.kt new file mode 100644 index 0000000000..e15c5a640a --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/scanprimary/ui/Wallet1ScanPrimary.kt @@ -0,0 +1,74 @@ +package com.tangem.features.onboarding.v2.multiwallet.impl.child.scanprimary.ui + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.tangem.core.ui.components.PrimaryButtonIconEnd +import com.tangem.core.ui.extensions.stringResourceSafe +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.features.onboarding.v2.impl.R + +@Composable +internal fun Wallet1ScanPrimary(isRing: Boolean, onScanPrimaryClick: () -> Unit, modifier: Modifier = Modifier) { + Column( + modifier = modifier + .fillMaxSize() + .navigationBarsPadding(), + verticalArrangement = Arrangement.Bottom, + ) { + Column( + Modifier + .fillMaxWidth() + .padding(start = 32.dp, end = 32.dp, bottom = 16.dp) + .verticalScroll(rememberScrollState()) + .weight(1f), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + modifier = Modifier.padding(top = 16.dp), + text = stringResourceSafe(R.string.onboarding_title_scan_origin_card), + color = TangemTheme.colors.text.primary1, + textAlign = TextAlign.Center, + style = TangemTheme.typography.h2, + ) + + Text( + modifier = Modifier.padding(top = 12.dp), + text = stringResourceSafe(R.string.onboarding_subtitle_scan_primary), + color = TangemTheme.colors.text.secondary, + textAlign = TextAlign.Center, + style = TangemTheme.typography.body1, + ) + } + + PrimaryButtonIconEnd( + modifier = Modifier + .padding(start = 16.dp, end = 16.dp, bottom = 16.dp) + .fillMaxWidth(), + text = stringResourceSafe( + if (isRing) R.string.onboarding_button_backup_ring else R.string.onboarding_button_backup_origin, + ), + iconResId = R.drawable.ic_tangem_24, + onClick = onScanPrimaryClick, + ) + } +} + +@Preview +@Composable +private fun Preview() { + TangemThemePreview { + Wallet1ScanPrimary( + isRing = true, + onScanPrimaryClick = {}, + ) + } +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/di/ComponentModule.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/di/ComponentModule.kt index 1de409e3a2..1aee88709b 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/di/ComponentModule.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/di/ComponentModule.kt @@ -9,6 +9,7 @@ import com.tangem.features.onboarding.v2.multiwallet.impl.child.backup.model.Mul import com.tangem.features.onboarding.v2.multiwallet.impl.child.chooseoption.model.Wallet1ChooseOptionModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.createwallet.model.MultiWalletCreateWalletModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.finalize.model.MultiWalletFinalizeModel +import com.tangem.features.onboarding.v2.multiwallet.impl.child.scanprimary.model.Wallet1ScanPrimaryModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.model.MultiWalletSeedPhraseModel import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletModel import dagger.Binds @@ -66,4 +67,9 @@ internal interface ModelModule { @IntoMap @ClassKey(Wallet1ChooseOptionModel::class) fun provideModel7(model: Wallet1ChooseOptionModel): Model + + @Binds + @IntoMap + @ClassKey(Wallet1ScanPrimaryModel::class) + fun provideModel8(model: Wallet1ScanPrimaryModel): Model } \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt index 0b74c9f64f..ad4786a6b7 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletModel.kt @@ -103,11 +103,19 @@ internal class OnboardingMultiWalletModel @Inject constructor( } private fun getInitialStep(): OnboardingMultiWalletState.Step { - val card = params.scanResponse.card + val scanResponse = params.scanResponse + val card = scanResponse.card val backupService = backupServiceHolder.backupService.get()!! return when { + // interrupted backup backupService.hasIncompletedBackup -> OnboardingMultiWalletState.Step.Finalize + + // Add backup button + // Wallet1 without backup and userwallet's scanResponse doesn't contain primary card. + card.wallets.isNotEmpty() && card.backupStatus == CardDTO.BackupStatus.NoBackup && + scanResponse.primaryCard == null -> OnboardingMultiWalletState.Step.ScanPrimary + card.wallets.isNotEmpty() && card.backupStatus == CardDTO.BackupStatus.NoBackup -> OnboardingMultiWalletState.Step.AddBackupDevice card.wallets.isNotEmpty() && card.backupStatus?.isActive == true -> diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletState.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletState.kt index 294dd6049d..1906d6c2aa 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletState.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/OnboardingMultiWalletState.kt @@ -17,6 +17,8 @@ data class OnboardingMultiWalletState( /** * Wallet1 + * ScanPrimary -> | + * | * CreateWallet -> ChooseBackupOption -> AddBackupDevice -> Finalize -> [Done] * | * -> [Done] @@ -27,7 +29,7 @@ data class OnboardingMultiWalletState( * -> AddBackupDevice -> Finalize -> [Done] */ enum class Step { - CreateWallet, ChooseBackupOption, SeedPhrase, AddBackupDevice, Finalize, Done + CreateWallet, ChooseBackupOption, SeedPhrase, ScanPrimary, AddBackupDevice, Finalize, Done } @JvmInline diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/Utils.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/Utils.kt index 42d6d6046d..7c1d7416ed 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/Utils.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/model/Utils.kt @@ -7,7 +7,9 @@ import com.tangem.features.onboarding.v2.impl.R fun screenTitleByStep(step: OnboardingMultiWalletState.Step): TextReference = when (step) { OnboardingMultiWalletState.Step.CreateWallet -> resourceReference(R.string.onboarding_create_wallet_header) - OnboardingMultiWalletState.Step.AddBackupDevice -> + OnboardingMultiWalletState.Step.ScanPrimary, + OnboardingMultiWalletState.Step.AddBackupDevice, + -> resourceReference(R.string.onboarding_navbar_title_creating_backup) OnboardingMultiWalletState.Step.Finalize -> resourceReference(R.string.onboarding_button_finalize_backup) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt index 1baa1f9301..ae225a9f48 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/ui/OnboardingMultiWallet.kt @@ -51,7 +51,7 @@ internal fun OnboardingMultiWallet( modifier = Modifier .padding(horizontal = 34.dp) .padding(top = 20.dp) - .weight(.36f) + .weight(.4f) .fillMaxWidth(), state = artworksState, )