From 64626bbcbc75856828d25e7e069a33a6ae2b3835 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 24 Jun 2025 22:39:17 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../drawable/ic_create_mobile_wallet_56.xml | 43 ++++++ .../DefaultCreateWalletSelectionComponent.kt | 1 + .../{ => ui}/CreateWalletSelectionContent.kt | 22 +-- .../hotwallet/CreateMobileWalletComponent.kt | 8 + .../CreateMobileWalletModel.kt | 27 ++++ .../DefaultCreateMobileWalletComponent.kt | 34 +++++ .../entity/CreateMobileWalletUM.kt | 6 + .../ui/CreateMobileWalletContent.kt | 144 ++++++++++++++++++ 8 files changed, 274 insertions(+), 11 deletions(-) create mode 100644 core/ui/src/main/res/drawable/ic_create_mobile_wallet_56.xml rename features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/{ => ui}/CreateWalletSelectionContent.kt (90%) create mode 100644 features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/entity/CreateMobileWalletUM.kt create mode 100644 features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/ui/CreateMobileWalletContent.kt diff --git a/core/ui/src/main/res/drawable/ic_create_mobile_wallet_56.xml b/core/ui/src/main/res/drawable/ic_create_mobile_wallet_56.xml new file mode 100644 index 0000000000..c4efe75b71 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_create_mobile_wallet_56.xml @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/DefaultCreateWalletSelectionComponent.kt b/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/DefaultCreateWalletSelectionComponent.kt index 7eede00b99..a76cd26754 100644 --- a/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/DefaultCreateWalletSelectionComponent.kt +++ b/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/DefaultCreateWalletSelectionComponent.kt @@ -6,6 +6,7 @@ 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.features.createwalletselection.ui.CreateWalletSelectionContent import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject diff --git a/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/CreateWalletSelectionContent.kt b/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/ui/CreateWalletSelectionContent.kt similarity index 90% rename from features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/CreateWalletSelectionContent.kt rename to features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/ui/CreateWalletSelectionContent.kt index ad39c3191b..4c66af5a94 100644 --- a/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/CreateWalletSelectionContent.kt +++ b/features/create-wallet-selection/impl/src/main/kotlin/com/tangem/features/createwalletselection/ui/CreateWalletSelectionContent.kt @@ -1,4 +1,4 @@ -package com.tangem.features.createwalletselection +package com.tangem.features.createwalletselection.ui import android.content.res.Configuration import androidx.compose.foundation.background @@ -52,7 +52,7 @@ internal fun CreateWalletSelectionContent(state: CreateWalletSelectionUM, modifi Text( modifier = Modifier .padding(16.dp), - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string text = "What to choose?", style = TangemTheme.typography.body1, color = TangemTheme.colors.text.primary1, @@ -74,7 +74,7 @@ internal fun CreateWalletSelectionContent(state: CreateWalletSelectionUM, modifi modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp), - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string text = "Choose how you want to create your wallet", style = TangemTheme.typography.h2, color = TangemTheme.colors.text.primary1, @@ -83,9 +83,9 @@ internal fun CreateWalletSelectionContent(state: CreateWalletSelectionUM, modifi WalletBlock( modifier = Modifier .padding(top = 24.dp), - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string title = "Mobile Wallet", - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string description = "A secure wallet is created on your phone in seconds.", badge = { Box( @@ -97,7 +97,7 @@ internal fun CreateWalletSelectionContent(state: CreateWalletSelectionUM, modifi .padding(horizontal = 8.dp, vertical = 4.dp), ) { Text( - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string text = "Free", style = TangemTheme.typography.caption1, color = TangemTheme.colors.text.secondary, @@ -107,9 +107,9 @@ internal fun CreateWalletSelectionContent(state: CreateWalletSelectionUM, modifi onClick = state.onMobileWalletClick, ) WalletBlock( - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string title = "Hardware Wallet", - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string description = "Buy Tangem Wallet — physical cards that securely store your crypto offline.", badge = { Box( @@ -121,7 +121,7 @@ internal fun CreateWalletSelectionContent(state: CreateWalletSelectionUM, modifi .padding(horizontal = 8.dp, vertical = 4.dp), ) { Text( - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string text = "From $54.90", style = TangemTheme.typography.caption1, color = TangemTheme.colors.text.accent, @@ -201,7 +201,7 @@ private fun AlreadyHaveTangemWalletBlock( modifier = Modifier .weight(1f) .padding(end = 16.dp), - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string text = "Do you already have Tangem Wallet?", style = TangemTheme.typography.button, color = TangemTheme.colors.text.primary1, @@ -209,7 +209,7 @@ private fun AlreadyHaveTangemWalletBlock( TangemButton( modifier = Modifier .wrapContentWidth(), - // TODO update and extract this string + // TODO [REDACTED_TASK_KEY] update and extract this string text = "Scan Now", onClick = onScanClick, icon = TangemButtonIconPosition.End(iconResId = R.drawable.ic_tangem_24), diff --git a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt new file mode 100644 index 0000000000..e9bdbf64e5 --- /dev/null +++ b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateMobileWalletComponent.kt @@ -0,0 +1,8 @@ +package com.tangem.features.hotwallet + +import com.tangem.core.decompose.factory.ComponentFactory +import com.tangem.core.ui.decompose.ComposableContentComponent + +interface CreateMobileWalletComponent : ComposableContentComponent { + interface Factory : ComponentFactory +} \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt new file mode 100644 index 0000000000..629e6c0a74 --- /dev/null +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/CreateMobileWalletModel.kt @@ -0,0 +1,27 @@ +package com.tangem.features.hotwallet.createmobilewallet + +import com.tangem.core.decompose.di.ModelScoped +import com.tangem.core.decompose.model.Model +import com.tangem.features.hotwallet.createmobilewallet.entity.CreateMobileWalletUM +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import javax.inject.Inject + +@ModelScoped +internal class CreateMobileWalletModel @Inject constructor( + override val dispatchers: CoroutineDispatcherProvider, +) : Model() { + + internal val uiState: StateFlow + field = MutableStateFlow( + CreateMobileWalletUM( + onBackClick = { /* [REDACTED_TODO_COMMENT] */ }, + onCreateClick = ::onCreateClick, + ), + ) + + private fun onCreateClick() { + // TODO create a wallet + } +} \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt new file mode 100644 index 0000000000..7a8181fb40 --- /dev/null +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/DefaultCreateMobileWalletComponent.kt @@ -0,0 +1,34 @@ +package com.tangem.features.hotwallet.createmobilewallet + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +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.features.hotwallet.CreateMobileWalletComponent +import com.tangem.features.hotwallet.createmobilewallet.ui.CreateMobileWalletContent +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +internal class DefaultCreateMobileWalletComponent @AssistedInject constructor( + @Assisted private val context: AppComponentContext, + @Assisted private val params: Unit, +) : CreateMobileWalletComponent, AppComponentContext by context { + private val model: CreateMobileWalletModel = getOrCreateModel(params) + + @Composable + override fun Content(modifier: Modifier) { + val state by model.uiState.collectAsStateWithLifecycle() + CreateMobileWalletContent( + state = state, + modifier = modifier, + ) + } + + @AssistedFactory + interface Factory : CreateMobileWalletComponent.Factory { + override fun create(context: AppComponentContext, params: Unit): DefaultCreateMobileWalletComponent + } +} \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/entity/CreateMobileWalletUM.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/entity/CreateMobileWalletUM.kt new file mode 100644 index 0000000000..918e811d85 --- /dev/null +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/entity/CreateMobileWalletUM.kt @@ -0,0 +1,6 @@ +package com.tangem.features.hotwallet.createmobilewallet.entity + +internal data class CreateMobileWalletUM( + val onBackClick: () -> Unit, + val onCreateClick: () -> Unit, +) \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/ui/CreateMobileWalletContent.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/ui/CreateMobileWalletContent.kt new file mode 100644 index 0000000000..6f3a77c019 --- /dev/null +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createmobilewallet/ui/CreateMobileWalletContent.kt @@ -0,0 +1,144 @@ +package com.tangem.features.hotwallet.createmobilewallet.ui + +import android.content.res.Configuration +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.tangem.core.ui.R +import com.tangem.core.ui.components.PrimaryButton +import com.tangem.core.ui.components.appbar.TangemTopAppBar +import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview +import com.tangem.features.hotwallet.createmobilewallet.entity.CreateMobileWalletUM + +@Suppress("LongMethod") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun CreateMobileWalletContent(state: CreateMobileWalletUM, modifier: Modifier = Modifier) { + Column( + modifier = Modifier + .background(TangemTheme.colors.background.primary) + .fillMaxSize() + .systemBarsPadding(), + ) { + TangemTopAppBar( + modifier = modifier + .statusBarsPadding(), + startButton = TopAppBarButtonUM.Back(state.onBackClick), + title = TextReference.EMPTY, + ) + Column( + modifier = Modifier + .weight(1f) + .padding( + start = 16.dp, + top = 24.dp, + end = 16.dp, + ), + ) { + Icon( + modifier = Modifier + .fillMaxWidth(), + painter = painterResource(R.drawable.ic_create_mobile_wallet_56), + contentDescription = null, + tint = TangemTheme.colors.icon.informative, + ) + Text( + modifier = Modifier + .fillMaxWidth() + .padding( + start = 16.dp, + top = 20.dp, + end = 16.dp, + ), + // TODO [REDACTED_TASK_KEY] update and extract this string + text = "Create Mobile Wallet", + style = TangemTheme.typography.h2, + color = TangemTheme.colors.text.primary1, + textAlign = TextAlign.Center, + ) + FeatureBlock( + modifier = Modifier + .padding(top = 32.dp), + // TODO [REDACTED_TASK_KEY] update and extract this string + title = "Keys are stored in the app", + // TODO [REDACTED_TASK_KEY] update and extract this string + description = "Get notified of incoming transactions", + iconRes = R.drawable.ic_lock_24, + ) + FeatureBlock( + modifier = Modifier + .padding(top = 24.dp), + // TODO [REDACTED_TASK_KEY] update and extract this string + title = "Seed phrase backup", + // TODO [REDACTED_TASK_KEY] update and extract this string + description = "Stay up to date with the latest features and news", + iconRes = R.drawable.ic_settings_24, + ) + } + PrimaryButton( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + text = "Create", + showProgress = false, + enabled = true, + onClick = state.onCreateClick, + ) + } +} + +@Composable +private fun FeatureBlock(title: String, description: String, iconRes: Int, modifier: Modifier = Modifier) { + Row( + modifier = modifier, + ) { + Icon( + modifier = Modifier + .padding(horizontal = 12.dp), + painter = painterResource(iconRes), + contentDescription = null, + tint = TangemTheme.colors.icon.primary1, + ) + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp), + ) { + Text( + text = title, + style = TangemTheme.typography.subtitle1, + color = TangemTheme.colors.text.primary1, + ) + Text( + modifier = Modifier + .padding(top = 4.dp), + text = description, + style = TangemTheme.typography.body2, + color = TangemTheme.colors.text.secondary, + ) + } + } +} + +@Preview(showBackground = true, widthDp = 360) +@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun PreviewCreateWalletContent() { + TangemThemePreview { + CreateMobileWalletContent( + state = CreateMobileWalletUM( + onBackClick = {}, + onCreateClick = {}, + ), + ) + } +} \ No newline at end of file