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 13ce5f806a..0cc5d5aa77 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 @@ -62,22 +62,16 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor ) } + private val innerNavigationStateFlow = MutableStateFlow( + MultiWalletInnerNavigationState(1, 5), + ) + private val childParams = MultiWalletChildParams( multiWalletState = model.state, parentParams = params, + innerNavigation = innerNavigationStateFlow, ) - override val innerNavigation: InnerNavigation = object : InnerNavigation { - override val state = MutableStateFlow( - MultiWalletInnerNavigationState(1, 5), - ) - - override fun pop(onComplete: (Boolean) -> Unit) { - // TODO add warning dialog - stackNavigation.pop(onComplete) - } - } - private val childStack: Value> = childStack( key = "innerStack", @@ -93,6 +87,22 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor }, ) + val backButtonClickFlow = MutableSharedFlow() + override val innerNavigation: InnerNavigation = object : InnerNavigation { + override val state = innerNavigationStateFlow + + override fun pop(onComplete: (Boolean) -> Unit) { + when (childStack.active.configuration) { + CreateWallet -> { } // TODO show dialog + ChooseBackupOption -> { } // TODO show dialog + SeedPhrase -> { componentScope.launch { backButtonClickFlow.emit(Unit) } } + AddBackupDevice -> {} + Finalize -> {} + Done -> {} + } + } + } + private val bottomSheetNavigation = SlotNavigation() private val accessCodeBottomSheetSlot = childSlot( source = bottomSheetNavigation, @@ -110,7 +120,6 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor init { componentScope.launch { // access code bs result - // TODO delete and use callback childParams.multiWalletState .map { it.accessCode } .distinctUntilChanged() @@ -131,13 +140,15 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor ) ChooseBackupOption -> Wallet1ChooseOptionComponent( context = childContext, + params = childParams, onNextStep = ::handleNavigationEvent, ) SeedPhrase -> MultiWalletSeedPhraseComponent( context = childContext, params = childParams, onNextStep = ::handleNavigationEvent, - backButtonClickFlow = MutableSharedFlow(), // TODO + backButtonClickFlow = backButtonClickFlow, + onBack = { stackNavigation.pop() }, ) AddBackupDevice -> MultiWalletBackupComponent( context = childContext, @@ -157,22 +168,26 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor when (nextStep) { ChooseBackupOption -> { artworksState.value = WalletArtworksState.Fan + stackNavigation.navigate { listOf(nextStep) } } AddBackupDevice -> { artworksState.value = WalletArtworksState.Unfold(WalletArtworksState.Unfold.Step.First) + stackNavigation.navigate { listOf(nextStep) } } Finalize -> { artworksState.value = WalletArtworksState.Stack(threeCards = model.state.value.isThreeCards) + stackNavigation.navigate { listOf(nextStep) } + } + SeedPhrase -> { + stackNavigation.push(nextStep) } Done -> { // final step - navigate to parent val userWallet = childParams.multiWalletState.value.resultUserWallet ?: return params.onDone(userWallet) - return } else -> return } - stackNavigation.push(nextStep) } private fun handleBackupComponentEvent(event: MultiWalletBackupComponent.Event) { diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt index 3e2d3bffb3..f912a9b20c 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/MultiWalletChildParams.kt @@ -1,10 +1,12 @@ package com.tangem.features.onboarding.v2.multiwallet.impl.child import com.tangem.features.onboarding.v2.multiwallet.api.OnboardingMultiWalletComponent +import com.tangem.features.onboarding.v2.multiwallet.impl.MultiWalletInnerNavigationState import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletState import kotlinx.coroutines.flow.MutableStateFlow class MultiWalletChildParams( val multiWalletState: MutableStateFlow, + val innerNavigation: MutableStateFlow, val parentParams: OnboardingMultiWalletComponent.Params, ) \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/MultiWalletBackupComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/MultiWalletBackupComponent.kt index a60cfcb3fa..a38f4c6a9a 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/MultiWalletBackupComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/backup/MultiWalletBackupComponent.kt @@ -12,6 +12,7 @@ import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChild import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildComponent import com.tangem.features.onboarding.v2.multiwallet.impl.child.backup.model.MultiWalletBackupModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.backup.ui.MultiWalletBackup +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @Suppress("UnusedPrivateMember") @@ -24,6 +25,13 @@ class MultiWalletBackupComponent( private val model: MultiWalletBackupModel = getOrCreateModel(params) init { + params.innerNavigation.update { + it.copy( + stackSize = 5, + stackMaxSize = 8, + ) + } + params.parentParams.titleProvider.changeTitle( text = resourceReference(R.string.onboarding_navbar_title_creating_backup), ) 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 11b7cacc0e..ce595d8c3f 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 @@ -3,15 +3,33 @@ package com.tangem.features.onboarding.v2.multiwallet.impl.child.chooseoption import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.tangem.core.decompose.context.AppComponentContext +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.ui.Wallet1ChooseOption import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletState +import kotlinx.coroutines.flow.update class Wallet1ChooseOptionComponent( context: AppComponentContext, + params: MultiWalletChildParams, private val onNextStep: (OnboardingMultiWalletState.Step) -> Unit, ) : AppComponentContext by context, MultiWalletChildComponent { + init { + params.innerNavigation.update { + it.copy( + stackSize = 3, + stackMaxSize = 8, + ) + } + + params.parentParams.titleProvider.changeTitle( + text = resourceReference(R.string.onboarding_create_wallet_header), + ) + } + @Composable override fun Content(modifier: Modifier) { Wallet1ChooseOption( diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/MultiWalletCreateWalletComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/MultiWalletCreateWalletComponent.kt index 3f68118904..f23f57f93a 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/MultiWalletCreateWalletComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/createwallet/MultiWalletCreateWalletComponent.kt @@ -13,6 +13,7 @@ import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChild import com.tangem.features.onboarding.v2.multiwallet.impl.child.createwallet.model.MultiWalletCreateWalletModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.createwallet.ui.MultiWalletCreateWallet import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletState +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch internal class MultiWalletCreateWalletComponent( @@ -24,6 +25,13 @@ internal class MultiWalletCreateWalletComponent( private val model: MultiWalletCreateWalletModel = getOrCreateModel(params) init { + params.innerNavigation.update { + it.copy( + stackSize = 2, + stackMaxSize = 8, + ) + } + params.parentParams.titleProvider.changeTitle( text = resourceReference(R.string.onboarding_create_wallet_header), ) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/MultiWalletFinalizeComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/MultiWalletFinalizeComponent.kt index a28e590923..c6ebe6cd81 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/MultiWalletFinalizeComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/MultiWalletFinalizeComponent.kt @@ -6,10 +6,13 @@ import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.finalize.model.MultiWalletFinalizeModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.finalize.ui.MultiWalletFinalize +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @Suppress("UnusedPrivateMember") @@ -22,6 +25,16 @@ internal class MultiWalletFinalizeComponent( private val model: MultiWalletFinalizeModel = getOrCreateModel(params) init { + params.innerNavigation.update { + it.copy( + stackSize = 7, + stackMaxSize = 8, + ) + } + params.parentParams.titleProvider.changeTitle( + resourceReference(R.string.onboarding_button_finalize_backup), + ) + componentScope.launch { model.onEvent.collect { onEvent(it) diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/MultiWalletSeedPhraseComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/MultiWalletSeedPhraseComponent.kt index ce23af89e5..2a9df6122b 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/MultiWalletSeedPhraseComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/MultiWalletSeedPhraseComponent.kt @@ -13,12 +13,16 @@ import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.seedphrase.model.MultiWalletSeedPhraseModel import com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.ui.MultiWalletSeedPhrase +import com.tangem.features.onboarding.v2.multiwallet.impl.child.seedphrase.ui.state.MultiWalletSeedPhraseUM import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletState import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @Suppress("UnusedPrivateMember") @@ -26,12 +30,36 @@ internal class MultiWalletSeedPhraseComponent( context: AppComponentContext, params: MultiWalletChildParams, onNextStep: (OnboardingMultiWalletState.Step) -> Unit, + onBack: () -> Unit, backButtonClickFlow: SharedFlow, ) : AppComponentContext by context, MultiWalletChildComponent { private val model: MultiWalletSeedPhraseModel = getOrCreateModel(params) init { + componentScope.launch { + model.uiState.collect { + // change stepper state based on the stack of the current step + @Suppress("MagicNumber") + params.innerNavigation.update { st -> + st.copy( + stackSize = 3 + it.order, + stackMaxSize = 10, + ) + } + + val title = when (it) { + is MultiWalletSeedPhraseUM.Import -> R.string.onboarding_seed_intro_button_import + is MultiWalletSeedPhraseUM.GenerateSeedPhrase, + is MultiWalletSeedPhraseUM.GeneratedWordsCheck, + is MultiWalletSeedPhraseUM.Start, + -> R.string.onboarding_create_wallet_header + } + + params.parentParams.titleProvider.changeTitle(text = resourceReference(title)) + } + } + componentScope.launch { backButtonClickFlow.collect { model.onBack() } } @@ -39,7 +67,7 @@ internal class MultiWalletSeedPhraseComponent( model.onDone.collect { onNextStep(OnboardingMultiWalletState.Step.AddBackupDevice) } } componentScope.launch { - model.navigateBack.collect { onNextStep(OnboardingMultiWalletState.Step.CreateWallet) } + model.navigateBack.collect { onBack() } } } 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 571ce10b03..42d6d6046d 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,10 +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.ChooseBackupOption -> TODO() - OnboardingMultiWalletState.Step.SeedPhrase -> TODO() OnboardingMultiWalletState.Step.AddBackupDevice -> resourceReference(R.string.onboarding_navbar_title_creating_backup) - OnboardingMultiWalletState.Step.Finalize -> TODO() - OnboardingMultiWalletState.Step.Done -> error("No title for Done step") + OnboardingMultiWalletState.Step.Finalize -> + resourceReference(R.string.onboarding_button_finalize_backup) + else -> error("No title for the step") } \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt index 65a86ac4d1..543671a35c 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/stepper/impl/DefaultOnboardingStepperComponent.kt @@ -17,7 +17,6 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -import timber.log.Timber internal class DefaultOnboardingStepperComponent @AssistedInject constructor( @Assisted val context: AppComponentContext, @@ -28,15 +27,6 @@ internal class DefaultOnboardingStepperComponent @AssistedInject constructor( override val state = instanceKeeper.getOrCreateSimple { MutableStateFlow(params.initState) } - init { - componentScope.launch { - state.collect { - // TODO - Timber.tag("ASDASD").d("State: $it") - } - } - } - private fun openSupport() { componentScope.launch { val cardInfo = getCardInfoUseCase(params.scanResponse).getOrNull() ?: return@launch