From b0a97f53d96128b3f8ab1554d37472771ae45b65 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 24 Mar 2025 18:29:12 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../configs/feature_toggles_config.json | 2 +- core/res/src/main/res/values-de/strings.xml | 1 + core/res/src/main/res/values-es/strings.xml | 1 + core/res/src/main/res/values-fr/strings.xml | 1 + core/res/src/main/res/values-ja/strings.xml | 1 + core/res/src/main/res/values-ru/strings.xml | 1 + .../src/main/res/values-uk-rUA/strings.xml | 1 + .../src/main/res/values-zh-rTW/strings.xml | 1 + core/res/src/main/res/values/strings.xml | 1 + features/onboarding-v2/impl/build.gradle.kts | 1 + .../model/OnboardingNoteCreateWalletModel.kt | 1 - .../topup/model/OnboardingNoteTopUpModel.kt | 41 +++++++++++++++---- .../topup/ui/OnboardingNoteTopUpHeader.kt | 15 ++++++- .../topup/ui/OnboardingNoteTopUpScreen.kt | 10 ++++- .../topup/ui/state/OnboardingNoteTopUpUM.kt | 2 +- .../impl/model/OnboardingNoteCommonState.kt | 2 +- 16 files changed, 68 insertions(+), 14 deletions(-) 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