diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
index a3e83e6903..810a9dceb5 100644
--- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
+++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
@@ -65,7 +65,7 @@
},
{
"name": "NOTE_REFACTORING_ENABLED",
- "version": "undefined"
+ "version": "5.23.0"
},
{
"name": "NEW_ATTESTATION_ENABLED",
diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml
index 1c51e92eb7..4ff77a5e42 100644
--- a/core/res/src/main/res/values-de/strings.xml
+++ b/core/res/src/main/res/values-de/strings.xml
@@ -587,6 +587,7 @@
Um zu beginnen, lade die Wallet einfach mit mehr als %1$s %2$s auf.
Krypto kaufen
Adresse der Wallet anzeigen
+ Um zu beginnen, lade die Wallet einfach mit mehr als %1$s auf.
Aktivieren einer Wallet
Der Twinning-Prozess ist teilweise abgeschlossen. Du kannst ihn jetzt nicht mehr beenden.
Wenn der Prozess der Erstellung der Brieftasche in irgendeiner Weise unterbrochen wird, musst du diesen von vorne beginnen
diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml
index bd31c5f775..7446797c14 100644
--- a/core/res/src/main/res/values-es/strings.xml
+++ b/core/res/src/main/res/values-es/strings.xml
@@ -578,6 +578,7 @@
Para empezar, simplemente recargue la billetera con más de %1$s %2$s
Comprar cripto
Mostrar la dirección de la billetera
+ Para empezar, simplemente recargue la billetera con más de %1$s
Activar una billetera
El proceso de emparejamiento está parcialmente completo. No puede salir ahora.
Si el proceso de creación del wallet se interrumpe de alguna manera, tendrá que empezar de nuevo
diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml
index 83acd44b09..db80887fdb 100644
--- a/core/res/src/main/res/values-fr/strings.xml
+++ b/core/res/src/main/res/values-fr/strings.xml
@@ -580,6 +580,7 @@
Pour commencer, rechargez simplement le portefeuille avec plus de %1$s %2$s
Acheter des crypto-monnaies
Afficher l\'adresse du portefeuille
+ Pour commencer, rechargez simplement le portefeuille avec plus de %1$s
Activer un portefeuille
Le processus de jumelage est partiellement terminé. Vous ne pouvez pas le quitter maintenant.
Si le processus de création du portefeuille est interrompu de quelque manière que ce soit, vous devrez recommencer
diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml
index 9c9b68a323..d0474aa52e 100644
--- a/core/res/src/main/res/values-ja/strings.xml
+++ b/core/res/src/main/res/values-ja/strings.xml
@@ -588,6 +588,7 @@
始めるには、ウォレットに%1$s %2$s以上入金するだけです
暗号資産を購入する
ウォレットのアドレスを表示する
+ 始めるには、ウォレットに%1$s 以上入金するだけです
ウォレットを有効化する
ツイン化プロセスは部分的に完了しています。現在終了することはできません。
ウォレットの作成プロセスが何らかの理由で中断された場合は、最初からやり直す必要があります。
diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml
index b46553bb3b..9e98a332d6 100644
--- a/core/res/src/main/res/values-ru/strings.xml
+++ b/core/res/src/main/res/values-ru/strings.xml
@@ -594,6 +594,7 @@
Пополните кошелек более чем на %1$s %2$s, чтобы начать пользоваться картой
Купить криптовалюту
Показать адрес кошелька
+ Пополните кошелек более чем на %1$s, чтобы начать пользоваться картой
Активация кошелька
Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас.
Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала
diff --git a/core/res/src/main/res/values-uk-rUA/strings.xml b/core/res/src/main/res/values-uk-rUA/strings.xml
index 1d760fbe95..595d9519f2 100644
--- a/core/res/src/main/res/values-uk-rUA/strings.xml
+++ b/core/res/src/main/res/values-uk-rUA/strings.xml
@@ -594,6 +594,7 @@
Щоб почати, просто поповніть гаманець більше, ніж на %1$s %2$s
Купити криптовалюту
Показати адресу гаманця
+ Щоб почати, просто поповніть гаманець більше, ніж на %1$s
Активація гаманця
Процес поєднання карток частково завершено. Ви не можете вийти з нього зараз.
Якщо процес створення гаманця буде перервано будь-яким чином, вам доведеться почати все спочатку
diff --git a/core/res/src/main/res/values-zh-rTW/strings.xml b/core/res/src/main/res/values-zh-rTW/strings.xml
index d4ab1bc4e2..81c9546a39 100644
--- a/core/res/src/main/res/values-zh-rTW/strings.xml
+++ b/core/res/src/main/res/values-zh-rTW/strings.xml
@@ -205,6 +205,7 @@
要開始,只需為錢包充值超過 %1$s %2$s
購買加密貨幣
顯示錢包地址
+ 要開始,只需為錢包充值超過 %1$s
啟動錢包
結對過程已部分完成。你現在不能退出
如果創建錢包的過程以任何方式中斷,您將得重新開始
diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 453cfe5df9..6761a8065b 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -598,6 +598,7 @@
To get started, simply top up the wallet with more than %1$s %2$s
Buy crypto
Show the wallet\'s address
+ To get started, simply top up the wallet with more than %1$s
Activate a wallet
The twinning process is partly complete. You can\'t exit it now.
If the process of creating the wallet gets interrupted in any way, you\'ll have to start over
diff --git a/features/onboarding-v2/impl/build.gradle.kts b/features/onboarding-v2/impl/build.gradle.kts
index 00be841eed..3c11edf62d 100644
--- a/features/onboarding-v2/impl/build.gradle.kts
+++ b/features/onboarding-v2/impl/build.gradle.kts
@@ -66,6 +66,7 @@ dependencies {
implementation(deps.compose.ui)
implementation(deps.compose.ui.tooling)
implementation(deps.compose.coil)
+ implementation(deps.compose.shimmer)
implementation(deps.lottie.compose)
implementation(deps.decompose.ext.compose)
implementation(deps.androidx.activity.compose)
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt
index b8ca1d76a2..59f7b2e7ab 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/create/model/OnboardingNoteCreateWalletModel.kt
@@ -76,7 +76,6 @@ internal class OnboardingNoteCreateWalletModel @Inject constructor(
modelScope.launch {
val userWallet = createUserWallet(scanResponse)
saveWalletUseCase(userWallet, canOverride = true).onRight {
- cardRepository.finishCardActivation(scanResponse.card.cardId)
params.onWalletCreated(userWallet)
}
_uiState.update {
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt
index 2d7cbc4c04..28a0eda74b 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt
@@ -12,6 +12,7 @@ import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBotto
import com.tangem.core.ui.components.bottomsheets.tokenreceive.mapToAddressModels
import com.tangem.core.ui.format.bigdecimal.crypto
import com.tangem.core.ui.format.bigdecimal.format
+import com.tangem.domain.card.repository.CardRepository
import com.tangem.domain.exchange.RampStateManager
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.onramp.GetLegacyTopUpUrlUseCase
@@ -23,10 +24,12 @@ import com.tangem.domain.tokens.model.NetworkAddress
import com.tangem.domain.tokens.model.analytics.TokenReceiveAnalyticsEvent
import com.tangem.domain.wallets.builder.UserWalletBuilder
import com.tangem.domain.wallets.models.UserWallet
+import com.tangem.domain.wallets.usecase.SaveWalletUseCase
import com.tangem.features.onboarding.v2.common.analytics.OnboardingEvent
import com.tangem.features.onboarding.v2.note.impl.child.topup.OnboardingNoteTopUpComponent
import com.tangem.features.onboarding.v2.note.impl.child.topup.ui.state.OnboardingNoteTopUpUM
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
+import com.tangem.utils.extensions.isPositive
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
@@ -45,12 +48,14 @@ internal class OnboardingNoteTopUpModel @Inject constructor(
private val clipboardManager: ClipboardManager,
private val shareManager: ShareManager,
private val rampStateManager: RampStateManager,
+ private val cardRepository: CardRepository,
+ private val saveWalletUseCase: SaveWalletUseCase,
) : Model() {
private val params = paramsContainer.require()
private val commonState = params.childParams.commonState
private val scanResponse = params.childParams.commonState.value.scanResponse
- private var userWallet: UserWallet? = null
+ private var userWallet = params.childParams.commonState.value.userWallet
private val _uiState = MutableStateFlow(
OnboardingNoteTopUpUM(
@@ -117,7 +122,7 @@ internal class OnboardingNoteTopUpModel @Inject constructor(
return
}
val commonState = params.childParams.commonState.value
- userWallet = commonState.userWallet ?: createUserWallet(scanResponse)
+ userWallet = commonState.userWallet ?: createAndSaveUserWallet(scanResponse)
}
private fun observeArtwork() {
@@ -140,14 +145,34 @@ internal class OnboardingNoteTopUpModel @Inject constructor(
if (commonState.value.cryptoCurrencyStatus == null) {
loadAvailableForBuy(status)
}
+
commonState.update {
it.copy(cryptoCurrencyStatus = status)
}
+ val amount = when (status.value) {
+ is CryptoCurrencyStatus.Loaded -> status.value.amount
+ is CryptoCurrencyStatus.NoAccount -> status.value.amount
+ is CryptoCurrencyStatus.NoQuote -> status.value.amount
+ else -> null
+ }
+ val hasCurrentNetworkTransactions = when (status.value) {
+ is CryptoCurrencyStatus.Loaded -> status.value.hasCurrentNetworkTransactions
+ is CryptoCurrencyStatus.NoAccount -> status.value.hasCurrentNetworkTransactions
+ else -> false
+ }
+ val amountToCreateAccount = (status.value as? CryptoCurrencyStatus.NoAccount)?.amountToCreateAccount
+
+ if (amount?.isPositive() == true || hasCurrentNetworkTransactions) {
+ modelScope.launch {
+ cardRepository.finishCardActivation(scanResponse.card.cardId)
+ params.onDone()
+ }
+ }
+
_uiState.update {
it.copy(
- amountToCreateAccount = (status.value as? CryptoCurrencyStatus.NoAccount)
- ?.amountToCreateAccount
+ amountToCreateAccount = amountToCreateAccount
?.format(
{
crypto(
@@ -156,7 +181,7 @@ internal class OnboardingNoteTopUpModel @Inject constructor(
)
},
),
- balance = (status.value as? CryptoCurrencyStatus.Loaded)?.amount?.format(
+ balance = amount?.format(
{
crypto(
symbol = status.currency.symbol,
@@ -217,10 +242,12 @@ internal class OnboardingNoteTopUpModel @Inject constructor(
),
)
- private suspend fun createUserWallet(scanResponse: ScanResponse): UserWallet {
- return requireNotNull(
+ private suspend fun createAndSaveUserWallet(scanResponse: ScanResponse): UserWallet {
+ val wallet = requireNotNull(
value = userWalletBuilderFactory.create(scanResponse = scanResponse).build(),
lazyMessage = { "User wallet not created" },
)
+ saveWalletUseCase(wallet, false)
+ return wallet
}
}
\ No newline at end of file
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpHeader.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpHeader.kt
index 572a257158..381b360e79 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpHeader.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpHeader.kt
@@ -2,21 +2,25 @@ package com.tangem.features.onboarding.v2.note.impl.child.topup.ui
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
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.components.SpacerH8
import com.tangem.core.ui.components.SpacerHMax
import com.tangem.core.ui.extensions.stringResourceSafe
+import com.tangem.core.ui.res.LocalTangemShimmer
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.features.onboarding.v2.common.ui.RefreshButton
import com.tangem.features.onboarding.v2.common.ui.WalletCard
import com.tangem.features.onboarding.v2.impl.R
+import com.valentinilk.shimmer.shimmer
@Composable
fun OnboardingNoteTopUpHeader(
@@ -58,10 +62,17 @@ fun OnboardingNoteTopUpHeader(
)
SpacerH8()
Text(
- text = balance,
+ modifier = if (balance.isEmpty()) {
+ Modifier
+ .width(120.dp)
+ .clip(RoundedCornerShape(size = TangemTheme.dimens.radius3))
+ .shimmer(LocalTangemShimmer.current)
+ } else {
+ Modifier
+ },
style = TangemTheme.typography.h2,
color = TangemTheme.colors.text.primary1,
- textAlign = TextAlign.Center,
+ text = balance,
)
SpacerHMax()
RefreshButton(
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpScreen.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpScreen.kt
index 8fbe707ec3..e8dbf64055 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpScreen.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/OnboardingNoteTopUpScreen.kt
@@ -57,8 +57,16 @@ fun OnboardingNoteTopUp(state: OnboardingNoteTopUpUM, modifier: Modifier = Modif
modifier = Modifier.padding(top = 16.dp),
)
+ val text = if (state.amountToCreateAccount != null) {
+ stringResourceSafe(
+ R.string.onboarding_top_up_min_create_account_amount,
+ state.amountToCreateAccount,
+ )
+ } else {
+ stringResourceSafe(R.string.onboarding_top_up_body)
+ }
Text(
- text = stringResourceSafe(R.string.onboarding_top_up_body),
+ text = text,
style = TangemTheme.typography.body1,
color = TangemTheme.colors.text.secondary,
textAlign = TextAlign.Center,
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/state/OnboardingNoteTopUpUM.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/state/OnboardingNoteTopUpUM.kt
index f61ef91a50..327de0d586 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/state/OnboardingNoteTopUpUM.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/ui/state/OnboardingNoteTopUpUM.kt
@@ -6,7 +6,7 @@ data class OnboardingNoteTopUpUM(
val cardArtworkUrl: String? = null,
val availableForBuy: Boolean = false,
val availableForBuyLoading: Boolean = true,
- val balance: String = "–",
+ val balance: String = "",
val isRefreshing: Boolean = false,
val isTopUpDataLoading: Boolean = true,
val amountToCreateAccount: String? = null,
diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteCommonState.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteCommonState.kt
index 52ff268627..8ebe5bcd8b 100644
--- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteCommonState.kt
+++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/model/OnboardingNoteCommonState.kt
@@ -6,7 +6,7 @@ import com.tangem.domain.wallets.models.UserWallet
internal data class OnboardingNoteCommonState(
val scanResponse: ScanResponse,
- val cardArtworkUrl: String? = null,
val userWallet: UserWallet? = null,
+ val cardArtworkUrl: String? = null,
val cryptoCurrencyStatus: CryptoCurrencyStatus? = null,
)
\ No newline at end of file