diff --git a/core/utils/src/main/java/com/tangem/utils/extensions/Int.kt b/core/utils/src/main/java/com/tangem/utils/extensions/Int.kt new file mode 100644 index 0000000000..af00c9f75a --- /dev/null +++ b/core/utils/src/main/java/com/tangem/utils/extensions/Int.kt @@ -0,0 +1,8 @@ +package com.tangem.utils.extensions + +/** +[REDACTED_AUTHOR] + */ +fun Int.isEven(): Boolean = this % 2 == 0 + +fun Int.isOdd(): Boolean = !this.isEven() \ No newline at end of file diff --git a/features/onboarding/build.gradle.kts b/features/onboarding/build.gradle.kts index e36d079c6b..61df104ad9 100644 --- a/features/onboarding/build.gradle.kts +++ b/features/onboarding/build.gradle.kts @@ -9,6 +9,7 @@ plugins { dependencies { /** Core modules */ + implementation(project(":common")) implementation(project(":core:featuretoggles")) implementation(project(":core:datasource")) implementation(project(":core:analytics")) 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 index da3edf8aaa..9eea61c93b 100644 --- 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 @@ -36,10 +36,15 @@ data class AboutState( ) data class YourSeedPhraseState( - val mnemonicComponents: ImmutableList = persistentListOf(), + val mnemonicGridItems: ImmutableList = persistentListOf(), val buttonContinue: ButtonState, ) +data class MnemonicGridItem( + val index: Int, + val mnemonic: String, +) + data class CheckSeedPhraseState( val tvSecondPhrase: TextFieldState, val tvSeventhPhrase: TextFieldState, 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 index 0a2f23c8b1..1a8a30975e 100644 --- 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 @@ -5,6 +5,7 @@ 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.MnemonicGridItem 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.TextFieldState @@ -111,9 +112,9 @@ class StateBuilder( fun mnemonicGenerated( uiState: OnboardingSeedPhraseState, - mnemonicComponents: ImmutableList, + mnemonicGridItems: ImmutableList, ): OnboardingSeedPhraseState { - return updateMnemonicComponents(uiState, mnemonicComponents) + return updateMnemonicComponents(uiState, mnemonicGridItems) .copy( step = OnboardingSeedPhraseStep.YourSeedPhrase, aboutState = uiState.aboutState.copy( @@ -129,10 +130,10 @@ class StateBuilder( fun updateMnemonicComponents( uiState: OnboardingSeedPhraseState, - phraseList: ImmutableList, + mnemonicGridItems: ImmutableList, ): OnboardingSeedPhraseState = uiState.copy( yourSeedPhraseState = uiState.yourSeedPhraseState.copy( - mnemonicComponents = phraseList, + mnemonicGridItems = mnemonicGridItems, ), ) } \ No newline at end of file diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/YourSeedPhraseScreen.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/YourSeedPhraseScreen.kt index f771266a37..75bfdc15e4 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/YourSeedPhraseScreen.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/ui/YourSeedPhraseScreen.kt @@ -18,6 +18,7 @@ import com.tangem.core.ui.components.PrimaryButton import com.tangem.core.ui.components.SpacerW32 import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.onboarding.R +import com.tangem.feature.onboarding.presentation.wallet2.model.MnemonicGridItem import com.tangem.feature.onboarding.presentation.wallet2.model.YourSeedPhraseState import com.tangem.feature.onboarding.presentation.wallet2.ui.components.Description import com.tangem.feature.onboarding.presentation.wallet2.ui.components.OnboardingActionBlock @@ -50,7 +51,7 @@ fun YourSeedPhraseScreen( Box( modifier = Modifier.weight(1f), ) { - PhraseGreedBlock(state.mnemonicComponents) + PhraseGreedBlock(state.mnemonicGridItems) } Box { @@ -69,26 +70,27 @@ fun YourSeedPhraseScreen( } @Composable -private fun PhraseGreedBlock(phraseList: ImmutableList) { +private fun PhraseGreedBlock(mnemonicGridItems: ImmutableList) { LazyVerticalGrid( columns = GridCells.Fixed(2), ) { this.items( - count = phraseList.size, + count = mnemonicGridItems.size, ) { index -> Row( modifier = Modifier.padding(all = TangemTheme.dimens.size8), verticalAlignment = Alignment.CenterVertically, ) { + val item = mnemonicGridItems[index] SpacerW32() Text( modifier = Modifier.width(TangemTheme.dimens.size40), - text = "${index + 1}.", + text = "${item.index}.", style = TangemTheme.typography.body2, color = TangemTheme.colors.text.secondary, ) Text( - text = phraseList[index], + text = item.mnemonic, style = TangemTheme.typography.button, color = TangemTheme.colors.text.primary1, ) diff --git a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt index 14c5167dd3..524c8f0adb 100644 --- a/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt +++ b/features/onboarding/src/main/java/com/tangem/feature/onboarding/presentation/wallet2/viewmodel/SeedPhraseViewModel.kt @@ -11,6 +11,7 @@ import com.tangem.feature.onboarding.presentation.wallet2.model.AboutUiAction import com.tangem.feature.onboarding.presentation.wallet2.model.CheckSeedPhraseUiAction import com.tangem.feature.onboarding.presentation.wallet2.model.ImportSeedPhraseUiAction import com.tangem.feature.onboarding.presentation.wallet2.model.IntroUiAction +import com.tangem.feature.onboarding.presentation.wallet2.model.MnemonicGridItem 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 @@ -21,7 +22,10 @@ import com.tangem.feature.onboarding.presentation.wallet2.model.YourSeedPhraseUi import com.tangem.feature.onboarding.presentation.wallet2.ui.StateBuilder import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.Debouncer +import com.tangem.utils.extensions.isEven import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch @@ -123,7 +127,6 @@ class SeedPhraseViewModel @Inject constructor( } private fun buttonCreateWalletWithSeedPhraseClick() { - buttonGenerateSeedPhraseClick() } private fun buttonOtherOptionsClick() { @@ -141,14 +144,39 @@ class SeedPhraseViewModel @Inject constructor( updateUi { uiBuilder.generateMnemonicComponents(uiState) } interactor.generateMnemonic() .onSuccess { mnemonic -> - updateUi { uiBuilder.mnemonicGenerated(uiState, mnemonic.mnemonicComponents) } + val mnemonicGridItems = generateMnemonicGridList(mnemonic.mnemonicComponents) + updateUi { uiBuilder.mnemonicGenerated(uiState, mnemonicGridItems.toImmutableList()) } } .onFailure { - // show error + // TODO: show error } } } + private suspend fun generateMnemonicGridList(mnemonicComponents: List): ImmutableList { + val size = mnemonicComponents.size + val splitIndex = if (size.isEven()) size / 2 else size / 2 + 1 + val leftColumn = mnemonicComponents.subList(0, splitIndex) + val rightColumn = mnemonicComponents.subList(splitIndex, size) + + val mnemonicGridItems = mutableListOf() + for (index in 0 until splitIndex) { + if (index <= leftColumn.size) mnemonicGridItems.add( + MnemonicGridItem( + index = index + 1, + mnemonic = leftColumn[index], + ), + ) + if (index < rightColumn.size) mnemonicGridItems.add( + MnemonicGridItem( + index = index + splitIndex + 1, + mnemonic = rightColumn[index], + ), + ) + } + return mnemonicGridItems.toImmutableList() + } + private fun buttonImportSeedPhraseClick() { viewModelScope.launchSingle { updateUi { uiBuilder.changeStep(uiState, OnboardingSeedPhraseStep.ImportSeedPhrase) }