Updated on 2026-08-14

This commit is contained in:
Tangem 2025-03-24 18:29:12 +05:00
parent d84b06f80d
commit b0a97f53d9
16 changed files with 68 additions and 14 deletions

View file

@ -65,7 +65,7 @@
},
{
"name": "NOTE_REFACTORING_ENABLED",
"version": "undefined"
"version": "5.23.0"
},
{
"name": "NEW_ATTESTATION_ENABLED",

View file

@ -587,6 +587,7 @@
<string name="onboarding_top_up_body_no_account_error">Um zu beginnen, lade die Wallet einfach mit mehr als %1$s %2$s auf.</string>
<string name="onboarding_top_up_button_but_crypto">Krypto kaufen</string>
<string name="onboarding_top_up_button_show_wallet_address">Adresse der Wallet anzeigen</string>
<string name="onboarding_top_up_min_create_account_amount">Um zu beginnen, lade die Wallet einfach mit mehr als %1$s auf.</string>
<string name="onboarding_topup_title">Aktivieren einer Wallet</string>
<string name="onboarding_twin_exit_warning">Der Twinning-Prozess ist teilweise abgeschlossen. Du kannst ihn jetzt nicht mehr beenden.</string>
<string name="onboarding_twins_interrupt_warning">Wenn der Prozess der Erstellung der Brieftasche in irgendeiner Weise unterbrochen wird, musst du diesen von vorne beginnen</string>

View file

@ -578,6 +578,7 @@
<string name="onboarding_top_up_body_no_account_error">Para empezar, simplemente recargue la billetera con más de %1$s %2$s</string>
<string name="onboarding_top_up_button_but_crypto">Comprar cripto</string>
<string name="onboarding_top_up_button_show_wallet_address">Mostrar la dirección de la billetera</string>
<string name="onboarding_top_up_min_create_account_amount">Para empezar, simplemente recargue la billetera con más de %1$s</string>
<string name="onboarding_topup_title">Activar una billetera</string>
<string name="onboarding_twin_exit_warning">El proceso de emparejamiento está parcialmente completo. No puede salir ahora.</string>
<string name="onboarding_twins_interrupt_warning">Si el proceso de creación del wallet se interrumpe de alguna manera, tendrá que empezar de nuevo</string>

View file

@ -580,6 +580,7 @@
<string name="onboarding_top_up_body_no_account_error">Pour commencer, rechargez simplement le portefeuille avec plus de %1$s %2$s</string>
<string name="onboarding_top_up_button_but_crypto">Acheter des crypto-monnaies</string>
<string name="onboarding_top_up_button_show_wallet_address">Afficher l\'adresse du portefeuille</string>
<string name="onboarding_top_up_min_create_account_amount">Pour commencer, rechargez simplement le portefeuille avec plus de %1$s</string>
<string name="onboarding_topup_title">Activer un portefeuille</string>
<string name="onboarding_twin_exit_warning">Le processus de jumelage est partiellement terminé. Vous ne pouvez pas le quitter maintenant.</string>
<string name="onboarding_twins_interrupt_warning">Si le processus de création du portefeuille est interrompu de quelque manière que ce soit, vous devrez recommencer</string>

View file

@ -588,6 +588,7 @@
<string name="onboarding_top_up_body_no_account_error">始めるには、ウォレットに%1$s %2$s以上入金するだけです</string>
<string name="onboarding_top_up_button_but_crypto">暗号資産を購入する</string>
<string name="onboarding_top_up_button_show_wallet_address">ウォレットのアドレスを表示する</string>
<string name="onboarding_top_up_min_create_account_amount">始めるには、ウォレットに%1$s 以上入金するだけです</string>
<string name="onboarding_topup_title">ウォレットを有効化する</string>
<string name="onboarding_twin_exit_warning">ツイン化プロセスは部分的に完了しています。現在終了することはできません。</string>
<string name="onboarding_twins_interrupt_warning">ウォレットの作成プロセスが何らかの理由で中断された場合は、最初からやり直す必要があります。</string>

View file

@ -594,6 +594,7 @@
<string name="onboarding_top_up_body_no_account_error">Пополните кошелек более чем на %1$s %2$s, чтобы начать пользоваться картой</string>
<string name="onboarding_top_up_button_but_crypto">Купить криптовалюту</string>
<string name="onboarding_top_up_button_show_wallet_address">Показать адрес кошелька</string>
<string name="onboarding_top_up_min_create_account_amount">Пополните кошелек более чем на %1$s, чтобы начать пользоваться картой</string>
<string name="onboarding_topup_title">Активация кошелька</string>
<string name="onboarding_twin_exit_warning">Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас.</string>
<string name="onboarding_twins_interrupt_warning">Если процесc создания кошелька каким-либо образом прервется, вам придется начинать сначала</string>

View file

@ -594,6 +594,7 @@
<string name="onboarding_top_up_body_no_account_error">Щоб почати, просто поповніть гаманець більше, ніж на %1$s %2$s</string>
<string name="onboarding_top_up_button_but_crypto">Купити криптовалюту</string>
<string name="onboarding_top_up_button_show_wallet_address">Показати адресу гаманця</string>
<string name="onboarding_top_up_min_create_account_amount">Щоб почати, просто поповніть гаманець більше, ніж на %1$s</string>
<string name="onboarding_topup_title">Активація гаманця</string>
<string name="onboarding_twin_exit_warning">Процес поєднання карток частково завершено. Ви не можете вийти з нього зараз.</string>
<string name="onboarding_twins_interrupt_warning">Якщо процес створення гаманця буде перервано будь-яким чином, вам доведеться почати все спочатку</string>

View file

@ -205,6 +205,7 @@
<string name="onboarding_top_up_body_no_account_error">要開始,只需為錢包充值超過 %1$s %2$s</string>
<string name="onboarding_top_up_button_but_crypto">購買加密貨幣</string>
<string name="onboarding_top_up_button_show_wallet_address">顯示錢包地址</string>
<string name="onboarding_top_up_min_create_account_amount">要開始,只需為錢包充值超過 %1$s</string>
<string name="onboarding_topup_title">啟動錢包</string>
<string name="onboarding_twin_exit_warning">結對過程已部分完成。你現在不能退出</string>
<string name="onboarding_twins_interrupt_warning">如果創建錢包的過程以任何方式中斷,您將得重新開始</string>

View file

@ -598,6 +598,7 @@
<string name="onboarding_top_up_body_no_account_error">To get started, simply top up the wallet with more than %1$s %2$s</string>
<string name="onboarding_top_up_button_but_crypto">Buy crypto</string>
<string name="onboarding_top_up_button_show_wallet_address">Show the wallet\'s address</string>
<string name="onboarding_top_up_min_create_account_amount">To get started, simply top up the wallet with more than %1$s</string>
<string name="onboarding_topup_title">Activate a wallet</string>
<string name="onboarding_twin_exit_warning">The twinning process is partly complete. You can\'t exit it now.</string>
<string name="onboarding_twins_interrupt_warning">If the process of creating the wallet gets interrupted in any way, you\'ll have to start over</string>

View file

@ -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)

View file

@ -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 {

View file

@ -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<OnboardingNoteTopUpComponent.Params>()
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
}
}

View file

@ -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(

View file

@ -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,

View file

@ -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,

View file

@ -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,
)