Updated on 2026-08-14

This commit is contained in:
Tangem 2024-12-24 11:22:24 +03:00
commit 488d1c5037
16 changed files with 65 additions and 7 deletions

View file

@ -10,9 +10,5 @@
{
"name": "NEXA/test",
"version": "undefined"
},
{
"name": "clore-ai",
"version": "undefined"
}
]

View file

@ -580,6 +580,7 @@
<string name="onboarding_wallet_info_title_second">Cartes identiques</string>
<string name="onboarding_wallet_info_title_third">Code d\'accès</string>
<string name="onramp_avaiable_with_payment_methods">Disponible avec %s</string>
<string name="onramp_choose_provider_title_hint">L\'achat de crypto-monnaies sur Tangem est assuré par des fournisseurs tiers selon leurs conditions.</string>
<string name="onramp_country_search">Recherche par pays</string>
<string name="onramp_country_unavailable">Indisponible</string>
<string name="onramp_currency_other">Autres devises</string>

View file

@ -51,6 +51,8 @@
<string name="balance_hidden_do_not_show_button">Больше не показывать</string>
<string name="balance_hidden_got_it_button">Понятно</string>
<string name="balance_hidden_title">Балансы скрыты</string>
<string name="beta_mode_warning_message">Согласно информации от разработчиков сети, токены Kaspa находятся в режиме бета. Следите за обновлениями!</string>
<string name="beta_mode_warning_title">Бета режим</string>
<string name="biometric_lockout_permanent_warning_description">Пожалуйста, отсканируйте карту или кольцо</string>
<string name="biometric_lockout_warning_description">Пожалуйста, попробуйте снова через 30 секунд или отсканируйте карту или кольцо</string>
<string name="biometric_lockout_warning_title">Слишком много попыток</string>
@ -227,7 +229,7 @@
<string name="custom_token_network_input_not_selected">Не выбрано</string>
<string name="custom_token_network_input_title">Сеть</string>
<string name="custom_token_network_selector_title">Сеть</string>
<string name="custom_token_subtitle">Вы можете добавить токен в ручную, если он не поддерживается Tangem</string>
<string name="custom_token_subtitle">Вы можете добавить токен вручную, если он не поддерживается Tangem</string>
<string name="custom_token_token_symbol_input_placeholder">Например, USDC</string>
<string name="custom_token_token_symbol_input_title">Символ</string>
<string name="custom_token_token_symbol_input_title_old">Символ токена</string>

View file

@ -51,6 +51,8 @@
<string name="balance_hidden_do_not_show_button">Don\'t show again</string>
<string name="balance_hidden_got_it_button">Got it</string>
<string name="balance_hidden_title">Balances are hidden</string>
<string name="beta_mode_warning_message">According to the blockchain developers, Kaspa tokens are currently in beta. Stay tuned for updates!</string>
<string name="beta_mode_warning_title">Beta Mode</string>
<string name="biometric_lockout_permanent_warning_description">Please scan the card or ring</string>
<string name="biometric_lockout_warning_description">Please try again in 30 seconds or scan the card or ring</string>
<string name="biometric_lockout_warning_title">Too many attempts</string>

View file

@ -74,6 +74,16 @@ sealed class TokenScreenAnalyticsEvent(
params = mapOf("Token" to tokenSymbol, "Blockchain" to blockchain),
)
class RevealTryAgain(tokenSymbol: String, blockchain: String) : TokenScreenAnalyticsEvent(
event = "Button - Reveal Try Again",
params = mapOf("Token" to tokenSymbol, "Blockchain" to blockchain),
)
class RevealCancel(tokenSymbol: String, blockchain: String) : TokenScreenAnalyticsEvent(
event = "Button - Reveal Cancel",
params = mapOf("Token" to tokenSymbol, "Blockchain" to blockchain),
)
data class StakingClicked(val token: String) : TokenScreenAnalyticsEvent(
event = "Staking Clicked",
params = mapOf("Token" to token),

View file

@ -57,4 +57,6 @@ sealed class CryptoCurrencyWarning {
val amount: BigDecimal,
val maxAmount: BigDecimal?,
) : CryptoCurrencyWarning()
data object TokensInBetaWarning : CryptoCurrencyWarning()
}

View file

@ -173,6 +173,7 @@ class GetCurrencyWarningsUseCase(
when {
tokenStatus != null && coinStatus != null -> {
buildList {
getIsBetaTokensWarning(tokenStatus.currency)?.let(::add)
getFeeWarning(
userWalletId = userWalletId,
coinStatus = coinStatus,
@ -219,6 +220,15 @@ class GetCurrencyWarningsUseCase(
}
}
private fun getIsBetaTokensWarning(currency: CryptoCurrency): CryptoCurrencyWarning? {
val isTokenBetaFunctionality = BlockchainUtils.isTokenBetaFunctionality(currency.network.id.value)
return if (currency is CryptoCurrency.Token && isTokenBetaFunctionality) {
CryptoCurrencyWarning.TokensInBetaWarning
} else {
null
}
}
private suspend fun constructTokenBalanceNotEnoughWarning(
userWalletId: UserWalletId,
tokenStatus: CryptoCurrencyStatus,

View file

@ -24,6 +24,7 @@ dependencies {
implementation(deps.androidx.appCompat)
implementation(deps.androidx.fragment.ktx)
implementation(deps.lifecycle.viewModel.ktx)
implementation(deps.androidx.activity.compose)
/** Compose */
implementation(deps.compose.foundation)

View file

@ -2,6 +2,7 @@ package com.tangem.feature.referral.ui
import android.content.res.Configuration
import android.content.res.Resources
import androidx.activity.compose.BackHandler
import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
@ -52,6 +53,8 @@ internal fun ReferralScreen(stateHolder: ReferralStateHolder) {
val snackbarHostState = remember(::SnackbarHostState)
BackHandler(onBack = stateHolder.headerState.onBackClicked)
Scaffold(
topBar = {
AppBarWithBackButton(

View file

@ -23,5 +23,10 @@ internal open class TokenDetailsAnalyticsEvent(
event = "Not Enough Fee",
params = currency.toAnalyticsParams(),
)
class Reveal(currency: CryptoCurrency) : Notice(
event = "Reveal Transaction",
params = currency.toAnalyticsParams(),
)
}
}

View file

@ -41,6 +41,9 @@ internal class TokenDetailsNotificationsAnalyticsSender(
programName = TokenSwapPromoAnalyticsEvent.ProgramName.OKX,
source = AnalyticsParam.ScreensSources.Token,
)
is TokenDetailsNotification.KaspaIncompleteTransactionWarning -> TokenDetailsAnalyticsEvent.Notice.Reveal(
currency = cryptoCurrency,
)
is TokenDetailsNotification.NetworksUnreachable,
is TokenDetailsNotification.ExistentialDeposit,
is TokenDetailsNotification.NetworksNoAccount,
@ -48,9 +51,9 @@ internal class TokenDetailsNotificationsAnalyticsSender(
is TokenDetailsNotification.RentInfo,
is TokenDetailsNotification.NetworkShutdown,
is TokenDetailsNotification.HederaAssociateWarning,
is TokenDetailsNotification.KaspaIncompleteTransactionWarning,
is TokenDetailsNotification.KoinosMana,
is TokenDetailsNotification.MigrationMaticToPol,
is TokenDetailsNotification.TokensInBeta,
-> null
}
}

View file

@ -5,6 +5,6 @@ import com.tangem.domain.tokens.model.CryptoCurrency
internal fun CryptoCurrency.toAnalyticsParams(): Map<String, String> {
return mapOf(
"Token" to symbol,
"Blockchain" to network.currencySymbol,
"Blockchain" to network.name,
)
}

View file

@ -229,4 +229,9 @@ internal sealed class TokenDetailsNotification(val config: NotificationConfig) {
title = resourceReference(id = R.string.warning_matic_migration_title),
subtitle = resourceReference(id = R.string.warning_matic_migration_message),
)
data object TokensInBeta : Warning(
title = resourceReference(id = R.string.beta_mode_warning_title),
subtitle = resourceReference(id = R.string.beta_mode_warning_message),
)
}

View file

@ -135,6 +135,7 @@ internal class TokenDetailsNotificationConverter(
},
)
is CryptoCurrencyWarning.MigrationMaticToPol -> MigrationMaticToPol
is CryptoCurrencyWarning.TokensInBetaWarning -> TokensInBeta
}
}

View file

@ -825,6 +825,12 @@ internal class TokenDetailsViewModel @Inject constructor(
}
override fun onRetryIncompleteTransactionClick() {
analyticsEventsHandler.send(
TokenScreenAnalyticsEvent.RevealTryAgain(
tokenSymbol = cryptoCurrency.symbol,
blockchain = cryptoCurrency.network.name,
),
)
viewModelScope.launch {
retryIncompleteTransactionUseCase(
userWalletId = userWalletId,
@ -860,6 +866,12 @@ internal class TokenDetailsViewModel @Inject constructor(
}
override fun onDismissIncompleteTransactionClick() {
analyticsEventsHandler.send(
TokenScreenAnalyticsEvent.RevealCancel(
tokenSymbol = cryptoCurrency.symbol,
blockchain = cryptoCurrency.network.name,
),
)
viewModelScope.launch {
internalUiState.value = stateFactory.getStateWithDismissIncompleteTransactionConfirmDialog()
}

View file

@ -141,4 +141,9 @@ object BlockchainUtils {
private fun getNetworkNameWithoutTestnet(blockchain: Blockchain): String {
return blockchain.getNetworkName().replace(oldValue = " Testnet", newValue = "")
}
fun isTokenBetaFunctionality(blockchainId: String): Boolean {
val blockchain = Blockchain.fromId(blockchainId)
return blockchain == Blockchain.Kaspa
}
}