diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/entry/impl/DefaultOnboardingEntryComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/entry/impl/DefaultOnboardingEntryComponent.kt index 92229824bc..14cc6bf1b0 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/entry/impl/DefaultOnboardingEntryComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/entry/impl/DefaultOnboardingEntryComponent.kt @@ -83,7 +83,9 @@ internal class DefaultOnboardingEntryComponent @AssistedInject constructor( } } + @Suppress("MagicNumber") private fun linkToInnerNavigation() { + // stepper linking innerStack.observe { stack -> val activeChild = stack.active.instance if (activeChild is InnerNavigationHolder) { @@ -99,6 +101,15 @@ internal class DefaultOnboardingEntryComponent @AssistedInject constructor( } } }.saveIn(innerNavigationLinkJobHolder) + } else { + stepperComponent.state.update { + it.copy( + currentStep = if (stack.active.configuration is OnboardingRoute.ManageTokens) 7 else 8, + steps = 8, + title = model.titleProvider.currentTitle.value, + showProgress = true, + ) + } } } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/Wallet1ChooseOptionComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/Wallet1ChooseOptionComponent.kt index ce595d8c3f..c5f8c63d19 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/Wallet1ChooseOptionComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/Wallet1ChooseOptionComponent.kt @@ -1,15 +1,19 @@ package com.tangem.features.onboarding.v2.multiwallet.impl.child.chooseoption import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.extensions.resourceReference import com.tangem.features.onboarding.v2.impl.R import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams +import com.tangem.features.onboarding.v2.multiwallet.impl.child.chooseoption.model.Wallet1ChooseOptionModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.chooseoption.ui.Wallet1ChooseOption import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletState import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch class Wallet1ChooseOptionComponent( context: AppComponentContext, @@ -17,6 +21,8 @@ class Wallet1ChooseOptionComponent( private val onNextStep: (OnboardingMultiWalletState.Step) -> Unit, ) : AppComponentContext by context, MultiWalletChildComponent { + private val model: Wallet1ChooseOptionModel = getOrCreateModel(params) + init { params.innerNavigation.update { it.copy( @@ -28,6 +34,12 @@ class Wallet1ChooseOptionComponent( params.parentParams.titleProvider.changeTitle( text = resourceReference(R.string.onboarding_create_wallet_header), ) + + componentScope.launch { + model.returnToParentFlow.collect { + onNextStep(OnboardingMultiWalletState.Step.Done) + } + } } @Composable @@ -36,8 +48,10 @@ class Wallet1ChooseOptionComponent( onBackupClick = { onNextStep(OnboardingMultiWalletState.Step.AddBackupDevice) }, - onScipClick = { - onNextStep(OnboardingMultiWalletState.Step.Done) + onSkipClick = remember(model) { + { + model.onSkipClick() + } }, ) } diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/model/Wallet1ChooseOptionModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/model/Wallet1ChooseOptionModel.kt new file mode 100644 index 0000000000..d0c206de50 --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/model/Wallet1ChooseOptionModel.kt @@ -0,0 +1,62 @@ +package com.tangem.features.onboarding.v2.multiwallet.impl.child.chooseoption.model + +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.card.repository.CardRepository +import com.tangem.domain.models.scan.ScanResponse +import com.tangem.domain.wallets.builder.UserWalletBuilder +import com.tangem.domain.wallets.models.UserWallet +import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase +import com.tangem.domain.wallets.usecase.SaveWalletUseCase +import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@ComponentScoped +internal class Wallet1ChooseOptionModel @Inject constructor( + override val dispatchers: CoroutineDispatcherProvider, + paramsContainer: ParamsContainer, + private val generateWalletNameUseCase: GenerateWalletNameUseCase, + private val cardRepository: CardRepository, + private val saveWalletUseCase: SaveWalletUseCase, +) : Model() { + + private val params = paramsContainer.require() + private var skipClicked = false + val returnToParentFlow = MutableSharedFlow() + + fun onSkipClick() { + // TODO show confirmation dialog + + if (skipClicked) return + skipClicked = true + + modelScope.launch { + val scanResponse = params.multiWalletState.value.currentScanResponse + + val userWallet = createUserWallet(scanResponse) + saveWalletUseCase(userWallet, canOverride = true) + .onRight { + cardRepository.finishCardActivation(scanResponse.card.cardId) + + // save user wallet for manage tokens screen + params.multiWalletState.update { + it.copy(resultUserWallet = userWallet) + } + + returnToParentFlow.emit(Unit) + } + } + } + + private suspend fun createUserWallet(scanResponse: ScanResponse): UserWallet { + return requireNotNull( + value = UserWalletBuilder(scanResponse, generateWalletNameUseCase).build(), + lazyMessage = { "User wallet not created" }, + ) + } +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/ui/Wallet1ChooseOption.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/ui/Wallet1ChooseOption.kt index d2aa92ed93..049dd64f2b 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/ui/Wallet1ChooseOption.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/chooseoption/ui/Wallet1ChooseOption.kt @@ -14,7 +14,7 @@ import com.tangem.core.ui.res.TangemTheme import com.tangem.features.onboarding.v2.impl.R @Composable -fun Wallet1ChooseOption(onScipClick: () -> Unit, onBackupClick: () -> Unit, modifier: Modifier = Modifier) { +fun Wallet1ChooseOption(onSkipClick: () -> Unit, onBackupClick: () -> Unit, modifier: Modifier = Modifier) { Column( modifier = modifier .fillMaxSize() @@ -61,7 +61,7 @@ fun Wallet1ChooseOption(onScipClick: () -> Unit, onBackupClick: () -> Unit, modi .padding(start = 16.dp, end = 16.dp, bottom = 16.dp) .fillMaxWidth(), text = stringResource(R.string.onboarding_button_skip_backup), - onClick = onScipClick, + onClick = onSkipClick, ) } } \ 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 c34467c438..1de409e3a2 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 @@ -6,6 +6,7 @@ import com.tangem.features.onboarding.v2.multiwallet.api.OnboardingMultiWalletCo import com.tangem.features.onboarding.v2.multiwallet.impl.DefaultOnboardingMultiWalletComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.model.MultiWalletAccessCodeModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.backup.model.MultiWalletBackupModel +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.seedphrase.model.MultiWalletSeedPhraseModel @@ -60,4 +61,9 @@ internal interface ModelModule { @IntoMap @ClassKey(MultiWalletFinalizeModel::class) fun provideModel6(model: MultiWalletFinalizeModel): Model + + @Binds + @IntoMap + @ClassKey(Wallet1ChooseOptionModel::class) + fun provideModel7(model: Wallet1ChooseOptionModel): Model } \ No newline at end of file