diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt b/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt
index da346fafa1..dbe2a76c91 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/TextFields.kt
@@ -44,6 +44,7 @@ fun OutlineTextField(
isError: Boolean = false,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions(),
+ visualTransformation: VisualTransformation = VisualTransformation.None,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) {
TangemTextField(
@@ -58,6 +59,7 @@ fun OutlineTextField(
isError = isError,
keyboardOptions = keyboardOptions,
keyboardActions = keyboardActions,
+ visualTransformation = visualTransformation,
interactionSource = interactionSource,
)
}
@@ -76,6 +78,8 @@ fun OutlineTextFieldWithIcon(
isError: Boolean = false,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions(),
+ visualTransformation: VisualTransformation = VisualTransformation.None,
+ caption: String? = null,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) {
TangemTextFieldWithIcon(
@@ -91,6 +95,8 @@ fun OutlineTextFieldWithIcon(
isError = isError,
keyboardOptions = keyboardOptions,
keyboardActions = keyboardActions,
+ visualTransformation = visualTransformation,
+ caption = caption,
interactionSource = interactionSource,
onIconClick = onIconClick,
)
@@ -189,15 +195,16 @@ private fun TangemTextField(
enter = fadeIn(),
exit = fadeOut(),
) {
- if (caption.isNullOrEmpty()) return@AnimatedVisibility
+ val captionWrapped = remember(this) { requireNotNull(caption) }
+
Column {
Spacer(modifier = Modifier.height(4.dp))
Text(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
- text = caption,
- style = TangemTheme.typography.body1,
+ text = captionWrapped,
+ style = TangemTheme.typography.caption2,
color = colors.captionColor(enabled = enabled, isError = isError).value,
)
}
@@ -218,6 +225,7 @@ private fun TangemTextFieldWithIcon(
placeholder: String? = null,
enabled: Boolean = true,
isError: Boolean = false,
+ caption: String? = null,
visualTransformation: VisualTransformation = VisualTransformation.None,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions(),
@@ -280,6 +288,26 @@ private fun TangemTextFieldWithIcon(
}
},
)
+
+ AnimatedVisibility(
+ visible = !caption.isNullOrEmpty(),
+ enter = fadeIn(),
+ exit = fadeOut(),
+ ) {
+ val captionWrapped = remember(this) { requireNotNull(caption) }
+
+ Column {
+ Spacer(modifier = Modifier.height(4.dp))
+ Text(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 16.dp),
+ text = captionWrapped,
+ style = TangemTheme.typography.caption2,
+ color = colors.captionColor(enabled = enabled, isError = isError).value,
+ )
+ }
+ }
}
}
diff --git a/core/ui/src/main/res/drawable/ic_eye_outline_24.xml b/core/ui/src/main/res/drawable/ic_eye_outline_24.xml
new file mode 100644
index 0000000000..fb8273fbf8
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_eye_outline_24.xml
@@ -0,0 +1,9 @@
+
+
+
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 138110ba57..5c03bc099f 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
@@ -38,8 +38,8 @@ import com.tangem.features.onboarding.v2.multiwallet.impl.ui.WalletArtworksState
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.*
+import kotlinx.coroutines.launch
internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor(
@Assisted private val context: AppComponentContext,
@@ -55,7 +55,7 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
ChooseBackupOption -> WalletArtworksState.Fan
SeedPhrase -> WalletArtworksState.Folded
AddBackupDevice -> WalletArtworksState.Unfold(WalletArtworksState.Unfold.Step.First)
- FinishBackup -> WalletArtworksState.Stack()
+ Finalize -> WalletArtworksState.Stack()
Done -> error("Done state should not be used as starting state")
},
)
@@ -107,6 +107,14 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
)
init {
+ componentScope.launch {
+ // access code bs result
+ childParams.multiWalletState
+ .map { it.accessCode }
+ .distinctUntilChanged()
+ .filter { it != null }
+ .collectLatest { handleNavigationEvent(Finalize) }
+ }
bottomSheetNavigation.navigate {}
}
@@ -144,7 +152,7 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
),
onEvent = ::handleBackupComponentEvent,
)
- FinishBackup -> TODO()
+ Finalize -> TODO()
Done -> TODO()
}
}
@@ -154,12 +162,12 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
ChooseBackupOption -> {
artworksState.value = WalletArtworksState.Fan
}
- SeedPhrase -> {
- }
+ SeedPhrase -> {}
AddBackupDevice -> {
artworksState.value = WalletArtworksState.Unfold(WalletArtworksState.Unfold.Step.First)
}
- FinishBackup -> {
+ Finalize -> {
+ artworksState.value = WalletArtworksState.Stack()
}
Done -> {
// TODO
@@ -172,7 +180,8 @@ internal class DefaultOnboardingMultiWalletComponent @AssistedInject constructor
private fun handleBackupComponentEvent(event: MultiWalletBackupComponent.Event) {
when (event) {
MultiWalletBackupComponent.Event.Done -> {
- // TODO navigate to finalize
+ artworksState.value = WalletArtworksState.Stack()
+ bottomSheetNavigation.navigate { }
}
MultiWalletBackupComponent.Event.OneDeviceAdded -> {
artworksState.value = WalletArtworksState.Unfold(WalletArtworksState.Unfold.Step.Second)
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/MultiWalletAccessCodeComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/MultiWalletAccessCodeComponent.kt
index 6f5d5748f4..9edd571b93 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/MultiWalletAccessCodeComponent.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/MultiWalletAccessCodeComponent.kt
@@ -12,36 +12,47 @@ import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams
import com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.model.MultiWalletAccessCodeModel
import com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.ui.MultiWalletAccessCodeBS
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
@Suppress("UnusedPrivateMember")
class MultiWalletAccessCodeComponent(
context: AppComponentContext,
- private val params: MultiWalletChildParams,
+ params: MultiWalletChildParams,
private val onDismiss: () -> Unit,
) : AppComponentContext by context, ComposableBottomSheetComponent {
- private val model = getOrCreateModel()
+ private val model: MultiWalletAccessCodeModel = getOrCreateModel(params)
+ private val showBs = MutableStateFlow(true)
init {
componentScope.launch {
model.onDismiss.collect {
+ showBs.value = false
+ delay(timeMillis = 500)
onDismiss()
}
}
}
override fun dismiss() {
- onDismiss()
+ componentScope.launch {
+ showBs.value = false
+ delay(timeMillis = 500)
+ onDismiss()
+ }
}
@Composable
override fun BottomSheet() {
val state by model.uiState.collectAsStateWithLifecycle()
- val bsConfig = remember(this) {
+ val showBs by showBs.collectAsStateWithLifecycle()
+
+ val bsConfig = remember(this, showBs) {
TangemBottomSheetConfig(
- isShow = true,
- onDismissRequest = onDismiss,
+ isShow = showBs,
+ onDismissRequest = { dismiss() },
content = TangemBottomSheetConfigContent.Empty,
)
}
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/model/MultiWalletAccessCodeModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/model/MultiWalletAccessCodeModel.kt
index ecef852fa0..2a5fc261bb 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/model/MultiWalletAccessCodeModel.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/model/MultiWalletAccessCodeModel.kt
@@ -1,8 +1,12 @@
package com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.model
+import androidx.compose.ui.text.input.TextFieldValue
import com.tangem.core.decompose.di.ComponentScoped
import com.tangem.core.decompose.model.Model
+import com.tangem.core.decompose.model.ParamsContainer
+import com.tangem.features.onboarding.v2.multiwallet.impl.child.MultiWalletChildParams
import com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.ui.state.MultiWalletAccessCodeUM
+import com.tangem.features.onboarding.v2.multiwallet.impl.model.OnboardingMultiWalletState
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -11,16 +15,26 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import javax.inject.Inject
+private const val MINIMUM_ACCESS_CODE_LENGTH = 4
+
@ComponentScoped
internal class MultiWalletAccessCodeModel @Inject constructor(
+ paramsContainer: ParamsContainer,
override val dispatchers: CoroutineDispatcherProvider,
) : Model() {
private val _uiState = MutableStateFlow(getInitialState())
+ private val params = paramsContainer.require()
val uiState = _uiState.asStateFlow()
val onDismiss = MutableSharedFlow()
+ init {
+ params.multiWalletState.update {
+ it.copy(accessCode = null)
+ }
+ }
+
fun onBack() {
when (_uiState.value.step) {
MultiWalletAccessCodeUM.Step.Intro -> {
@@ -28,33 +42,93 @@ internal class MultiWalletAccessCodeModel @Inject constructor(
}
MultiWalletAccessCodeUM.Step.AccessCode -> {
_uiState.update {
- it.copy(step = MultiWalletAccessCodeUM.Step.Intro)
+ it.copy(
+ step = MultiWalletAccessCodeUM.Step.Intro,
+ accessCodeFirst = TextFieldValue(""),
+ accessCodeSecond = TextFieldValue(""),
+ )
}
}
MultiWalletAccessCodeUM.Step.ConfirmAccessCode -> {
_uiState.update {
- it.copy(step = MultiWalletAccessCodeUM.Step.AccessCode)
+ it.copy(
+ step = MultiWalletAccessCodeUM.Step.AccessCode,
+ accessCodeSecond = TextFieldValue(""),
+ )
}
}
}
}
private fun getInitialState() = MultiWalletAccessCodeUM(
+ onAccessCodeFirstChange = ::onAccessCodeFirstChange,
+ onAccessCodeSecondChange = ::onAccessCodeSecondChange,
onContinue = ::onContinue,
+ onAccessCodeHideClick = ::onAccessCodeHideClick,
)
+ private fun onAccessCodeHideClick() {
+ _uiState.update {
+ it.copy(accessCodeHidden = !it.accessCodeHidden)
+ }
+ }
+
+ private fun onAccessCodeFirstChange(textFieldValue: TextFieldValue) {
+ _uiState.update {
+ it.copy(
+ accessCodeFirst = textFieldValue,
+ atLeast4CharError = false,
+ )
+ }
+ }
+
+ private fun onAccessCodeSecondChange(textFieldValue: TextFieldValue) {
+ _uiState.update {
+ it.copy(
+ accessCodeSecond = textFieldValue,
+ codesNotMatchError = false,
+ )
+ }
+ }
+
private fun onContinue() {
when (_uiState.value.step) {
MultiWalletAccessCodeUM.Step.Intro -> {
_uiState.update { it.copy(step = MultiWalletAccessCodeUM.Step.AccessCode) }
}
MultiWalletAccessCodeUM.Step.AccessCode -> {
- _uiState.update { it.copy(step = MultiWalletAccessCodeUM.Step.ConfirmAccessCode) }
+ if (_uiState.value.accessCodeFirst.text.length >= MINIMUM_ACCESS_CODE_LENGTH) {
+ _uiState.update {
+ it.copy(
+ step = MultiWalletAccessCodeUM.Step.ConfirmAccessCode,
+ atLeast4CharError = false,
+ )
+ }
+ } else {
+ _uiState.update {
+ it.copy(atLeast4CharError = true)
+ }
+ }
}
MultiWalletAccessCodeUM.Step.ConfirmAccessCode -> {
- // TODO check
- modelScope.launch { onDismiss.emit(Unit) }
+ if (checkAccessCode()) {
+ params.multiWalletState.update {
+ it.copy(accessCode = OnboardingMultiWalletState.AccessCode(uiState.value.accessCodeFirst.text))
+ }
+ modelScope.launch { onDismiss.emit(Unit) }
+ }
}
}
}
+
+ private fun checkAccessCode(): Boolean {
+ if (_uiState.value.accessCodeFirst.text == _uiState.value.accessCodeSecond.text) {
+ return true
+ } else {
+ _uiState.update {
+ it.copy(codesNotMatchError = true)
+ }
+ return false
+ }
+ }
}
\ No newline at end of file
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/MultiWalletAccessCodeEnter.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/MultiWalletAccessCodeEnter.kt
index ff0ac3f8ea..4aa51c8e79 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/MultiWalletAccessCodeEnter.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/MultiWalletAccessCodeEnter.kt
@@ -3,16 +3,23 @@ package com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.ui
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.input.PasswordVisualTransformation
+import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import com.tangem.core.ui.components.OutlineTextField
+import com.tangem.core.ui.components.OutlineTextFieldWithIcon
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.features.onboarding.v2.impl.R
import com.tangem.features.onboarding.v2.multiwallet.impl.child.accesscode.ui.state.MultiWalletAccessCodeUM
+import kotlinx.coroutines.delay
@Composable
internal fun MultiWalletAccessCodeEnter(
@@ -43,8 +50,19 @@ internal fun MultiWalletAccessCodeEnter(
style = TangemTheme.typography.body1,
)
- OutlineTextField(
- modifier = modifier.fillMaxWidth(),
+ val focusRequester = remember { FocusRequester() }
+
+ OutlineTextFieldWithIcon(
+ modifier = modifier
+ .focusRequester(focusRequester)
+ .fillMaxWidth(),
+ iconResId = if (state.accessCodeHidden) {
+ R.drawable.ic_eye_outline_24
+ } else {
+ R.drawable.ic_eye_off_outline_24
+ },
+ iconColor = TangemTheme.colors.icon.primary1,
+ onIconClick = state.onAccessCodeHideClick,
value = if (reEnterAccessCodeState) {
state.accessCodeSecond
} else {
@@ -56,13 +74,25 @@ internal fun MultiWalletAccessCodeEnter(
state.onAccessCodeFirstChange
},
label = stringResource(id = R.string.onboarding_wallet_info_title_third),
- isError = state.codesNotMatchError,
- caption = if (state.codesNotMatchError && reEnterAccessCodeState) {
- stringResource(R.string.onboarding_access_codes_doesnt_match)
+ isError = state.codesNotMatchError || state.atLeast4CharError,
+ visualTransformation = if (state.accessCodeHidden) {
+ PasswordVisualTransformation()
} else {
- null
+ VisualTransformation.None
+ },
+ caption = when {
+ state.codesNotMatchError && reEnterAccessCodeState ->
+ stringResource(R.string.onboarding_access_codes_doesnt_match)
+ state.atLeast4CharError && !reEnterAccessCodeState ->
+ stringResource(R.string.onboarding_access_code_too_short)
+ else -> null
},
)
+
+ LaunchedEffect(Unit) {
+ delay(timeMillis = 200)
+ focusRequester.requestFocus()
+ }
}
}
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/state/MultiWalletAccessCodeUM.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/state/MultiWalletAccessCodeUM.kt
index 17db94bafd..33d4b95d3a 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/state/MultiWalletAccessCodeUM.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/accesscode/ui/state/MultiWalletAccessCodeUM.kt
@@ -7,9 +7,12 @@ internal data class MultiWalletAccessCodeUM(
val accessCodeFirst: TextFieldValue = TextFieldValue(""),
val accessCodeSecond: TextFieldValue = TextFieldValue(""),
val codesNotMatchError: Boolean = false,
+ val atLeast4CharError: Boolean = false,
+ val accessCodeHidden: Boolean = true,
val onAccessCodeFirstChange: (TextFieldValue) -> Unit = {},
val onAccessCodeSecondChange: (TextFieldValue) -> Unit = {},
val onContinue: () -> Unit = {},
+ val onAccessCodeHideClick: () -> Unit = {},
) {
enum class Step {
Intro,
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
new file mode 100644
index 0000000000..17fbfe3699
--- /dev/null
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/MultiWalletFinalizeComponent.kt
@@ -0,0 +1,22 @@
+package com.tangem.features.onboarding.v2.multiwallet.impl.child.finalize
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import com.tangem.core.decompose.context.AppComponentContext
+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.model.OnboardingMultiWalletState
+import kotlinx.coroutines.flow.SharedFlow
+
+@Suppress("UnusedPrivateMember")
+internal class MultiWalletFinalizeComponent(
+ context: AppComponentContext,
+ params: MultiWalletChildParams,
+ onNextStep: (OnboardingMultiWalletState.Step) -> Unit,
+ backButtonClickFlow: SharedFlow,
+) : AppComponentContext by context, MultiWalletChildComponent {
+
+ @Composable
+ override fun Content(modifier: Modifier) {
+ }
+}
\ No newline at end of file
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/state/MultiWalletFinalizeUM.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/state/MultiWalletFinalizeUM.kt
new file mode 100644
index 0000000000..9029c7c231
--- /dev/null
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/state/MultiWalletFinalizeUM.kt
@@ -0,0 +1,10 @@
+package com.tangem.features.onboarding.v2.multiwallet.impl.child.finalize.state
+
+data class MultiWalletFinalizeUM(
+ val step: Step = Step.Device1,
+ val cardNumber: String = "",
+) {
+ enum class Step {
+ Device1, Device2, Device3
+ }
+}
\ No newline at end of file
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/ui/MultiWalletFinalize.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/ui/MultiWalletFinalize.kt
new file mode 100644
index 0000000000..e9bbecfa82
--- /dev/null
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/finalize/ui/MultiWalletFinalize.kt
@@ -0,0 +1,22 @@
+package com.tangem.features.onboarding.v2.multiwallet.impl.child.finalize.ui
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.navigationBarsPadding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import com.tangem.features.onboarding.v2.multiwallet.impl.child.finalize.state.MultiWalletFinalizeUM
+
+@Suppress("UnusedPrivateMember")
+@Composable
+fun MultiWalletFinalize(state: MultiWalletFinalizeUM, modifier: Modifier = Modifier) {
+ Column(
+ modifier = modifier
+ .fillMaxSize()
+ .navigationBarsPadding(),
+ verticalArrangement = Arrangement.Bottom,
+ ) {
+ // TODO
+ }
+}
\ No newline at end of file
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhrase.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhrase.kt
index 985a7b68e4..3ac5e6a920 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhrase.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/multiwallet/impl/child/seedphrase/ui/MultiWalletSeedPhrase.kt
@@ -12,7 +12,7 @@ internal fun MultiWalletSeedPhrase(state: MultiWalletSeedPhraseUM, modifier: Mod
AnimatedContent(
modifier = modifier.navigationBarsPadding(),
targetState = state,
- transitionSpec = TangemAnimations.AnimatedContent.slide { from, to -> to.order > from.order },
+ transitionSpec = TangemAnimations.AnimatedContent.slide { from, to -> to.order < from.order },
contentKey = { st -> st::class.java },
label = "animatedContent",
) { st ->
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 2cb99f6ed2..279cd55454 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
@@ -25,6 +25,7 @@ internal class OnboardingMultiWalletModel @Inject constructor(
OnboardingMultiWalletState(
currentStep = getInitialStep(),
currentScanResponse = params.scanResponse,
+ accessCode = null,
),
)
@@ -47,7 +48,7 @@ internal class OnboardingMultiWalletModel @Inject constructor(
card.wallets.isNotEmpty() && card.backupStatus == CardDTO.BackupStatus.NoBackup ->
OnboardingMultiWalletState.Step.AddBackupDevice
card.wallets.isNotEmpty() && card.backupStatus?.isActive == true ->
- OnboardingMultiWalletState.Step.FinishBackup
+ OnboardingMultiWalletState.Step.Finalize
else ->
OnboardingMultiWalletState.Step.CreateWallet
}
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 14260553a8..47833e1a76 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
@@ -4,20 +4,24 @@ import com.tangem.domain.models.scan.ScanResponse
data class OnboardingMultiWalletState(
val currentStep: Step,
+ val accessCode: AccessCode?,
val currentScanResponse: ScanResponse,
) {
/**
* Wallet1
- * CreateWallet -> ChooseBackupOption -> AddBackupDevice -> FinishBackup -> [Done]
+ * CreateWallet -> ChooseBackupOption -> AddBackupDevice -> Finalize -> [Done]
* |
* -> [Done]
*
* Wallet2/Ring
* CreateWallet -> SeedPhrase -> AddBackupDevice -> FinishBackup -> [Done]
* |
- * -> AddBackupDevice -> FinishBackup -> [Done]
+ * -> AddBackupDevice -> Finalize -> [Done]
*/
enum class Step {
- CreateWallet, ChooseBackupOption, SeedPhrase, AddBackupDevice, FinishBackup, Done
+ CreateWallet, ChooseBackupOption, SeedPhrase, AddBackupDevice, Finalize, Done
}
+
+ @JvmInline
+ value class AccessCode(val accessCode: String)
}
\ No newline at end of file
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 ec2a1c3848..77db1fa129 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
@@ -11,6 +11,6 @@ fun screenTitleByStep(step: OnboardingMultiWalletState.Step): TextReference = wh
OnboardingMultiWalletState.Step.SeedPhrase -> TODO()
OnboardingMultiWalletState.Step.AddBackupDevice ->
resourceReference(R.string.onboarding_navbar_title_creating_backup)
- OnboardingMultiWalletState.Step.FinishBackup -> TODO()
+ OnboardingMultiWalletState.Step.Finalize -> TODO()
OnboardingMultiWalletState.Step.Done -> TODO()
}
\ No newline at end of file