Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-26 17:39:58 +03:00
parent 266ff4e96a
commit 2bc1fe2c8f
9 changed files with 111 additions and 30 deletions

View file

@ -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<OnboardingMultiWalletState.Step, ComposableContentComponent>> =
childStack(
key = "innerStack",
@ -93,6 +87,22 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
},
)
val backButtonClickFlow = MutableSharedFlow<Unit>()
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<Unit>()
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) {

View file

@ -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<OnboardingMultiWalletState>,
val innerNavigation: MutableStateFlow<MultiWalletInnerNavigationState>,
val parentParams: OnboardingMultiWalletComponent.Params,
)

View file

@ -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),
)

View file

@ -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(

View file

@ -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),
)

View file

@ -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)

View file

@ -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<Unit>,
) : 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() }
}
}

View file

@ -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")
}

View file

@ -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