diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/model/OnboardingSeedPhraseState.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/model/OnboardingSeedPhraseState.kt new file mode 100644 index 0000000000..f1bffaeb72 --- /dev/null +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/model/OnboardingSeedPhraseState.kt @@ -0,0 +1,65 @@ +package com.tangem.feature.onboarding.presentation.wallet2.model + +import androidx.annotation.StringRes +import androidx.compose.ui.text.input.TextFieldValue +import com.tangem.feature.onboarding.domain.SeedPhraseError + +/** +[REDACTED_AUTHOR] + */ +data class OnboardingSeedPhraseState( + val step: OnboardingSeedPhraseStep = OnboardingSeedPhraseStep.Intro, + val introState: IntroState = IntroState(), + val aboutState: AboutState = AboutState(), + val yourSeedPhraseState: YourSeedPhraseState = YourSeedPhraseState(), + val checkSeedPhraseState: CheckSeedPhraseState = CheckSeedPhraseState(), + val importSeedPhraseState: ImportSeedPhraseState = ImportSeedPhraseState(), + val menuButtonChat: ButtonState = ButtonState(), + val isOnboardingFinished: Boolean = false, +) + +enum class OnboardingSeedPhraseStep { + Intro, AboutSeedPhrase, YourSeedPhrase, CheckSeedPhrase, ImportSeedPhrase +} + +data class IntroState( + val buttonCreateWallet: ButtonState = ButtonState(), + val buttonOtherOptions: ButtonState = ButtonState(), +) + +data class AboutState( + val buttonReadMoreAboutSeedPhrase: ButtonState = ButtonState(), + val buttonGenerateSeedPhrase: ButtonState = ButtonState(), + val buttonImportSeedPhrase: ButtonState = ButtonState(), +) + +data class YourSeedPhraseState( + val mnemonicComponents: List = listOf(), + val buttonContinue: ButtonState = ButtonState(), +) + +data class CheckSeedPhraseState( + val tvSecondPhrase: TextFieldState = TextFieldState(), + val tvSeventhPhrase: TextFieldState = TextFieldState(), + val tvEleventhPhrase: TextFieldState = TextFieldState(), + val buttonCreateWallet: ButtonState = ButtonState(), +) + +data class ImportSeedPhraseState( + val tvSeedPhrase: TextFieldState = TextFieldState(), + val invalidWords: Set = emptySet(), + val suggestionsList: List = emptyList(), + val error: SeedPhraseError? = null, + val onSuggestedPhraseClick: (Int) -> Unit = {}, + val buttonCreateWallet: ButtonState = ButtonState(), +) + +data class TextFieldState( + val textFieldValue: TextFieldValue = TextFieldValue(), + val label: String? = null, + @StringRes val labelRes: Int? = null, + val isError: Boolean = false, + val isFocused: Boolean = false, + val onTextFieldValueChanged: (TextFieldValue) -> Unit = {}, + val onFocusChanged: (Boolean) -> Unit = {}, +) \ No newline at end of file diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/model/UiActions.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/model/UiActions.kt new file mode 100644 index 0000000000..59b9bfe541 --- /dev/null +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/model/UiActions.kt @@ -0,0 +1,54 @@ +package com.tangem.feature.onboarding.presentation.wallet2.model + +import androidx.compose.ui.text.input.TextFieldValue + +/** +[REDACTED_AUTHOR] + */ +data class UiActions( + val introActions: IntroUiAction = IntroUiAction(), + val aboutActions: AboutUiAction = AboutUiAction(), + val yourSeedPhraseActions: YourSeedPhraseUiAction = YourSeedPhraseUiAction(), + val checkSeedPhraseActions: CheckSeedPhraseUiAction = CheckSeedPhraseUiAction(), + val importSeedPhraseActions: ImportSeedPhraseUiAction = ImportSeedPhraseUiAction(), + val menuChatClick: () -> Unit = {}, +) + +data class IntroUiAction( + val buttonCreateWalletClick: () -> Unit = {}, + val buttonOtherOptionsClick: () -> Unit = {}, +) + +data class AboutUiAction( + val buttonReadMoreAboutSeedPhraseClick: () -> Unit = {}, + val buttonGenerateSeedPhraseClick: () -> Unit = {}, + val buttonImportSeedPhraseClick: () -> Unit = {}, +) + +data class YourSeedPhraseUiAction( + val buttonContinueClick: () -> Unit = {}, +) + +data class CheckSeedPhraseUiAction( + val secondTextFieldAction: TextFieldUiAction = TextFieldUiAction(), + val seventhTextFieldAction: TextFieldUiAction = TextFieldUiAction(), + val eleventhTextFieldAction: TextFieldUiAction = TextFieldUiAction(), + val buttonCreateWalletClick: () -> Unit = {}, +) + +data class ImportSeedPhraseUiAction( + val phraseTextFieldAction: TextFieldUiAction = TextFieldUiAction(), + val suggestedPhraseClick: (Int) -> Unit = {}, + val buttonCreateWalletClick: () -> Unit = {}, +) + +data class TextFieldUiAction( + val onFocusChanged: (Boolean) -> Unit = { }, + val onTextFieldChanged: (TextFieldValue) -> Unit = { }, +) + +enum class SeedPhraseField { + Second, + Seventh, + Eleventh, +} \ No newline at end of file diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/StateBuilder.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/StateBuilder.kt new file mode 100644 index 0000000000..171e780b26 --- /dev/null +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/StateBuilder.kt @@ -0,0 +1,211 @@ +package com.tangem.feature.onboarding.presentation.wallet2.ui + +import androidx.compose.ui.text.input.TextFieldValue +import com.tangem.feature.onboarding.presentation.wallet2.model.AboutState +import com.tangem.feature.onboarding.presentation.wallet2.model.ButtonState +import com.tangem.feature.onboarding.presentation.wallet2.model.CheckSeedPhraseState +import com.tangem.feature.onboarding.presentation.wallet2.model.ImportSeedPhraseState +import com.tangem.feature.onboarding.presentation.wallet2.model.IntroState +import com.tangem.feature.onboarding.presentation.wallet2.model.OnboardingSeedPhraseState +import com.tangem.feature.onboarding.presentation.wallet2.model.OnboardingSeedPhraseStep +import com.tangem.feature.onboarding.presentation.wallet2.model.SeedPhraseField +import com.tangem.feature.onboarding.presentation.wallet2.model.TextFieldState +import com.tangem.feature.onboarding.presentation.wallet2.model.UiActions +import com.tangem.feature.onboarding.presentation.wallet2.model.YourSeedPhraseState + +/** +[REDACTED_AUTHOR] + */ +class StateBuilder( + private val uiActions: UiActions, +) { + + val checkSeedPhrase: CheckSeedPhraseStateBuilder = CheckSeedPhraseStateBuilder() + + fun init(): OnboardingSeedPhraseState = OnboardingSeedPhraseState( + step = OnboardingSeedPhraseStep.Intro, + introState = IntroState( + buttonCreateWallet = ButtonState( + onClick = uiActions.introActions.buttonCreateWalletClick, + ), + buttonOtherOptions = ButtonState( + onClick = uiActions.introActions.buttonOtherOptionsClick, + ), + ), + aboutState = AboutState( + buttonReadMoreAboutSeedPhrase = ButtonState( + onClick = uiActions.aboutActions.buttonReadMoreAboutSeedPhraseClick, + ), + buttonGenerateSeedPhrase = ButtonState( + onClick = uiActions.aboutActions.buttonGenerateSeedPhraseClick, + ), + buttonImportSeedPhrase = ButtonState( + onClick = uiActions.aboutActions.buttonImportSeedPhraseClick, + ), + ), + yourSeedPhraseState = YourSeedPhraseState( + buttonContinue = ButtonState( + onClick = uiActions.yourSeedPhraseActions.buttonContinueClick, + ), + ), + checkSeedPhraseState = CheckSeedPhraseState( + tvSecondPhrase = TextFieldState( + label = "2", + isFocused = true, + onTextFieldValueChanged = uiActions.checkSeedPhraseActions.secondTextFieldAction.onTextFieldChanged, + onFocusChanged = uiActions.checkSeedPhraseActions.secondTextFieldAction.onFocusChanged, + ), + tvSeventhPhrase = TextFieldState( + label = "7", + isFocused = false, + onTextFieldValueChanged = uiActions.checkSeedPhraseActions.seventhTextFieldAction.onTextFieldChanged, + onFocusChanged = uiActions.checkSeedPhraseActions.seventhTextFieldAction.onFocusChanged, + ), + tvEleventhPhrase = TextFieldState( + label = "11", + isFocused = false, + onTextFieldValueChanged = uiActions.checkSeedPhraseActions.eleventhTextFieldAction.onTextFieldChanged, + onFocusChanged = uiActions.checkSeedPhraseActions.eleventhTextFieldAction.onFocusChanged, + ), + buttonCreateWallet = ButtonState( + enabled = false, + onClick = uiActions.checkSeedPhraseActions.buttonCreateWalletClick, + ), + ), + importSeedPhraseState = ImportSeedPhraseState( + tvSeedPhrase = TextFieldState( + onTextFieldValueChanged = uiActions.importSeedPhraseActions.phraseTextFieldAction.onTextFieldChanged, + onFocusChanged = uiActions.importSeedPhraseActions.phraseTextFieldAction.onFocusChanged, + ), + onSuggestedPhraseClick = uiActions.importSeedPhraseActions.suggestedPhraseClick, + buttonCreateWallet = ButtonState( + enabled = false, + onClick = uiActions.importSeedPhraseActions.buttonCreateWalletClick, + ), + ), + menuButtonChat = ButtonState( + onClick = uiActions.menuChatClick, + ), + ) + + fun changeStep( + uiState: OnboardingSeedPhraseState, + step: OnboardingSeedPhraseStep, + ): OnboardingSeedPhraseState = uiState.copy( + step = step, + ) + + fun generateMnemonicComponents( + uiState: OnboardingSeedPhraseState, + ): OnboardingSeedPhraseState { + return uiState.copy( + aboutState = uiState.aboutState.copy( + buttonGenerateSeedPhrase = uiState.aboutState.buttonGenerateSeedPhrase.copy( + showProgress = true, + ), + buttonImportSeedPhrase = uiState.aboutState.buttonImportSeedPhrase.copy( + enabled = false, + ), + ), + ) + } + + fun mnemonicGenerated( + uiState: OnboardingSeedPhraseState, + mnemonicComponents: List, + ): OnboardingSeedPhraseState { + return updateMnemonicComponents(uiState, mnemonicComponents) + .copy( + step = OnboardingSeedPhraseStep.YourSeedPhrase, + aboutState = uiState.aboutState.copy( + buttonGenerateSeedPhrase = uiState.aboutState.buttonGenerateSeedPhrase.copy( + showProgress = false, + ), + buttonImportSeedPhrase = uiState.aboutState.buttonImportSeedPhrase.copy( + enabled = true, + ), + ), + ) + } + + fun updateMnemonicComponents( + uiState: OnboardingSeedPhraseState, + phraseList: List, + ): OnboardingSeedPhraseState = uiState.copy( + yourSeedPhraseState = uiState.yourSeedPhraseState.copy( + mnemonicComponents = phraseList, + ), + ) +} + +class CheckSeedPhraseStateBuilder { + + fun updateTextField( + uiState: OnboardingSeedPhraseState, + field: SeedPhraseField, + textFieldValue: TextFieldValue, + ): OnboardingSeedPhraseState = when (field) { + SeedPhraseField.Second -> uiState.copy( + checkSeedPhraseState = uiState.checkSeedPhraseState.copy( + tvSecondPhrase = uiState.checkSeedPhraseState.tvSecondPhrase.copy( + textFieldValue = textFieldValue, + ), + ), + ) + SeedPhraseField.Seventh -> uiState.copy( + checkSeedPhraseState = uiState.checkSeedPhraseState.copy( + tvSeventhPhrase = uiState.checkSeedPhraseState.tvSeventhPhrase.copy( + textFieldValue = textFieldValue, + ), + ), + ) + SeedPhraseField.Eleventh -> uiState.copy( + checkSeedPhraseState = uiState.checkSeedPhraseState.copy( + tvEleventhPhrase = uiState.checkSeedPhraseState.tvEleventhPhrase.copy( + textFieldValue = textFieldValue, + ), + ), + ) + } + + fun updateTextFieldError( + uiState: OnboardingSeedPhraseState, + field: SeedPhraseField, + hasError: Boolean, + ): OnboardingSeedPhraseState = when (field) { + SeedPhraseField.Second -> uiState.copy( + checkSeedPhraseState = uiState.checkSeedPhraseState.copy( + tvSecondPhrase = uiState.checkSeedPhraseState.tvSecondPhrase.copy( + isError = hasError, + ), + ), + ) + SeedPhraseField.Seventh -> uiState.copy( + checkSeedPhraseState = uiState.checkSeedPhraseState.copy( + tvSeventhPhrase = uiState.checkSeedPhraseState.tvSeventhPhrase.copy( + isError = hasError, + ), + ), + ) + SeedPhraseField.Eleventh -> uiState.copy( + checkSeedPhraseState = uiState.checkSeedPhraseState.copy( + tvEleventhPhrase = uiState.checkSeedPhraseState.tvEleventhPhrase.copy( + isError = hasError, + ), + ), + ) + } + + fun updateCreateWalletButton( + uiState: OnboardingSeedPhraseState, + enabled: Boolean, + ): OnboardingSeedPhraseState { + return uiState.copy( + checkSeedPhraseState = uiState.checkSeedPhraseState.copy( + buttonCreateWallet = uiState.checkSeedPhraseState.buttonCreateWallet.copy( + enabled = enabled, + ), + ), + ) + } +} \ No newline at end of file diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingActionBlock.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingActionBlock.kt index 1ec67e386f..e8f9731e70 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingActionBlock.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingActionBlock.kt @@ -7,8 +7,8 @@ import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.SpacerH12 +import com.tangem.core.ui.res.TangemTheme /** [REDACTED_AUTHOR] @@ -22,8 +22,8 @@ fun OnboardingActionBlock( modifier = Modifier .wrapContentSize() .padding( - top = 8.dp, - bottom = 32.dp, + top = TangemTheme.dimens.size8, + bottom = TangemTheme.dimens.size32, ), ) { Column( diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingDescriptionBlock.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingDescriptionBlock.kt index 7b6e4e7808..f8ebabb624 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingDescriptionBlock.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/components/OnboardingDescriptionBlock.kt @@ -9,11 +9,13 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.SpacerH12 import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.onboarding.presentation.wallet2.model.OnboardingDescription +/** + * UI component witch provides single and carousel description for the onboarding process + */ @Composable fun OnboardingDescriptionBlock( modifier: Modifier = Modifier, @@ -24,7 +26,7 @@ fun OnboardingDescriptionBlock( Box( modifier = modifier .fillMaxWidth() - .padding(horizontal = 24.dp), + .padding(horizontal = TangemTheme.dimens.size24), ) { if (descriptionsList.size == 1) { SingleDescription(descriptionsList[0]) @@ -34,6 +36,22 @@ fun OnboardingDescriptionBlock( } } +@Composable +private fun SingleDescription(description: OnboardingDescription) { + Column { + if (description.hasTitle()) { + DescriptionTitleText(text = description.getTitle(LocalContext.current)) + SpacerH12() + } + DescriptionSubTitleText(text = description.getSubTitle(LocalContext.current)) + } +} + +@Composable +private fun CarouselDescription(descriptionsList: List) { + //TODO: implement +} + @Composable private fun DescriptionTitleText(text: String) { Text( @@ -54,18 +72,4 @@ private fun DescriptionSubTitleText(text: String) { textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth(), ) -} - -@Composable -private fun SingleDescription(description: OnboardingDescription) { - Column { - DescriptionTitleText(text = description.getTitle(LocalContext.current)) - if (description.hasTitle()) SpacerH12() - DescriptionSubTitleText(text = description.getSubTitle(LocalContext.current)) - } -} - -@Composable -private fun CarouselDescription(descriptionsList: List) { - Box {} -} +} \ No newline at end of file