diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/markets/models/response/TokenMarketInfoResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/markets/models/response/TokenMarketInfoResponse.kt index 68c54776fa..fb8f19935b 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/markets/models/response/TokenMarketInfoResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/markets/models/response/TokenMarketInfoResponse.kt @@ -104,8 +104,8 @@ data class TokenMarketInfoResponse( val marketCap: BigDecimal?, @Json(name = "volume_24h") val volume24h: BigDecimal?, - @Json(name = "total_supply") - val totalSupply: BigDecimal?, + @Json(name = "max_supply") + val maxSupply: BigDecimal?, @Json(name = "fully_diluted_valuation") val fullyDilutedValuation: BigDecimal?, ) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 05775e44ca..1d3513aa6e 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -414,7 +414,8 @@ Position im Krypto-Rating zwischen allen Coins basierend auf der Marktkapitalisierung Marktbewertung Maximale Versorgung - Leer + Die maximale Anzahl von Coins oder Tokens, die jemals für eine bestimmte Kryptowährung existieren können + Maximale Versorgung Metriken Offizielle Links Preisleistung @@ -700,6 +701,7 @@ Mit dem Staking kannst Du %1$s verdienen. Deine Staking-Belohnungen erhältst Du jede Woche. Sicher staken und wöchentliche Belohnungen verdienen. Verdiene Staking-Belohnungen + Aufgrund von Netzwerkproblemen ist Staking derzeit nicht verfügbar. Bitte versuche es später erneut. Beim Staking im %1$s -Netzwerk mit einem neuen Validator werden alle zuvor eingesetzten Kryptos automatisch an diesen Validator übertragen Reinvestiert Deine verdienten Prämien in Deinen Einsatzbetrag und erhöht so den potenziellen Gewinn. Entsperre dein Geld, um es aus dem Staking-Prozess abzuheben. Das Freischalten nimmt %s. diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index 25839b4722..ecb1726923 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -75,8 +75,8 @@ Aprobación Aprobar Atención - Soldo: %s - Soldo + Saldo: %s + Saldo autenticación biométrica biometría Comprar @@ -103,7 +103,7 @@ Activar Activado Error - Intercambie + Intercambiar Explore Explore historial de transacciones Explorador(a) @@ -211,7 +211,7 @@ Gire la pantalla de su dispositivo hacia abajo para ocultar y mostrar rápidamente los saldos %s hashes ID de la tarjeta - Contacta con el equipo de soporte + Contactar con el equipo de soporte Vincular más tarjetas Moneda de la aplicación Girar para ocultar saldos @@ -351,7 +351,7 @@ Mi portafolio Mercado Para generar direcciones para las redes seleccionadas, debe escanear su tarjeta Tangem - Para agregar tokens, abra esta página o toque la barra de búsqueda + Para agregar tokens, abra esta página o pulse sobre la barra de búsqueda Los datos de este apartado proceden de las siguientes redes: %s No se pueden cargar los datos… Sin datos @@ -363,11 +363,11 @@ Sin resultado Seleccione una red Seleccione una billetera - 1 mo - 1 año + 1m + 1a 24h - 3mos - 6mos + 3m + 6m 7d Todo Compradores experimentados @@ -413,6 +413,8 @@ Posición en la clasificación de criptomonedas entre todas las monedas según la capitalización de mercado Evaluación de mercado Suministro máximo + La cantidad máxima de monedas o tokens que pueden existir para una criptomoneda en particular + Suministro máximo Métrica Enlaces oficiales Rendimiento de precios diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 2a9e104e07..17c960b9e2 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -413,6 +413,8 @@ Position dans le classement des crypto-monnaies entre toutes les pièces en fonction de la capitalisation boursière Évaluation du marché Approvisionnement maximal + Le nombre maximal de pièces ou de jetons pouvant exister pour une crypto-monnaie particulière + Approvisionnement maximal Métriques Official links Performance des prix diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index a46b4b69aa..aeed4388a0 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -39,7 +39,7 @@ 試行回数が多すぎます お使いの携帯電話で生体認証が無効になっているため、アプリにウォレットを保存できません。ウォレットを保存するには、携帯電話の設定で生体認証機能を有効にしてください。 バックアップ処理を開始する - 銀行カードまたは銀行口座から + 銀行カードまたはその他の支払い方法を使用する %d カード @@ -101,7 +101,7 @@ 有効にする 有効 エラー - 交換 + スワップ 移動する 取引履歴を調べる エクスプローラー @@ -273,7 +273,7 @@ トークンが見つかりません。別のリクエストをお試しください。 ID: %s 取引IDをコピーしました - ウォレット内の別の通貨から + ポートフォリオ内のアセットをこのトークンと交換する 以下の情報はオプションです。共有したくない場合は消去できます。 どのような機能が不足しているかを教えください。解決できるよう尽力致します。 お持ちのカードについて教えてください @@ -409,6 +409,8 @@ 時価総額に基づくすべてのコイン間の暗号資産評価における位置 市場格付け 最大供給量 + 特定の暗号資産に存在しうるコインまたはトークンの最大数 + 最大供給量 指標 公式リンク 値動き @@ -522,7 +524,7 @@ カメラへのアクセスが拒否されました %3$sネットワーク上の%1$s ( %2$s ) このアドレスには%sのみを送金してください。他のトークンを送信すると、取り返しのつかない損失が発生します。 - QRコードを表示するか、アドレスを共有してください + ウォレットや取引所から資金を送金する 参加する 紹介プログラムに関する情報を読み込めませんでした。しばらくしてからもう一度お試しください。 紹介プログラムに関する情報を読み込めませんでした。エラー コード: %s 。しばらくしてからもう一度お試しください。 @@ -570,7 +572,7 @@ カードをスキャンして設定を変更します。変更はスキャンしたカードにのみ影響し、ウォレットに関連付けられている他のカードには影響しません。 カードを準備してください! 入力したアドレスにすでに含まれています - 手数料額が推奨額の%s倍となっています。カスタム設定が正しいことを再度確認してください。 + 手数料額が推奨額の%s倍となっています。設定を再度確認し、調整してください。 推奨手数料を下回る手数料が指定されたため、取引に遅れが生じる可能性があります。続行しますか? 理由: %1$s \nコード: %2$s 取引は完了していません @@ -605,7 +607,7 @@ 合計が残高を超えています セキュリティリスクを防ぐため、ブロックチェーン上にアカウントを維持するには、少なくとも%s の残高が必要です。この金額は残高に残り、引き出すことはできません。 アカウント維持に必要な最低残高 - 手数料額が推奨額の%s倍となっています。カスタム設定が正しいことを再度確認してください。 + 手数料額が推奨額の%s倍となっています。設定を再度確認し、調整してください。 カスタム手数料が高くなっています %1$sネットワークの特殊性により、残高全体を転送する場合の手数料は高くなります。手数料を削減するには、 %2$sを残します。 手数料が高くなっています @@ -690,6 +692,7 @@ ステーキングにより%1$sを獲得できます。ステーキング報酬は毎週受け取れます。 安全にステーキングして、報酬を毎週獲得しましょう ステーキング報酬を獲得 + ネットワークの状態により、現在ステーキングはご利用いただけません。しばらくしてからもう一度お試しください。 新しいバリデーターで%1$sネットワークにステーキングすると、以前にステーキングされた資金はすべてこのバリデーターに自動的に転送されます。 獲得した報酬をステーキングに再投資し、潜在的な収益を増やします。 資金をステーキングから引き出すには、ロックを解除してください。ロック解除には%sかかります。 @@ -706,14 +709,14 @@ 再投票 自動 手動 - ブロック - + ブロック毎 + 毎日 毎日 - エポック - 時代 - - - + エポック毎 + 時代毎 + 毎時間 + 毎月 + 毎週 報酬 ステーキングはロックされています もっとステーキングする diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 40de1c3f00..dbbe6ece73 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -15,6 +15,7 @@ Токены в сети %1$s не поддерживаются этой картой из-за ограничений прошивки. У вас возникли трудности со сканированием карты? Эта карта не предназначена для работы с этим приложением + Комиссия по-умолчанию Подключите функцию комиссии по умолчанию и при формировании транзакции на отправку средств комиссия будет выставлена автоматически, а экран комиссии пропущен. Вы всегда сможете на него вернуться. Перейдите в настройки, чтобы включить биометрическую аутентификацию в приложении Tangem Включите биометрическую аутентификацию @@ -178,6 +179,7 @@ Адрес контракта Адрес контракта некорректен Пожалуйста, выберите сеть + Этот токен уже добавлен в список Токен уже существует Десятичное число должно быть действительным целым числом, до %d Своя деривация @@ -358,7 +360,7 @@ Невозможно загрузить данные Нет данных Быстрые действия - Искать на маркете + Поиск на рынке Результат Токены с капитализацией меньше 100к USD Показать токены @@ -416,7 +418,9 @@ Рейтинг Позиция в рейтинге криптовалют среди всех монет на основе рыночной капитализации. Рейтинг - Максимальный объем + Макс. объем + Максимальное количество монет или токенов, которое может когда-либо существовать для выбранной криптовалюты + Максимальный объем Метрики Официальные ссылки Динамика цены @@ -424,7 +428,7 @@ Оценка безопасности Социальные Общ. предл. - Максимальное количество монет или токенов, которое может когда-либо существовать для выбранной криптовалюты. + Максимальное количество монет или токенов, которое может когда-либо существовать для выбранной криптовалюты Общее предложение Объем торгов (24ч) Общая сумма криптовалюты, которая была продана за последние 24 часа, показывающая уровень активности и ликвидности на рынке. @@ -536,7 +540,7 @@ Доступ к камере запрещен %1$s (%2$s) в сети %3$s Отправляйте только %s на этот адрес. Использование другой сети может привести к утрате средств. - Переводите средства с другого кошелька или биржи + Переводите средства с любого кошелька или биржи Участвовать Не удалось загрузить информацию по реферальной программе. Пожалуйста, попробуйте позже. Не удалось загрузить информацию по реферальной программе. Код ошибки: %s. Пожалуйста, попробуйте позже. @@ -597,6 +601,7 @@ Сумма Вы можете установить комиссию за транзакцию, изменив значение в поле Satoshi per vByte. Комиссия, которая будет взята за вашу транзакцию. Вы можете выставить своё собственное значение. + Максимальная комиссия Это стоимость, которую вы готовы заплатить за каждую единицу газа. Чем выше цена газа, тем быстрее ваша транзакция будет обработана. (Приоритетная комиссия включена) Приоритетная комиссия Комиссия, которую пользователь может заплатить майнерам или валидаторам за ускорение включения его транзакции в блок. @@ -685,7 +690,7 @@ Минимальное количество Нет вознаграждений к получению Способ вознаграждения - Способ получения вознаграждений за стейкинг. Он может быть автоматическим, при котором вознаграждение само зачисляется вам на адрес или в ручную, когда вознаграждение нужно вывести, создав транзакцию на её получение. + Способ получения вознаграждений за стейкинг. Оно может зачисляться автоматически на ваш адрес или вручную, когда вознаграждение нужно вывести, создав транзакцию на её получение. Период вознагражения Это период, определяющий, когда участники стейкинга получат свои вознаграждения. Вознаграждение для получения: %s @@ -725,14 +730,14 @@ Переголосовать Авто Вручную - Блок - День + За блок + Ежедневно Каждый день - Эпоха - Эра - Час + За эпоху + За эру + Ежечасно Месяц - Неделя + Еженедельно Вознаграждения Стейкинг закрыт Застейкать еще @@ -815,6 +820,7 @@ Операция от: %s на: %s + валидатор: %s Попробовать снова Вы отсканировали ту же карту. Для создания twin-кошелька вам необходимо отсканировать карту с номером %d Вы отсканировали не ту twin-карту. Пожалуйста, попробуйте отсканировать другую 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 15a063ac84..ef2696c0e6 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -418,7 +418,8 @@ Рейтинг Позиція в крипторейтингу між усіма монетами на основі ринкової капіталізації Рейтинг - Максимальна пропозиція + Максимальна кількість монет або токенів, яка може коли-небудь існувати для певної криптовалюти + Максимальна пропозиція Метрики Офіційні посилання Цінова ефективність diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 93fba71bd2..210c100c90 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -413,6 +413,8 @@ Position in crypto rating between all coins based on market capitalization Market rating Max supply + The maximum number of coins or tokens that can ever exist for a particular cryptocurrency + Max supply Metrics Official links Price performance @@ -528,7 +530,7 @@ Camera access denied %1$s (%2$s) on %3$s network Send only %s to this address. Sending any other currency will result in its irreversible loss. - Transfer funds from another wallet or exchange + Transfer funds from any wallet or exchange Participate Failed to load the information about the referral program. Please try again later. Failed to load the information about the referral program. Error code: %s. Please try again later. @@ -715,14 +717,14 @@ Revote Auto Manual - Block - Day + Per Block + Daily Daily - Epoch - Era - Hour - Month - Week + Per Epoch + Per Era + Hourly + Monthly + Weekly Rewards Stake locked Stake more @@ -805,6 +807,7 @@ Operation from: %s to: %s + validator: %s Try again You\'ve scanned the same card. To create a twin wallet you need to scan the card with number %d You\'ve scanned wrong twin card. Please try another one diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/sheetscaffold/TangemSheetState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/sheetscaffold/TangemSheetState.kt index 64dcea2dcb..17988b6b6f 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/sheetscaffold/TangemSheetState.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/sheetscaffold/TangemSheetState.kt @@ -207,8 +207,8 @@ class TangemSheetState( absVelocityThreshold = 0.5f, ), confirmValueChange = confirmValueChange, - positionalThreshold = { with(density) { 56.dp.toPx() } }, - velocityThreshold = { with(density) { 125.dp.toPx() } }, + positionalThreshold = { with(density) { 156.dp.toPx() } }, + velocityThreshold = { with(density) { 225.dp.toPx() } }, ) internal val offset: Float diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt index 999276faf5..372a8c50f9 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt @@ -25,6 +25,7 @@ fun TangemTheme( dimens: TangemDimens = TangemTheme.dimens, vibratorHapticManager: VibratorHapticManager? = null, snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, + overrideSystemBarColors: Boolean = true, content: @Composable () -> Unit, ) { val themeColors = if (isDark) darkThemeColors() else lightThemeColors() @@ -32,14 +33,18 @@ fun TangemTheme( .also { it.update(themeColors) } val shapes = remember { TangemShapes(dimens) } - val systemUiController = rememberSystemUiController() - SideEffect { - systemUiController.setSystemBarsColor( - color = Color.Transparent, - darkIcons = !isDark, - isNavigationBarContrastEnforced = false, - ) + // we don't want to override system bar colors in case of fragment bottom sheets for example + if (overrideSystemBarColors) { + val systemUiController = rememberSystemUiController() + + SideEffect { + systemUiController.setSystemBarsColor( + color = Color.Transparent, + darkIcons = !isDark, + isNavigationBarContrastEnforced = false, + ) + } } val view = LocalView.current diff --git a/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeBottomSheetFragment.kt b/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeBottomSheetFragment.kt index 75dc4e8a98..c5c4285292 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeBottomSheetFragment.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeBottomSheetFragment.kt @@ -52,7 +52,11 @@ abstract class ComposeBottomSheetFragment : BottomSheetDialogFragment(), Compose override fun getTheme(): Int = R.style.AppTheme_TransparentBottomSheetDialog override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - return createComposeView(inflater.context, requireActivity()) + return createComposeView( + context = inflater.context, + activity = requireActivity(), + overrideSystemBarColors = false, + ) } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { diff --git a/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeScreen.kt b/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeScreen.kt index 5557002b53..c403c5036e 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeScreen.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/screen/ComposeScreen.kt @@ -50,9 +50,14 @@ internal interface ComposeScreen { * Creates a [ComposeView] with the defined content for the Compose screen. * * @param context The context. + * @param overrideSystemBarColors Whether to override the system bar colors to make them transparent. * @return A [ComposeView] instance with the defined screen content. */ -internal fun ComposeScreen.createComposeView(context: Context, activity: Activity): ComposeView { +internal fun ComposeScreen.createComposeView( + context: Context, + activity: Activity, + overrideSystemBarColors: Boolean = true, +): ComposeView { return ComposeView(context).apply { setContent { val appThemeMode by uiDependencies.appThemeModeHolder.appThemeMode @@ -63,6 +68,7 @@ internal fun ComposeScreen.createComposeView(context: Context, activity: Activit windowSize = windowSize, vibratorHapticManager = uiDependencies.vibratorHapticManager, snackbarHostState = uiDependencies.globalSnackbarHostState, + overrideSystemBarColors = overrideSystemBarColors, ) { ScreenContent(modifier = screenModifier) } diff --git a/core/ui/src/main/java/com/tangem/core/ui/utils/BigDecimalFormatter.kt b/core/ui/src/main/java/com/tangem/core/ui/utils/BigDecimalFormatter.kt index e6944920a6..fb78b58f1e 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/utils/BigDecimalFormatter.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/utils/BigDecimalFormatter.kt @@ -5,6 +5,7 @@ import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.utils.StringsSigns.DASH_SIGN import com.tangem.utils.StringsSigns.LOWER_SIGN import com.tangem.utils.StringsSigns.TILDE_SIGN +import com.tangem.utils.extensions.isNotWhitespace import timber.log.Timber import java.math.BigDecimal import java.math.RoundingMode @@ -20,8 +21,6 @@ object BigDecimalFormatter { private const val CAN_BE_LOWER_SIGN = LOWER_SIGN private val FORMAT_THRESHOLD = BigDecimal("0.01") - private const val TEMP_CURRENCY_CODE = "USD" - private val FIAT_FORMAT_THRESHOLD = BigDecimal("0.01") private val CRYPTO_FEE_FORMAT_THRESHOLD = BigDecimal("0.000001") @@ -29,6 +28,12 @@ object BigDecimalFormatter { private const val FIAT_MARKET_EXTENDED_DIGITS = 6 private const val FRACTIONAL_PART_LENGTH_AFTER_LEADING_ZEROES = 4 + private val usdCurrency = Currency.getInstance("USD") + + @Deprecated( + "Use formatCryptoAmount2", + replaceWith = ReplaceWith("formatCryptoAmount2"), + ) fun formatCryptoAmount( cryptoAmount: BigDecimal?, cryptoCurrency: String, @@ -53,6 +58,30 @@ object BigDecimalFormatter { } } + // Migrate to this method from formatCryptoAmount ([REDACTED_TASK_KEY]) + fun formatCryptoAmount2( + cryptoAmount: BigDecimal?, + cryptoCurrency: String, + decimals: Int, + locale: Locale = Locale.getDefault(), + ): String { + if (cryptoAmount == null) return EMPTY_BALANCE_SIGN + + val formatter = NumberFormat.getCurrencyInstance(locale).apply { + currency = usdCurrency + maximumFractionDigits = decimals.coerceAtMost(maximumValue = 8) + minimumFractionDigits = 2 + isGroupingUsed = true + roundingMode = RoundingMode.HALF_UP + } + + return formatter.format(cryptoAmount) + .replaceFiatSymbolWithCrypto( + fiatCurrencySymbol = usdCurrency.symbol, + cryptoCurrencySymbol = cryptoCurrency, + ) + } + fun formatCryptoAmountShorted( cryptoAmount: BigDecimal?, cryptoCurrency: String, @@ -305,7 +334,7 @@ object BigDecimalFormatter { .getOrElse { e -> // Currency code is not valid ISO 4217 code if (e is IllegalArgumentException) { - Currency.getInstance(TEMP_CURRENCY_CODE) + usdCurrency } else { throw e } @@ -316,7 +345,7 @@ object BigDecimalFormatter { * Adds a proper currency sign for the provided formatted [amount] * ex. '10.0k" -> "$10.0k", "string" -> "$string" */ - fun addCurrencySymbolToStringAmount( + private fun addCurrencySymbolToStringAmount( amount: String, fiatCurrencyCode: String, fiatCurrencySymbol: String, @@ -338,6 +367,32 @@ object BigDecimalFormatter { return formatted } + /** + * Adds a proper currency sign for the provided formatted [amount] + * ex. '10.0k" -> "ETH 10.0k", "string" -> "ETH string" + */ + private fun addCryptoCurrencySymbolToStringAmount( + amount: String, + cryptoCurrencySymbol: String, + locale: Locale = Locale.getDefault(), + ): String { + val sampleAmount = BigDecimal.TEN + + val formatter = NumberFormat.getCurrencyInstance(locale).apply { + maximumFractionDigits = 0 + minimumFractionDigits = 0 + currency = usdCurrency + } + + val formatted = formatter.format(sampleAmount) + .replace(sampleAmount.toString(), amount) + + return formatted.replaceFiatSymbolWithCrypto( + fiatCurrencySymbol = usdCurrency.symbol, + cryptoCurrencySymbol = cryptoCurrencySymbol, + ) + } + /** * "123456.6" -> "$123.457K" * "12345.6" -> "$123.046K" @@ -380,6 +435,45 @@ object BigDecimalFormatter { ) } + /** + * "123456.6" -> "ETH 123.457K" + * "12345.6" -> "123.046K ETH" + * Negative amount is not supported + * @param threeDigitsMethod if true, will format the amount always with 3 significant digits + * @param scale the number of digits to the right of the decimal point + */ + fun formatCompactCryptoAmount( + amount: BigDecimal?, + cryptoCurrencySymbol: String, + threeDigitsMethod: Boolean = false, + decimals: Int = 0, + locale: Locale = Locale.getDefault(), + ): String { + if (amount == null) return EMPTY_BALANCE_SIGN + + if (amount < BigDecimal.ONE) { + return formatCryptoAmount2( + cryptoAmount = amount, + cryptoCurrency = cryptoCurrencySymbol, + decimals = decimals, + locale = locale, + ) + } + + val rawAmount = formatCompactAmount( + amount = amount, + locale = locale, + threeDigitsMethod = threeDigitsMethod, + scale = decimals, + ) + + return addCryptoCurrencySymbolToStringAmount( + amount = rawAmount, + cryptoCurrencySymbol = cryptoCurrencySymbol, + locale = locale, + ) + } + /** * "123456.6" -> "123.457K" * "12345.6" -> "123.046K" @@ -413,14 +507,61 @@ object BigDecimalFormatter { return formatter.format(amount.setScale(scale, RoundingMode.HALF_UP)) } else { - val value = amount.setScale(scale, RoundingMode.HALF_UP) + val scaledAmount = amount.setScale(scale, RoundingMode.HALF_UP) + val digitsCount = scaledAmount.longValueExact().toString().count() + val digitsToFormat = 5 - when (digitsCount % 3) { + 0 -> 0 + 1 -> 2 + else -> 1 + } val formatter = CompactDecimalFormat.getInstance( locale, CompactDecimalFormat.CompactStyle.SHORT, - ) + ).apply { + minimumSignificantDigits = 2 + maximumSignificantDigits = digitsToFormat + } - return formatter.format(value) + return formatter.format(amount.setScale(scale, RoundingMode.HALF_UP)) + } + } + + // Replaces fiat currency symbol with crypto currency symbol + // with respect to the position of the symbol and whitespace + private fun String.replaceFiatSymbolWithCrypto(fiatCurrencySymbol: String, cryptoCurrencySymbol: String): String { + val str = this + if (str.isEmpty()) return str + + return buildString { + when { + str.endsWith(fiatCurrencySymbol) -> { + val withoutSymbol = str.dropLast(fiatCurrencySymbol.length) + val last = withoutSymbol.lastOrNull() ?: return cryptoCurrencySymbol + + append(withoutSymbol) + + if (last.isNotWhitespace()) { + append("\u2009") + } + + append(cryptoCurrencySymbol) + } + str.startsWith(fiatCurrencySymbol) -> { + append(cryptoCurrencySymbol) + + val withoutSymbol = str.drop(fiatCurrencySymbol.length) + val first = withoutSymbol.firstOrNull() + ?: return cryptoCurrencySymbol + + if (first.isNotWhitespace()) { + append("\u2009") + } + + append(withoutSymbol) + } + else -> append(str) + } } } diff --git a/core/ui/src/main/java/com/tangem/core/ui/utils/BigDecimalFormatterCompat.kt b/core/ui/src/main/java/com/tangem/core/ui/utils/BigDecimalFormatterCompat.kt deleted file mode 100644 index 9218188bef..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/utils/BigDecimalFormatterCompat.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.tangem.core.ui.utils - -import java.math.BigDecimal -import java.math.RoundingMode -import java.util.Locale - -internal object BigDecimalFormatterCompat { - - /** - * Formats value as [BigDecimalFormatter.formatCompactFiatAmount] does using only "T","B","M","K" suffixes - * Used for < API24 compatibility - */ - @Suppress("MagicNumber", "UnnecessaryParentheses") - fun formatCompactFiatAmountNoLocaleContext( - amount: BigDecimal, - fiatCurrencyCode: String, - fiatCurrencySymbol: String, - locale: Locale = Locale.getDefault(), - ): String { - val formatted = formatCompactAmountNoLocaleContext(amount) - - return BigDecimalFormatter.addCurrencySymbolToStringAmount( - amount = formatted, - fiatCurrencyCode = fiatCurrencyCode, - fiatCurrencySymbol = fiatCurrencySymbol, - locale = locale, - ) - } - - /** - * Formats value as [BigDecimalFormatter.formatCompactAmount] does using only "T","B","M","K" suffixes - * Used for < API24 compatibility - */ - @Suppress("MagicNumber", "UnnecessaryParentheses") - fun formatCompactAmountNoLocaleContext(amount: BigDecimal): String { - val value = amount.setScale(0, RoundingMode.HALF_UP).longValueExact() - - val formatted = when { - value > 1_000_000_000_000L -> { - val trillion = value / 1_000_000_000_000 - val billion = (value % 1_000_000_000_000) / 1_000_000_000 - "$trillion.${billion}T" - } - value > 1_000_000_000L -> { - val billion = value / 1_000_000_000 - val million = (value % 1_000_000_000) / 1_000_000 - "$billion.${million}B" - } - value > 1_000_000L -> { - val million = value / 1_000_000 - val thousand = (value % 1_000_000) / 1_000 - "$million.${thousand}M" - } - value > 1_000L -> { - val thousand = value / 1_000 - "${thousand}K" - } - else -> return value.toString() - } - - return formatted - } -} \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/StringsSigns.kt b/core/utils/src/main/java/com/tangem/utils/StringsSigns.kt index c563b399a8..991f77b883 100644 --- a/core/utils/src/main/java/com/tangem/utils/StringsSigns.kt +++ b/core/utils/src/main/java/com/tangem/utils/StringsSigns.kt @@ -8,5 +8,6 @@ object StringsSigns { const val DASH_SIGN = "—" const val LOWER_SIGN = "<" const val TILDE_SIGN = "~" + const val INFINITY_SIGN = "∞" const val NON_BREAKING_SPACE = '\u00A0' } \ No newline at end of file diff --git a/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt b/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt index 535b4aca6c..77faa385ef 100644 --- a/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt +++ b/data/markets/src/main/java/com/tangem/data/markets/converters/TokenMarketInfoConverter.kt @@ -99,7 +99,7 @@ internal object TokenMarketInfoConverter : Converter "Stake" + UNSTAKE -> "Unstake" + CLAIM_REWARDS -> "Claim Rewards" + RESTAKE_REWARDS -> "Restake Rewards" + WITHDRAW -> "Withdraw" + RESTAKE -> "Restake" + CLAIM_UNSTAKED -> "Claim Unstaked" + UNLOCK_LOCKED -> "Unlock Locked" + STAKE_LOCKED -> "Stake Locked" + VOTE -> "Vote" + REVOKE -> "Revoke" + VOTE_LOCKED -> "Vote Locked" + REVOTE -> "Revote" + REBOND -> "Rebond" + MIGRATE -> "Migrate" + UNKNOWN -> "Unknown" + } + } } \ No newline at end of file diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/MetricsConverter.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/MetricsConverter.kt index 3501ff40f5..48b3217b3d 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/MetricsConverter.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/MetricsConverter.kt @@ -18,6 +18,7 @@ import java.math.BigDecimal @Stable internal class MetricsConverter( private val appCurrency: Provider, + private val tokenSymbol: String, private val onInfoClick: (InfoBottomSheetContent) -> Unit, ) : Converter { @@ -99,12 +100,12 @@ internal class MetricsConverter( }, ), InfoPointUM( - title = resourceReference(R.string.markets_token_details_total_supply), - value = totalSupply.formatAmount(crypto = true), + title = resourceReference(R.string.markets_token_details_max_supply), + value = maxSupply.formatMaxSupply(), onInfoClick = { onInfoClick( InfoBottomSheetContent( - title = resourceReference(R.string.markets_token_details_total_supply_full), + title = resourceReference(R.string.markets_token_details_max_supply_full), body = resourceReference(R.string.markets_token_details_total_supply_description), ), ) @@ -115,13 +116,26 @@ internal class MetricsConverter( } } + private fun BigDecimal?.formatMaxSupply(): String { + when (this) { + null -> return StringsSigns.DASH_SIGN + BigDecimal.ZERO -> return StringsSigns.INFINITY_SIGN + } + + return this.formatAmount(crypto = true) + } + private fun BigDecimal?.formatAmount(crypto: Boolean = false): String { if (this == null) return StringsSigns.DASH_SIGN return if (crypto) { - BigDecimalFormatter.formatCompactAmount(amount = this) + BigDecimalFormatter.formatCompactCryptoAmount( + amount = this, + cryptoCurrencySymbol = tokenSymbol, + ) } else { val currency = appCurrency() + BigDecimalFormatter.formatCompactFiatAmount( amount = this, fiatCurrencyCode = currency.code, diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/TokenMarketInfoConverter.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/TokenMarketInfoConverter.kt index 4f3145408b..8a9b8aa82a 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/TokenMarketInfoConverter.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/model/converters/TokenMarketInfoConverter.kt @@ -12,8 +12,8 @@ import com.tangem.utils.converter.Converter @Stable internal class TokenMarketInfoConverter( - appCurrency: Provider, - onInfoClick: (InfoBottomSheetContent) -> Unit, + private val appCurrency: Provider, + private val onInfoClick: (InfoBottomSheetContent) -> Unit, onLinkClick: (LinksUM.Link) -> Unit, onPricePerformanceIntervalChanged: (PriceChangeInterval) -> Unit, onInsightsIntervalChanged: (PriceChangeInterval) -> Unit, @@ -28,7 +28,6 @@ internal class TokenMarketInfoConverter( @Suppress("UnusedPrivateMember") // TODO second markets iteration private val securityScoreConverter = SecurityScoreConverter(onInfoClick = onInfoClick) - private val metricsConverter = MetricsConverter(appCurrency = appCurrency, onInfoClick = onInfoClick) private val pricePerformanceConverter = PricePerformanceConverter( appCurrency = appCurrency, onIntervalChanged = onPricePerformanceIntervalChanged, @@ -36,6 +35,12 @@ internal class TokenMarketInfoConverter( private val linksConverter = LinksConverter(onLinkClick = onLinkClick) override fun convert(value: TokenMarketInfo): MarketsTokenDetailsUM.InformationBlocks { + val metricsConverter = MetricsConverter( + tokenSymbol = value.symbol, + appCurrency = appCurrency, + onInfoClick = onInfoClick, + ) + return MarketsTokenDetailsUM.InformationBlocks( insights = value.insights?.let { insightsConverter.convert(it) }, securityScore = null, diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/ui/components/LinksBlock.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/ui/components/LinksBlock.kt index de51bd5a8f..2b02fdb118 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/ui/components/LinksBlock.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/details/impl/ui/components/LinksBlock.kt @@ -28,6 +28,7 @@ import kotlinx.collections.immutable.persistentListOf internal fun LinksBlock(state: LinksUM, modifier: Modifier = Modifier) { InformationBlock( modifier = modifier, + contentHorizontalPadding = 0.dp, title = { Text( text = stringResource(id = R.string.markets_token_details_links), @@ -81,7 +82,7 @@ private fun SubBlock( showDivider = !lastBlock, ) { Column( - modifier = Modifier.padding(vertical = TangemTheme.dimens.spacing12), + modifier = Modifier.padding(TangemTheme.dimens.spacing12), verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12), ) { Text( @@ -111,6 +112,7 @@ private fun SubBlock( fun LinksBlockPlaceholder(modifier: Modifier = Modifier) { InformationBlock( modifier = modifier, + contentHorizontalPadding = 0.dp, title = { TextShimmer( modifier = Modifier.fillMaxWidth(), @@ -134,7 +136,7 @@ private fun SubBlockPlaceholder(modifier: Modifier = Modifier, lastBlock: Boolea showDivider = !lastBlock, ) { Column( - modifier = Modifier.padding(vertical = TangemTheme.dimens.spacing12), + modifier = Modifier.padding(TangemTheme.dimens.spacing12), verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12), ) { TextShimmer( diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/AddToPortfolioBSContentUMFactory.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/AddToPortfolioBSContentUMFactory.kt index e0bd92cbdf..a337b02336 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/AddToPortfolioBSContentUMFactory.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/AddToPortfolioBSContentUMFactory.kt @@ -3,6 +3,7 @@ package com.tangem.features.markets.portfolio.impl.model import com.tangem.common.ui.userwallet.converter.UserWalletItemUMConverter import com.tangem.common.ui.userwallet.state.UserWalletItemUM import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent import com.tangem.core.ui.components.rows.model.BlockchainRowUM import com.tangem.domain.markets.TokenMarketInfo import com.tangem.domain.markets.TokenMarketParams @@ -45,47 +46,51 @@ internal class AddToPortfolioBSContentUMFactory( fun create( portfolioData: PortfolioData, portfolioUIData: PortfolioUIData, - selectedWallet: UserWallet, - alreadyAddedNetworks: Set, + selectedWallet: UserWallet?, + alreadyAddedNetworks: Set?, ): TangemBottomSheetConfig { return TangemBottomSheetConfig( isShow = portfolioUIData.portfolioBSVisibilityModel.addToPortfolioBSVisibility, onDismissRequest = { onAddToPortfolioVisibilityChange(false) }, - content = AddToPortfolioBSContentUM( - selectedWallet = selectedWallet.toSelectedUserWalletItemUM(), - selectNetworkUM = SelectNetworkUMConverter( - networksWithToggle = portfolioUIData.addToPortfolioData.associateWithToggle( - userWalletId = selectedWallet.walletId, - alreadyAddedNetworkIds = alreadyAddedNetworks, - ), - alreadyAddedNetworks = alreadyAddedNetworks, - onNetworkSwitchClick = onNetworkSwitchClick, - ).convert(value = token), - isScanCardNotificationVisible = portfolioUIData.hasMissedDerivations, - continueButtonEnabled = portfolioUIData.addToPortfolioData.isUserAddedNetworks( - userWalletId = selectedWallet.walletId, - ), - onContinueButtonClick = { - val alreadyAddedNetworkIds = portfolioData.walletsWithCurrencies[selectedWallet].orEmpty() - .map { it.status.currency.network.backendId } - .toSet() - - onContinueClick( - selectedWallet.walletId, - portfolioUIData.addToPortfolioData.getAddedNetworks( + content = if (selectedWallet != null && alreadyAddedNetworks != null) { + AddToPortfolioBSContentUM( + selectedWallet = selectedWallet.toSelectedUserWalletItemUM(), + selectNetworkUM = SelectNetworkUMConverter( + networksWithToggle = portfolioUIData.addToPortfolioData.associateWithToggle( userWalletId = selectedWallet.walletId, - alreadyAddedNetworkIds = alreadyAddedNetworkIds, + alreadyAddedNetworkIds = alreadyAddedNetworks, ), - ) - }, - walletSelectorConfig = crateWalletSelectorBSConfig( - isShow = portfolioUIData.portfolioBSVisibilityModel.walletSelectorBSVisibility, - portfolioData = portfolioData, - selectedWalletId = selectedWallet.walletId, - ), - isWalletBlockVisible = portfolioData.walletsWithCurrencies - .filterKeys(UserWallet::isMultiCurrency).size > 1, - ), + alreadyAddedNetworks = alreadyAddedNetworks, + onNetworkSwitchClick = onNetworkSwitchClick, + ).convert(value = token), + isScanCardNotificationVisible = portfolioUIData.hasMissedDerivations, + continueButtonEnabled = portfolioUIData.addToPortfolioData.isUserAddedNetworks( + userWalletId = selectedWallet.walletId, + ), + onContinueButtonClick = { + val alreadyAddedNetworkIds = portfolioData.walletsWithCurrencies[selectedWallet].orEmpty() + .map { it.status.currency.network.backendId } + .toSet() + + onContinueClick( + selectedWallet.walletId, + portfolioUIData.addToPortfolioData.getAddedNetworks( + userWalletId = selectedWallet.walletId, + alreadyAddedNetworkIds = alreadyAddedNetworkIds, + ), + ) + }, + walletSelectorConfig = crateWalletSelectorBSConfig( + isShow = portfolioUIData.portfolioBSVisibilityModel.walletSelectorBSVisibility, + portfolioData = portfolioData, + selectedWalletId = selectedWallet.walletId, + ), + isWalletBlockVisible = portfolioData.walletsWithCurrencies + .filterKeys(UserWallet::isMultiCurrency).size > 1, + ) + } else { + TangemBottomSheetConfigContent.Empty + }, ) } diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MyPortfolioUMFactory.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MyPortfolioUMFactory.kt index 83af1ca3c2..3fbf58975e 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MyPortfolioUMFactory.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/MyPortfolioUMFactory.kt @@ -30,9 +30,8 @@ internal class MyPortfolioUMFactory( fun create(portfolioData: PortfolioData, portfolioUIData: PortfolioUIData): MyPortfolioUM { val addToPortfolioData = portfolioUIData.addToPortfolioData - val hasAvailableNetworks = addToPortfolioData.availableNetworks?.isEmpty() == true - val isOnlySingleWalletsAdded = portfolioData.walletsWithCurrencies.keys.all { !it.isMultiCurrency } - if (hasAvailableNetworks || isOnlySingleWalletsAdded) return MyPortfolioUM.Unavailable + val isOnlyUnavailableNetworks = addToPortfolioData.availableNetworks?.isEmpty() == true + if (isOnlyUnavailableNetworks) return MyPortfolioUM.Unavailable val walletsWithCurrencies = if (addToPortfolioData.availableNetworks == null) { portfolioData.walletsWithCurrencies @@ -79,16 +78,13 @@ internal class MyPortfolioUMFactory( val selectedWallet = portfolioData.walletsWithCurrencies.keys .firstOrNull { it.walletId == portfolioUIData.selectedWalletId } ?: portfolioData.walletsWithCurrencies.keys.firstOrNull { it.isMultiCurrency } - ?: error("walletsWithCurrencies don't contain selected wallet or any multi-currency wallet") val availableNetworks = portfolioUIData.addToPortfolioData.availableNetworks.orEmpty() - val alreadyAddedNetworks = requireNotNull( - value = portfolioData.walletsWithCurrencies.filterAvailableNetworks(availableNetworks)[selectedWallet], - lazyMessage = { "walletsWithCurrencies don't contain ${selectedWallet.walletId}" }, - ) - .map { it.status.currency.network.backendId } - .toSet() + val alreadyAddedNetworks = portfolioData.walletsWithCurrencies + .filterAvailableNetworks(availableNetworks)[selectedWallet] + ?.map { it.status.currency.network.backendId } + ?.toSet() return addToPortfolioBSContentUMFactory.create( portfolioData = portfolioData, diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt index 27d67bf6aa..30b7a01af8 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/analytics/StakingAnalyticsEvents.kt @@ -3,6 +3,7 @@ package com.tangem.features.staking.impl.analytics import com.tangem.core.analytics.models.AnalyticsEvent import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.staking.model.stakekit.action.StakingActionType +import com.tangem.domain.staking.model.stakekit.action.StakingActionType.Companion.asAnalyticName internal sealed class StakingAnalyticsEvents( event: String, @@ -47,7 +48,7 @@ internal sealed class StakingAnalyticsEvents( params = mapOf( AnalyticsParam.TOKEN_PARAM to token, "Validator" to validator, - "Action" to action.type, + "Action" to action.asAnalyticName, ), ) @@ -60,7 +61,7 @@ internal sealed class StakingAnalyticsEvents( params = mapOf( AnalyticsParam.TOKEN_PARAM to token, "Validator" to validator, - "Action" to action.type, + "Action" to action.asAnalyticName, ), ) @@ -143,7 +144,7 @@ internal sealed class StakingAnalyticsEvents( event = "Errors", params = mapOf( AnalyticsParam.TOKEN_PARAM to token, - "ErrorType" to errorType, + AnalyticsParam.ERROR_DESCRIPTION to errorType, ), ) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt index d8b674e7df..aff4cf252f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideIn import androidx.compose.foundation.Canvas -import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -19,7 +18,6 @@ import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material3.* -import androidx.compose.material3.BottomSheetDefaults import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -46,7 +44,8 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.paging.compose.collectAsLazyPagingItems import com.google.accompanist.systemuicontroller.rememberSystemUiController -import com.tangem.core.ui.components.* +import com.tangem.core.ui.components.BottomFade +import com.tangem.core.ui.components.PrimaryButton import com.tangem.core.ui.components.atoms.Hand import com.tangem.core.ui.components.atoms.handComposableComponentHeight import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig @@ -54,6 +53,7 @@ import com.tangem.core.ui.components.bottomsheets.chooseaddress.ChooseAddressBot import com.tangem.core.ui.components.bottomsheets.chooseaddress.ChooseAddressBottomSheetConfig import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBottomSheet import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBottomSheetConfig +import com.tangem.core.ui.components.rememberIsKeyboardVisible import com.tangem.core.ui.components.sheetscaffold.* import com.tangem.core.ui.components.snackbar.CopiedTextSnackbar import com.tangem.core.ui.components.snackbar.TangemSnackbar @@ -468,7 +468,11 @@ private inline fun BaseScaffoldWithMarkets( } BottomSheetScrim( - color = BottomSheetDefaults.ScrimColor, + color = if (state.showMarketsOnboarding) { + Color.Black.copy(alpha = .65f) + } else { + BottomSheetDefaults.ScrimColor + }, visible = bottomSheetState.targetValue == TangemSheetValue.Expanded || state.showMarketsOnboarding, onDismissRequest = { @@ -575,7 +579,7 @@ internal fun MarketsHint(isVisible: Boolean, modifier: Modifier = Modifier) { @Composable private fun MarketsTooltipContent(modifier: Modifier = Modifier) { - val backgroundColor = TangemTheme.colors.background.primary + val backgroundColor = TangemTheme.colors.background.action val cornerRadius = CornerRadius(x = 14.dp.toPx()) val tipDpSize = DpSize(width = 20.dp, height = 8.dp)