Updated on 2026-08-14
This commit is contained in:
parent
266ff4e96a
commit
2bc1fe2c8f
9 changed files with 111 additions and 30 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
@ -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),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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() }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue